使用「;在变量“处”;makefile中规则右侧的($@)
我有几个具有不同先决条件的目标,但我希望对所有目标重复使用相同的构建规则 以下是我为此任务编写的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 如您所见,问题是$^为空
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 $^
抱歉,如果不清楚,我已经更新了问题,我希望现在更好谢谢,这个神奇的第二次扩展正是我想要的。如果不清楚,我已经更新了问题,我希望现在更好谢谢,这个神奇的第二次扩展正是我想要的