在Makefile中使用$@作为先决条件

在Makefile中使用$@作为先决条件,makefile,Makefile,全部 我只想在这样的Makefile中使用$@作为先决条件 test.v: $(@:%.v=%.tv) echo $< $@ 但它只是输出 test.v 我遗漏了什么?为了从依赖项列表中引用目标变量,首先需要启用,然后可以使用$$而不是$延迟对目标和函数的评估,即: $ cat Makefile .SECONDEXPANSION: test.v: $$(patsubst %.v,%.tv,$$@) echo $@ $< test.tv: $ make

全部

我只想在这样的Makefile中使用$@作为先决条件

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