使用eval在Makefile中理解$$$$(dir $$$$ @)时遇到问题

时间:2015-06-20 01:32:32

标签: makefile

Makefile模板如下:

# cc compile template, generate rule for dep, obj: (file, cc[, flags, dir])
define cc_template

$$(call todep,$(1),$(4)): $(1) | $$$$(dir $$$$@)

    @$(2) -I$$(dir $(1)) $(3) -MM $$< -MT "$$(patsubst %.d,%.o,$$@) $$@"> $$@

$$(call toobj,$(1),$(4)): $(1) | $$$$(dir $$$$@)

    @echo + cc $$<

    $(V)$(2) -I$$(dir $(1)) $(3) -c $$< -o $$@

ALLOBJS += $$(call toobj,$(1),$(4))

endef

# compile file: (#files, cc[, flags, dir])
define do_cc_compile

$$(foreach f,$(1),$$(eval $$(call cc_template,$$(f),$(2),$(3),$(4))))

endef

我知道eval会扩展两次,所以我们应该使用另一个$。但为什么我们应该在这里使用$$$$(dir $$$$@)?我试图理解这一点,但我失败了。

1 个答案:

答案 0 :(得分:0)

当make解析文件时,它会扩展。如果它看到$$,则会将其展开为$。因此$$$$将扩展为$$(两美元)。 eval一旦应用,就会再次将其扩展到$。因此,您需要四美元(注意$$$会扩展为$,然后是$(的扩展,或者下一个字符恰好是什么,这会导致错误)