我有几个具有不同先决条件的目标,但我想为所有目标重用相同的构建规则。
这是我为此任务编写的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
没有目标。请注意,正文内部$($ @)的工作方式与预期一致。
当我调用$($@)
时,我希望$(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'
重复这两行,我想要针对具有不同依赖关系的不同目标的单一构建规则。
答案 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 $^