1

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

感谢您的提示!

4

2 回答 2

0

我可以用 GNU Make 3.81 重现该问题,但请注意,它仅在您var在命令行上设置时发生(根据make的术语)。如果var的值来自环境,例如使用以下命令:

var=1234 make test

然后一切正常。这对我来说有点像 make 的错误,特别是考虑到以下公式(根据我对手册第 6.5 和 6.11 节的理解,它应该等同于您原来的 Makefile):

test: var:=$(if $(findstring undefined,$(origin var)),foo,$(var))

test:
        echo $(var)

在所有情况下都能正常工作。

于 2013-01-02T17:27:36.237 回答
0

这确实是 GNU make 的一个错误。这个问题出现在 3.81 甚至 3.82 中。出于某种原因,许多系统仍在使用 3.81(即 2013-oct-27)。奇怪的是,该错误仅存在于 Linux 上。在使用 make 3.81 的 MacOS 上,该错误不会出现。

使用 GIT 提交 ae2ab76fac(GNU make)问题得到解决,现在行为符合预期。

Savannah bug #31743 也有一些有趣的地方,它描述了这个问题。当 Savannah 遭到入侵时,那个人迷路了。错误编号现在分配给其他东西。见http://lists.gnu.org/archive/html/bug-make/2010-12/msg00009.html

于 2013-10-27T19:45:22.217 回答