makefile中的特定于目标的变量&先决条件

时间:2014-03-27 05:38:35

标签: makefile gnu-make

我在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,但我正在做的事情不起作用。

1 个答案:

答案 0 :(得分:5)

我认为这里的问题是,在运行目标之前,不会设置特定于目标的变量(如果您向@echo '$(DEP)'主体添加some-target,那么在第二种情况下,您会看到它是但是第二次扩展是在初始读入阶段之后立即发生的。

我打算说,我真的很惊讶这在第一种情况下是有效的(并推测为什么)然后我把手册拉了一分钟,同时阅读.SECONDEXPANSION我找到following

  

[T]当您发现二次扩展始终发生在该目标的自动变量范围内时,此功能的真正力量才会变得明显。这意味着您可以在第二次扩展期间使用$ @,$ *等变量,它们将具有预期值,就像在配方中一样。你所要做的就是通过逃避$来推迟扩张。此外,显式和隐式(模式)规则都会发生二次扩展。

这完全解释了你的行为。扩展仅查看在目标范围内设置的变量,并且先决条件继承仅在目标评估时发生(因为它取决于目标先决条件)。