使用「;在变量“处”;makefile中规则右侧的($@)

使用「;在变量“处”;makefile中规则右侧的($@),makefile,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 如您所见,问题是$^为空

我有几个具有不同先决条件的目标,但我希望对所有目标重复使用相同的构建规则

以下是我为此任务编写的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
b
c
没有目标的原因。请注意,在主体中,$($@)的工作方式与预期的一样

当我调用
maketest1
时,我希望
$($@)
等价于
$(test1)
,当我调用
maketest2
时,我希望
$(test2)
等价于
$(test1)
,因此我的makefile将等价于以下makefile:

test1 := a b
test2 := b c

all: test1 test2

test1: $(test1)
  <build-command>

test2: $(test2)
  <the same build-command>
test1:=ab
test2:=bc
全部:test1 test2
test1:$(test1)
test2:$(test2)

但是我不想对我拥有的每个
testn重复这两行,我想要针对具有不同依赖性的不同目标的单一构建规则。

您的问题非常不清楚,但我会尝试一下。我想这就是你想要的:

all: test1 test2

test1: a b
test2: b c

test1 test2:
    @echo building $@ from $^

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

好了,现在这看起来像是一个

如果您想要的是一条涵盖所有
testn
目标的规则,那么我上面写的就可以了

如果您想要在目标的先决条件列表中展开名称为目标名称的变量(我觉得这是一个寻找问题的模糊解决方案),则可以这样做:

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

你的问题很不清楚,但我想试试看。我想这就是你想要的:

all: test1 test2

test1: a b
test2: b c

test1 test2:
    @echo building $@ from $^

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

好了,现在这看起来像是一个

如果您想要的是一条涵盖所有
testn
目标的规则,那么我上面写的就可以了

如果您想要在目标的先决条件列表中展开名称为目标名称的变量(我觉得这是一个寻找问题的模糊解决方案),则可以这样做:

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

抱歉,如果不清楚,我已经更新了问题,我希望现在更好谢谢,这个神奇的第二次扩展正是我想要的。如果不清楚,我已经更新了问题,我希望现在更好谢谢,这个神奇的第二次扩展正是我想要的