我有一些更复杂的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: 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))))现在运行make test2-foo将返回test - VAR_ONE=,因此似乎没有设置变量。
这有可能吗?几天来,我一直在努力实现这一目标,但我什么也找不到。
发布于 2020-03-02 22:01:33
您必须转义define中任何不希望被call解释的变量引用。所以它是:
define TEST_template =
.PHONY: test2-$(1)
test2-$(1): VAR_ONE=1
test2-$(1):
@echo "test - VAR_ONE=$$(VAR_ONE)"
endef一个很好的经验法则(尽管与任何情况一样,也有例外)是,当定义一个变量与call/eval对一起使用时,call的参数(例如$1、$2等)。应该直接引用并转义所有其他变量。
发布于 2020-03-02 22:00:58
你得写
@echo "test - VAR_ONE=$$(VAR_ONE)"(注意双$$)。请参阅info make
很重要的一点是,要认识到'eval‘参数被展开了两次;首先是由'eval’函数展开的,然后当它们被解析为makefile语法时,这个展开的结果再次展开。这意味着您可能需要为"$"
提供额外的转义级别。
https://stackoverflow.com/questions/60496979
复制相似问题