它能够通过$定义的规则家庭(EVAL $(呼叫)),像这样非常有用:
define SIMPLE_TEMPLATE
foo_$(1):
echo foo $(1)
endef
$(foreach _,A B C,$(eval $(call SIMPLE_TEMPLATE,$_)))
这将创建目标foo_A
,foo_B
和foo_C
。在一个更复杂的模板中,引用参数可以很好地调用名称;即$(message)
而不是$(1)
。事情是这样的:
define SIMPLE_TEMPLATE
MSG := $1
foo_$(MSG):
echo foo $(MSG)
endef
$(foreach _,A B C,$(eval $(call SIMPLE_TEMPLATE,$_)))
这几乎作品。 foo_A
和foo_B
按预期工作,但foo_C
没有。有趣的是,将A B C
更改为A B C D
会导致目标foo_C
开始工作。以下是我如何理解发生了什么事情:每次通过eval
都会为$(MSG)
分配一个值,但直到下一个eval
调用才会分配该值。再说一遍,如果在循环中附加额外的传递,这看起来可以工作。但感觉不对。有没有一种“正确”的方式来做到这一点 - 而无需进行额外的黑客攻击?