Makefile:变量赋值中的奇怪行为

时间:2013-01-01 15:10:29

标签: makefile variable-assignment

考虑这个小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)上测试过。

感谢您的提示!

2 个答案:

答案 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