考虑这个小Makefile:
test: var ?= foo
test:
echo $(var)
make的文档说?=
分配一个尚未存在的变量
之前分配(未定义)。
但如果通过命令行分配:
make var=1234
将一些随机(ASCII,非ASCII,仅空白)字符而不是1234
打印到终端。
使用=
代替?=
按预期工作但不能在我的版本中使用
大小写,因为它覆盖了从继承的',从调用make导出的赋值。
此外,如果不使用基于目标但全局分配,则输出
如预期的那样。
这些字符序列来自哪里?
在linux gentoo(GNU make v3.82)和deb-wheezy(GNU make v3.81)上测试过。
感谢您的提示!
答案 0 :(得分:0)
我可以使用GNU Make 3.81重现该问题,但请注意,只有在命令行上设置var
时才会出现(根据make
的术语)。如果var
的值来自环境,例如使用以下命令:
var=1234 make test
然后一切正常。这闻起来有点像对我的制造的错误,特别是考虑到以下配方的事实 (根据我对手册第6.5和6.11节的理解应该等同于你原来的Makefile):
test: var:=$(if $(findstring undefined,$(origin var)),foo,$(var))
test:
echo $(var)
适用于所有情况。
答案 1 :(得分:0)
这确实是GNU make的一个错误。问题出现在3.81甚至3.82中。由于某些原因,许多系统仍在使用3.81(即2013-oct-27)。扼杀这个bug只出现在Linux上。在使用make 3.81的MacOS上,错误不会显示出来。
使用GIT提交ae2ab76fac(GNU make),问题得到解决,现在行为正如预期的那样。
还有一些有趣的萨凡纳虫#31743描述了这个问题。当萨凡纳受到损害时,那个人迷路了。现在,错误编号已分配给其他内容。见http://lists.gnu.org/archive/html/bug-make/2010-12/msg00009.html