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] 缩进与空格--记录踩过的坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异地备份与云备份如何选择异地备份与云备份
- 下一篇: 从像素坐标到相机坐标_鱼眼相机模型EUC