我在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以将变量设置为" parent"目标:
debug: DEP := debug-dep
debug: some-target
.SECONDEXPANSION:
some-target: $$(DEP)
@echo $^
debug-dep:
并且make debug
我得到一个空白行。
这似乎与目标特定变量的记录行为相矛盾。有什么东西我不见了吗?
这有点类似make: Using target specific variables in prerequisites,但我正在做的事情不起作用。
答案 0 :(得分:5)
我认为这里的问题是,在运行目标之前,不会设置特定于目标的变量(如果您向@echo '$(DEP)'
主体添加some-target
,那么在第二种情况下,您会看到它是但是第二次扩展是在初始读入阶段之后立即发生的。
我打算说,我真的很惊讶这在第一种情况下是有效的(并推测为什么)然后我把手册拉了一分钟,同时阅读.SECONDEXPANSION
我找到following:
[T]当您发现二次扩展始终发生在该目标的自动变量范围内时,此功能的真正力量才会变得明显。这意味着您可以在第二次扩展期间使用$ @,$ *等变量,它们将具有预期值,就像在配方中一样。你所要做的就是通过逃避$来推迟扩张。此外,显式和隐式(模式)规则都会发生二次扩展。
这完全解释了你的行为。扩展仅查看在目标范围内设置的变量,并且先决条件继承仅在目标评估时发生(因为它取决于目标先决条件)。