makefile - 目标特定变量的潜在 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)
现在 :
make
将显示target CFLAGS =
make CFLAGS=-Os
将显示target CFLAGS = -Os
- 但
CFLAGS=-Os make
会显示target CFLAGS =
- 注释第一
disruptor
行 (CFLAGS ?= -O1
) 后,将按预期CFLAGS=-Os make
显示。target CFLAGS = -Os
其他有效的缓解措施:
- 在第一行
export CFLAGS
之后添加disruptor
- 用,或替换
?=
赋值。它们都不会产生“隐式取消导出”的副作用(当然,它也会改变赋值含义,这只是为了测试)。=
:=
+=
我还没有测试过其他变量名,但我认为它不是特定于CFLAGS
.