首页 文章

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

提问于
浏览
6

我在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 回答

  • 5

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

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

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

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

相关问题