目标特定变量的潜在 Makefile 错误

Potential Makefile bug with Target-specific Variable

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

例如: target: CFLAGS ?= -O2

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

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

会不会是 make 错误? 我在 documentation.

中找不到任何提及此副作用的信息

示例:root Makefile

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

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

然后进入$DIR/Makefile:

target:
    @echo target CFLAGS = $(CFLAGS)

现在:

其他有效的缓解措施:

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

我用 GNU make 4.0 重现了您观察到的行为。我同意你的描述,即所讨论的变量似乎已被 unexported 影响,并且我确认其他变量名称也观察到相同的效果,包括对 [ 没有任何特殊意义的名称=10=].

据我所知,此效果未记录在案,而且出乎意料。它似乎与 the manual 冲突,因为手册将特定于目标的变量值描述为导致创建受影响变量的单独实例,以避免影响全局变量,但我们确实看到了全局变量受到影响。

Could it be a make bug ?

在我看来确实像个错误。显然对其他人来说也是如此,因为看起来 the issue has already been reported.