makefile 打印变量_[Makefile] 缩进与空格--记录踩过的坑
今天折騰了好久,就為了debug兩個makefile的bug。雖然最后找到原因了,但是,怎么說呢,用現(xiàn)在流行的話來說,實在是意難平啊!必須寫一篇記錄一下!
第一個問題,是個語法高亮問題。今天觀察到makefile里一些有縮進(jìn)的語句,沒有被正確的語法高亮,比如下面這樣:
看起來沒什么毛病……就是變量B怎么不給我高亮?而正常來說,B應(yīng)該被識別成變量:
正常來說B應(yīng)該被識別成變量問題的原因是在寫非recipe的時候,縮進(jìn)應(yīng)該使用空格而非TAB。在寫makefile中的recipe時,因為實際上我們寫的是希望shell執(zhí)行的語句,所以使用的是shell syntax。而make識別recipe的方式就是縮進(jìn)使用TAB。而其他時候,比如上面的例子中,我們并非在寫recipe,這時候syntax應(yīng)該按照makefile風(fēng)格來寫,所以應(yīng)當(dāng)使用空格來縮進(jìn)。這也正是編輯器對語法高亮識別的方式。
雖然看起來只是語法高亮的問題,但歸根結(jié)底是make如何識別makefile中語句的問題。錯誤的縮進(jìn)可能導(dǎo)致其他問題,比如在下面的例子中:
A我們的本意是打印B的值,但是執(zhí)行結(jié)果卻是打印了一個空行,同時接著一行B=B。這背后的原因,就是B=B這一行使用了TAB來縮進(jìn),因此make把這一行也當(dāng)做recipe的一部分,于是將其交給Shell執(zhí)行。而除此之外,makefile中沒有定義B的值,因此echo打印了一個空行,并且B=B也被打印出來。
Wrong !可以參考GNU Make 5.1節(jié)深入學(xué)習(xí)recipe syntax問題。
第二個問題看起來就更奇怪一些。出錯的代碼類似下面這樣:
A看起來打印的結(jié)果應(yīng)該是B,但實際上執(zhí)行的結(jié)果卻打印了C:
這個問題表面上看非常不可思議。而真正發(fā)現(xiàn)問題之后,也讓人不禁搖頭感嘆。這個問題其實上僅僅因為A=A這一行的結(jié)尾多了一個空格。所以變量A實際上值是"A "。故而ifeq語句走了else分支。
這種問題知道之后覺得是個非常郁悶,但makefile似乎很難避免這樣的問題。因為在makefile中,語句之間沒有分隔符號,同時對字符串變量也不需要加引號。在我們?nèi)粘J褂玫暮芏嗾Z言中,空格是可以自由添加的,本身不代表任何含義。所以習(xí)慣了其他語言語法的我們,面對這種"ghost white space"真的很難發(fā)現(xiàn)。我們只能要求維護(hù)makefile的同事多留心了。
另外,對于變量來說,實際上=前后是允許有空格的,并且會被忽略掉,不會當(dāng)做值的一部分。但行尾的空格則相反。
希望以后都不要再debug makefile問題了……愿這篇文章沒有更新……
總結(jié)
以上是生活随笔為你收集整理的makefile 打印变量_[Makefile] 缩进与空格--记录踩过的坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异地备份与云备份如何选择异地备份与云备份
- 下一篇: 从像素坐标到相机坐标_鱼眼相机模型EUC