我有以下gmake目标:
$(GCH_demo): $(PCH_demo) | $$(@D) prebuild_demo
@echo PCH $<
-cp $< $(@D)
$(CXX_demo) $(strip $(CPPFLAGS_demo) $(CXXFLAGS_demo)) -o $@ -c $<
注意 $(@ D):
根据我的理解,我希望扩展这个自动变量,所以在这两种情况下,它都不应该被转义 - 但事实证明,如果我不在前提条件行中逃避美元,它将无法工作。
有什么想法吗?
感谢。
答案 0 :(得分:3)
您正在使用二次扩展(请参阅the manual中的讨论)。
通常在make规则中,自动变量仅在配方中有效。它们在先决条件列表中不可用,因为在解析规则之前会扩展规则的目标和先决条件;任何“正常”变量引用将在make知道目标是什么之前展开,因此在设置自动变量$@
(或其替代形式)之前。
如果启用了辅助扩展,则在解析规则后,先决条件列表将进行第二次次扩展,在第二次扩展中,自动变量$@
将是设置得当。但是,为了确保您的变量引用使其进入第二轮,您必须将其转义,以便在第一轮中不会展开它。
考虑一下:
.SECONDEXPANSION:
all: $(info first=$@) $$(info second=$$@)
@:
当你运行它时,你得到:
first=
second=all
正如所料。