在Makefile中的先决条件下使用$@



所有

我只想在像这样的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

相关内容

  • 没有找到相关文章

最新更新