2013-01-01 111 views
1

奇怪的行为,认为这种小的Makefile:的Makefile:在变量赋值

test: var ?= foo 

test: 
     echo $(var) 

化妆的文档说?=分配尚未以前(未定义)分配 一个变量。 但如果通过命令行分配:

make var=1234 

一些随机(ASCII,非ASCII,只有空白)字符,而不是1234打印到终端。 使用的=代替?=按预期工作,但不能在我的 情况下,从呼叫拨打使用,因为它会覆盖“继承”,出口任务。 此外,如果不使用目标为基础,但全球的分配,如预期输出 。 这些字符序列从哪里来?

测试在Linux上的Gentoo(GNU使v3.82)和DEB-喘息(GNU使v3.81)。

感谢您的提示!

+0

我无法在OSX 10.7.5上使用GNUMake 3.81重现此操作。 – Beta

+0

在你的例子中'var?= foo'是一个目标,它是一个错字吗? –

+0

不是错字;有条件的分配:http://www.gnu.org/software/make/manual/html_node/Target_002dspecific.html#Target_002dspecific –

回答

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) 

在任何情况下都能正常工作。

0

这的确是让GNU的错误。问题出现在3.81甚至3.82。由于某些原因,许多系统仍在使用3.81(即2013年10月27日)。这个bug只能在Linux上出现。在使用make 3.81的MacOS上,错误没有显示出来。

使用GIT commit ae2ab76fac(GNU make),问题得到解决,现在的行为如预期的那样。

也有一些有趣的萨凡纳与BUG#31743这说明了这个问题。当萨凡纳遭到入侵时,那个人就迷了路。 bug编号现在分配给其他的东西。请参阅http://lists.gnu.org/archive/html/bug-make/2010-12/msg00009.html

+0

非常感谢您提供这些信息。 –