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:

我有一个更复杂的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))))
现在运行
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
等),并应转义所有其他变量