为什么需要在gmake先决条件中为自动变量转义美元($)?

时间:2013-12-20 05:16:30

标签: makefile gnu-make

我有以下gmake目标:

$(GCH_demo): $(PCH_demo) | $$(@D) prebuild_demo
        @echo PCH $<
        -cp $< $(@D)
        $(CXX_demo) $(strip $(CPPFLAGS_demo) $(CXXFLAGS_demo)) -o $@ -c $<

注意 $(@ D)

  • 在先决条件中,我需要逃避美元,因此: $$(@ D)
  • 在食谱中,不需要逃脱: $(@ D)

根据我的理解,我希望扩展这个自动变量,所以在这两种情况下,它都不应该被转义 - 但事实证明,如果我不在前提条件行中逃避美元,它将无法工作。

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:3)

您正在使用二次扩展(请参阅the manual中的讨论)。

通常在make规则中,自动变量仅在配方中有效。它们在先决条件列表中不可用,因为在解析规则之前会扩展规则的目标和先决条件;任何“正常”变量引用将在make知道目标是什么之前展开,因此在设置自动变量$@(或其替代形式)之前。

如果启用了辅助扩展,则在解析规则后,先决条件列表将进行第二次次扩展,在第二次扩展中,自动变量$@将是设置得当。但是,为了确保您的变量引用使其进入第二轮,您必须将其转义,以便在第一轮中不会展开它。

考虑一下:

.SECONDEXPANSION:
all: $(info first=$@) $$(info second=$$@)
        @:

当你运行它时,你得到:

first=
second=all

正如所料。