在Makefile中使用$@作为先决条件
全部 我只想在这样的Makefile中使用$@作为先决条件在Makefile中使用$@作为先决条件,makefile,Makefile,全部 我只想在这样的Makefile中使用$@作为先决条件 test.v: $(@:%.v=%.tv) echo $< $@ 但它只是输出 test.v 我遗漏了什么?为了从依赖项列表中引用目标变量,首先需要启用,然后可以使用$$而不是$延迟对目标和函数的评估,即: $ cat Makefile .SECONDEXPANSION: test.v: $$(patsubst %.v,%.tv,$$@) echo $@ $< test.tv: $ make
test.v: $(@:%.v=%.tv)
echo $< $@
但它只是输出
test.v
我遗漏了什么?为了从依赖项列表中引用目标变量,首先需要启用,然后可以使用
$$
而不是$
延迟对目标和函数的评估,即:
$ cat Makefile
.SECONDEXPANSION:
test.v: $$(patsubst %.v,%.tv,$$@)
echo $@ $<
test.tv:
$ make
echo test.v test.tv
test.v test.tv
这将为从.tv
文件中创建.v
文件制定一个通用规则,但需要显式调用目标(因为模式规则不会自行创建特定文件)
如果您希望限制允许的文件命名遵循该规则,您可以使用:
$cat Makefile3
测试电压:%
echo$@$<
test.tv:
$make-f Makefile3
回声测试
测试
事实上,您正在使用$@
。您没有打印的是$您在先决条件上下文中误用了自动变量$@
。仅当您使用$
对其进行转义并将规则置于.SECONDEXPANSION:
伪目标下时,此操作才有效。查看更多
$ cat Makefile
.SECONDEXPANSION:
test.v: $$(patsubst %.v,%.tv,$$@)
echo $@ $<
test.tv:
$ make
echo test.v test.tv
test.v test.tv
$ cat Makefile2
%.v: %.tv
echo $@ $<
%.tv: ;
$ make -f Makefile2 test.v
echo test.v test.tv
test.v test.tv
$ cat Makefile3
test.v: %.v: %.tv
echo $@ $<
test.tv:
$ make -f Makefile3
echo test.v test.tv
test.v test.tv