首页 > 解决方案 > 动态目标中的目标变量

问题描述

我有一些更复杂的 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=,所以似乎没有设置变量。

这甚至可能吗?几天来我一直在努力实现这一目标,但我找不到任何东西。

标签: makefilegnu-make

解决方案


您必须转义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)的参数,并且应转义所有其他变量.


推荐阅读