首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态目标中的目标变量

动态目标中的目标变量
EN

Stack Overflow用户
提问于 2020-03-02 21:33:13
回答 2查看 513关注 0票数 2

我有一些更复杂的Makefile,动态生成目标,如下所示:

代码语言:javascript
复制
COMPONENTS = foo bar lipsum

define TEST_template =
  .PHONY: test-$(1)
  test-$(1):
    @echo test
endef
$(foreach cmpnt,$(COMPONENTS),$(eval $(call TEST_template,$(cmpnt))))

但是现在我想在这个目标中添加一个特定于目标的变量。对于非动态目标,这种方法工作得很好:

代码语言:javascript
复制
test: VAR_ONE=1
test:
    @echo "VAR_ONE=$(VAR_ONE)"

但是把这两者结合起来是行不通的

代码语言:javascript
复制
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=,因此似乎没有设置变量。

这有可能吗?几天来,我一直在努力实现这一目标,但我什么也找不到。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-02 22:01:33

您必须转义define中任何不希望被call解释的变量引用。所以它是:

代码语言:javascript
复制
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等)。应该直接引用并转义所有其他变量。

票数 2
EN

Stack Overflow用户

发布于 2020-03-02 22:00:58

你得写

代码语言:javascript
复制
    @echo "test - VAR_ONE=$$(VAR_ONE)"

(注意双$$)。请参阅info make

很重要的一点是,要认识到'eval‘参数被展开了两次;首先是由'eval’函数展开的,然后当它们被解析为makefile语法时,这个展开的结果再次展开。这意味着您可能需要为"$"

提供额外的转义级别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60496979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档