日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

makefile 打印变量_[Makefile] 缩进与空格--记录踩过的坑

發布時間:2023/12/4 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 makefile 打印变量_[Makefile] 缩进与空格--记录踩过的坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天折騰了好久,就為了debug兩個makefile的bug。雖然最后找到原因了,但是,怎么說呢,用現在流行的話來說,實在是意難平啊!必須寫一篇記錄一下!

第一個問題,是個語法高亮問題。今天觀察到makefile里一些有縮進的語句,沒有被正確的語法高亮,比如下面這樣:

看起來沒什么毛病……就是變量B怎么不給我高亮?

而正常來說,B應該被識別成變量:

正常來說B應該被識別成變量

問題的原因是在寫非recipe的時候,縮進應該使用空格而非TAB。在寫makefile中的recipe時,因為實際上我們寫的是希望shell執行的語句,所以使用的是shell syntax。而make識別recipe的方式就是縮進使用TAB。而其他時候,比如上面的例子中,我們并非在寫recipe,這時候syntax應該按照makefile風格來寫,所以應當使用空格來縮進。這也正是編輯器對語法高亮識別的方式。

雖然看起來只是語法高亮的問題,但歸根結底是make如何識別makefile中語句的問題。錯誤的縮進可能導致其他問題,比如在下面的例子中:

A

我們的本意是打印B的值,但是執行結果卻是打印了一個空行,同時接著一行B=B。這背后的原因,就是B=B這一行使用了TAB來縮進,因此make把這一行也當做recipe的一部分,于是將其交給Shell執行。而除此之外,makefile中沒有定義B的值,因此echo打印了一個空行,并且B=B也被打印出來。

Wrong !

可以參考GNU Make 5.1節深入學習recipe syntax問題。

第二個問題看起來就更奇怪一些。出錯的代碼類似下面這樣:

A

看起來打印的結果應該是B,但實際上執行的結果卻打印了C:

這個問題表面上看非常不可思議。而真正發現問題之后,也讓人不禁搖頭感嘆。這個問題其實上僅僅因為A=A這一行的結尾多了一個空格。所以變量A實際上值是"A "。故而ifeq語句走了else分支。

這種問題知道之后覺得是個非常郁悶,但makefile似乎很難避免這樣的問題。因為在makefile中,語句之間沒有分隔符號,同時對字符串變量也不需要加引號。在我們日常使用的很多語言中,空格是可以自由添加的,本身不代表任何含義。所以習慣了其他語言語法的我們,面對這種"ghost white space"真的很難發現。我們只能要求維護makefile的同事多留心了。

另外,對于變量來說,實際上=前后是允許有空格的,并且會被忽略掉,不會當做值的一部分。但行尾的空格則相反。

希望以后都不要再debug makefile問題了……愿這篇文章沒有更新……

總結

以上是生活随笔為你收集整理的makefile 打印变量_[Makefile] 缩进与空格--记录踩过的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。