首页 > 解决方案 > 目标特定变量的潜在 Makefile 错误

问题描述

我最近发现使用条件赋值 ( ?=) 设置特定于目标的变量具有取消导出使用相同名称的全局变量的效果。

例如: target: CFLAGS ?= -O2

如果此语句位于 Makefile 中的任何位置,则它与全局变量具有相同的影响unexport CFLAGS

这意味着CFLAGS作为环境变量传递给的Makefile将不会作为环境变量传递给任何子makefile,就好像它从未设置过一样。

这可能是一个make错误吗?我在文档中找不到任何提及此副作用的内容

示例:根Makefile

target:
    $(MAKE) -C $(DIR) target

disruptor: CFLAGS ?= -O1
disruptor: 
    @echo CFLAGS = $(CFLAGS)

然后进入$DIR/Makefile

target:
    @echo target CFLAGS = $(CFLAGS)

现在 :

其他有效的缓解措施:

我还没有测试过其他变量名,但我认为它不是特定于CFLAGS.

标签: makefilegnu-make

解决方案


make我用 GNU 4.0重现了您观察到的行为。我同意您的描述,即该效果似乎就像所讨论的变量已被unexport编辑,并且我确认其他变量名称也观察到相同的效果,包括对 . 没有任何特殊意义的名称make

据我所知,这种效果是无证的,而且是出乎意料的。这似乎与手册相冲突,因为手册将特定于目标的变量值描述为导致创建受影响变量的单独实例,以避免影响全局变量,但我们确实看到全局变量值受到影响。

这可能是一个make错误吗?

在我看来,它确实确实像一个错误。显然对其他人也是如此,因为该问题似乎已被报告


推荐阅读