【问题标题】:Makefile: strange behaviour in variable assignmentMakefile:变量赋值中的奇怪行为
【发布时间】:2012-12-16 04:47:32
【问题描述】:

考虑一下这个小 Makefile:

test:   var ?= foo

test:
        echo $(var)

make 的文档说 ?= 分配了一个尚未被赋值的变量 之前分配(未定义)。 但如果通过命令行分配:

make var=1234

一些随机(ASCII,非ASCII,仅限空白)字符而不是1234 被打印到终端。 使用 = 而不是 ?= 可以按预期工作,但不能在我的 case,因为它覆盖了“继承的”,从调用 make 导出的分配。 此外,如果不使用基于目标但全局分配,则输出 正如预期的那样。 这些字符序列是从哪里来的?

在 linux gentoo (GNU make v3.82) 和 deb-wheezy (GNU make v3.81) 上测试。

感谢您的提示!

【问题讨论】:

  • 我无法在 OSX 10.7.5 上使用 GNUMake 3.81 重现此问题。
  • var ?= foo 在你的例子中是一个目标,它是一个错字吗?
  • 不是错字;条件赋值:gnu.org/software/make/manual/html_node/…
  • 无法在 SUSE 上使用 Make 3.81 重现此问题。

标签: makefile variable-assignment


【解决方案1】:

我可以使用 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)

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 2016-06-01
      • 1970-01-01
      • 2011-04-08
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多