所有
我只想在像这样的Makefile中使用$@作为先决条件
test.v: $(@:%.v=%.tv)
echo $< $@
它假设输出
test.tv test.v
但它只输出
test.v
有什么我错过的吗?
为了从依赖列表中引用目标变量,您首先需要启用二次扩展,然后您可以用$$
而不是$
延迟评估目标和函数,即:
$ cat Makefile
.SECONDEXPANSION:
test.v: $$(patsubst %.v,%.tv,$$@)
echo $@ $<
test.tv:
$ make
echo test.v test.tv
test.v test.tv
请注意,由于静态模式规则的一些语法分析器限制,您不能使用$$(@:%.v=%.tv)
的缩短表示法。
不管怎样,只要有简单的模式规则,你想做的事情是可行的:
$ cat Makefile2
%.v: %.tv
echo $@ $<
%.tv: ;
$ make -f Makefile2 test.v
echo test.v test.tv
test.v test.tv
这将生成一个从.tv
文件中创建.v
文件的通用规则,但需要显式调用目标(因为模式规则不会创建特定的文件来自行构建(。
如果您希望限制允许的文件命名遵循规则,您可以使用静态模式规则:
$ cat Makefile3
test.v: %.v: %.tv
echo $@ $<
test.tv:
$ make -f Makefile3
echo test.v test.tv
test.v test.tv