Makefile 动态目标中的目标变量
我有一个更复杂的Makefile,动态生成的目标如下:Makefile 动态目标中的目标变量,makefile,gnu-make,Makefile,Gnu Make,我有一个更复杂的Makefile,动态生成的目标如下: COMPONENTS = foo bar lipsum define TEST_template = .PHONY: test-$(1) test-$(1): @echo test endef $(foreach cmpnt,$(COMPONENTS),$(eval $(call TEST_template,$(cmpnt)))) 但是现在我想给这个目标添加一个特定于目标的变量。对于非动态目标,这非常有效: test:
COMPONENTS = foo bar lipsum
define TEST_template =
.PHONY: test-$(1)
test-$(1):
@echo test
endef
$(foreach cmpnt,$(COMPONENTS),$(eval $(call TEST_template,$(cmpnt))))
但是现在我想给这个目标添加一个特定于目标的变量。对于非动态目标,这非常有效:
test: VAR_ONE=1
test:
@echo "VAR_ONE=$(VAR_ONE)"
但将这两者结合起来是行不通的
COMPONENTS = foo bar lipsum
define TEST_template =
.PHONY: test2-$(1)
test2-$(1): VAR_ONE=1
test2-$(1):
@echo "test - VAR_ONE=$(VAR_ONE)"
endef
$(foreach cmpnt,$(COMPONENTS),$(eval $(call TEST_template,$(cmpnt))))
现在运行maketest2foo
返回test-VAR\uone=
,因此似乎没有设置变量
这可能吗?几天来,我一直在努力实现这一目标,但我什么也找不到。你必须写作
@echo "test - VAR_ONE=$$(VAR_ONE)"
(注意双精度$$
)。请参见信息制作
重要的是要认识到“eval”的论点是扩展的
两次;首先通过“eval”函数,然后在将扩展结果解析为makefile语法时再次展开。
这意味着您可能需要为“$”提供额外的转义级别
您必须转义
define
中不希望被调用解释的任何变量引用。所以它是:
define TEST_template =
.PHONY: test2-$(1)
test2-$(1): VAR_ONE=1
test2-$(1):
@echo "test - VAR_ONE=$$(VAR_ONE)"
endef
一个很好的经验法则(尽管与任何事物一样,也有例外)是,当定义要与调用
/求值
对一起使用的变量时,应直接引用调用
的参数(例如,$1
,$2
等),并应转义所有其他变量