在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