在GNU make中,追加到變量賦值的尾隨註釋阻止後續比較(通過ifeq
)正常工作。變量賦值顛覆比較後的尾隨註釋
這裏的Makefile文件...
A = a
B = b ## trailing comment
C = c
RESULT :=
ifeq "$(A)" "a"
RESULT += a
endif
ifeq "$(B)" "b"
RESULT += b
endif
ifeq "$(C)" "c"
RESULT += c
endif
rule:
@echo RESULT=\"$(RESULT)\"
@echo A=\"$(A)\"
@echo B=\"$(B)\"
@echo C=\"$(C)\"
下面是輸出...
$ make
RESULT=" a c"
A="a"
B="b "
C="c"
正如你可以從RESULT
顯示值看出,ifeq
是受的存在在B
的轉讓中發表評論。回顯變量B
,表明的問題不是評論,而是介入空間。
顯而易見的解決方案是明確strip空白像這樣比較之前...
ifeq "$(strip $(B))" "b"
RESULT += b
endif
然而,這似乎很容易出錯。由於strip
操作是不需要的,除非/直到使用註釋,您可以省略strip
,並且所有內容最初都可以正常工作 - 因此您可能不會永遠記得添加strip
。後來,如果有人在設置變量時添加註釋,則Makefile不再按預期工作。
注意:如this question所示,存在一個密切相關的問題,即使沒有評論,尾隨空格可能會斷開字符串比較。
問:有沒有更多的傻瓜方式來解決這個問題?
只是100%清楚,它不是尾隨的評論是問題。這是評論前的空白。如果你寫了'b = b#尾註釋',所以在註釋字符之前沒有尾部空格,雖然它看起來很醜,但它工作正常。而且,除了不添加尾部空格以外,沒有萬無一失的方法來處理它。大多數體面的編輯器都會有一種檢測並突出顯示尾隨空白的模式,或者甚至在保存時自動將其刪除。使用它。我不會試圖捍衛讓設計師做出的奇怪的決定,只是說很久以前。 – MadScientist 2012-03-31 15:11:12
順便說一下,這裏是一個有趣的線程,OP有完全相同的問題(但要求一個不同的問題):http://old.nabble.com/White-Space-Problems--Again-td22756435.html – nobar 2012-03-31 16:49:22
@ MadScientist:我同意你的建議,使用一個突出尾部空格的編輯器。但僅僅因爲我使用了一個,並不意味着其他人都會這樣做。即使對於不瞭解所有技巧和陷阱的人,我也希望我的Makefiles能夠以合理的方式工作。 – nobar 2012-03-31 21:36:13