我在GNU make中看到了目标特定变量的意外结果 .
我想要的是设置一个影响依赖项的特定于目标的变量 . 我可以使用 .SECONDEXPANSION
来实现这一目标 .
some-target: DEP := debug-dep
debug: some-target
.SECONDEXPANSION:
some-target: $$(DEP)
@echo $^
debug-dep:
make debug
打印 debug-dep
.
现在我读到make defines target-specific variables for descendant rules:
定义特定于目标的变量时,变量值对此目标的所有先决条件及其所有先决条件等也有效 .
但是当我更改我的makefile以在“父”目标上设置变量时:
debug: DEP := debug-dep
debug: some-target
.SECONDEXPANSION:
some-target: $$(DEP)
@echo $^
debug-dep:
并做 make debug
我得到一个空白行 .
这似乎与目标特定变量的记录行为相矛盾 . 有什么东西我错过了吗?
这有点类似于make: Using target specific variables in prerequisites,但我正在做的不起作用 .
1 回答
我认为这里的问题是在运行目标之前不会设置特定于目标的变量(如果在第二种情况下将
@echo '$(DEP)'
添加到some-target
主体,您将看到它已设置)但是第二次扩展在初始化后立即发生读入阶段 .我要说的是,我真的很惊讶这在第一种情况下起作用(并推测为什么)然后我把手册拉了一分钟,在阅读
.SECONDEXPANSION
时我找到了following:这完全解释了你的行为 . 扩展仅查看在目标范围内设置的变量,并且先决条件继承仅在目标评估时发生(因为它取决于目标先决条件) .