目标特定变量的潜在 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)
现在:
make
会显示 target CFLAGS =
make CFLAGS=-Os
会显示 target CFLAGS = -Os
- 但是
CFLAGS=-Os make
会显示target CFLAGS =
- 注释第一行
disruptor
后 (CFLAGS ?= -O1
),然后 CFLAGS=-Os make
将按预期显示 target CFLAGS = -Os
。
其他有效的缓解措施:
- 在第一个
disruptor
行 之后添加export CFLAGS
- 将
?=
赋值替换为 =
、:=
或 +=
。 None 其中产生了“implicit unexport”的副作用(当然,它也改变了赋值意义,这只是为了测试)。
我还没有测试其他变量名,但我认为它不是特定于 CFLAGS
。
我用 GNU make
4.0 重现了您观察到的行为。我同意你的描述,即所讨论的变量似乎已被 unexport
ed 影响,并且我确认其他变量名称也观察到相同的效果,包括对 [ 没有任何特殊意义的名称=10=].
据我所知,此效果未记录在案,而且出乎意料。它似乎与 the manual 冲突,因为手册将特定于目标的变量值描述为导致创建受影响变量的单独实例,以避免影响全局变量,但我们确实看到了全局变量受到影响。
Could it be a make
bug ?
在我看来确实像个错误。显然对其他人来说也是如此,因为看起来 the issue has already been reported.
我最近发现
设置特定于目标的变量
使用条件赋值 (?=
)
具有使用相同名称取消导出全局变量的效果。
例如:
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)
现在:
make
会显示target CFLAGS =
make CFLAGS=-Os
会显示target CFLAGS = -Os
- 但是
CFLAGS=-Os make
会显示target CFLAGS =
- 注释第一行
disruptor
后 (CFLAGS ?= -O1
),然后CFLAGS=-Os make
将按预期显示target CFLAGS = -Os
。
其他有效的缓解措施:
- 在第一个
disruptor
行 之后添加 - 将
?=
赋值替换为=
、:=
或+=
。 None 其中产生了“implicit unexport”的副作用(当然,它也改变了赋值意义,这只是为了测试)。
export CFLAGS
我还没有测试其他变量名,但我认为它不是特定于 CFLAGS
。
我用 GNU make
4.0 重现了您观察到的行为。我同意你的描述,即所讨论的变量似乎已被 unexport
ed 影响,并且我确认其他变量名称也观察到相同的效果,包括对 [ 没有任何特殊意义的名称=10=].
据我所知,此效果未记录在案,而且出乎意料。它似乎与 the manual 冲突,因为手册将特定于目标的变量值描述为导致创建受影响变量的单独实例,以避免影响全局变量,但我们确实看到了全局变量受到影响。
Could it be a
make
bug ?
在我看来确实像个错误。显然对其他人来说也是如此,因为看起来 the issue has already been reported.