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 $$$$@)
?我试图理解这一点,但我失败了。
答案 0 :(得分:0)
当make解析文件时,它会扩展。如果它看到$$
,则会将其展开为$
。因此$$$$
将扩展为$$
(两美元)。 eval一旦应用,就会再次将其扩展到$
。因此,您需要四美元(注意$$$
会扩展为$
,然后是$(
的扩展,或者下一个字符恰好是什么,这会导致错误)