使用"在变量" ($ @)在makefile中规则的右侧

时间:2016-07-26 22:57:41

标签: makefile

我有几个具有不同先决条件的目标,但我想为所有目标重用相同的构建规则。

这是我为此任务编写的makefile:

test1 := a b
test2 := b c

all: test1 test2

test1 test2: $($@)
  @echo $@
  @echo $($@)
  @echo $^

如果我运行make,我将获得以下输出:

test1
a b

test2
b c

我的期望是:

test1
a b
a b
test2
b c
b c

正如您所看到的,问题是$ ^是空的。我似乎无法在规则的右侧使用$($@),因为它只是扩展为空,因此$^为空,这就是make的原因甚至没有警告我a bc没有目标。请注意,正文内部$($ @)的工作方式与预期一致。

当我调用$($@)时,我希望$(test1)等同于make test1,当我调用$(test2)时,我希望make test2等同于test1 := a b test2 := b c all: test1 test2 test1: $(test1) <build-command> test2: $(test2) <the same build-command> ,因此我的makefile将等同于跟随makefile:

testn

但我不想为每个'99' > '100'重复这两行,我想要针对具有不同依赖关系的不同目标的单一构建规则。

1 个答案:

答案 0 :(得分:2)

你的问题非常不清楚,但我会采取措施。我想这就是你想要的:

all: test1 test2

test1: a b
test2: b c

test1 test2:
    @echo building $@ from $^

a b c d:
    @echo how to build $@?...

修改

好的,现在开始看起来像XY problem

如果您想要的是一条涵盖所有testn目标的规则,我上面写的内容就会做到。

如果您想要的是扩展名称为目标名称的变量,那么在该目标的先决条件列表中(这对我来说是一个难以理解的搜索问题的解决方案),这样做:

.SECONDEXPANSION:
test1: $$($$@)
    @echo building $@ from $^