Makefile 相同的规则,不同的先决条件

Makefile 相同的规则,不同的先决条件,makefile,gnu-make,Makefile,Gnu Make,在我的项目中,有两种类型的文件,它们都是使用相同的命令创建的,但具有先决条件: %.blvp: lab_bd.act %.ext %.slvp: lab_syn.act %.ext %.blvp %.slvp: $(eval x := $(basename $@)) act2lvp $< $x lvp -sDEv $x.ext $x.prs && touch $@ 我怎样才能从上面得到要进行的先决条件?或者,您是否可以针对这种情况建议一种替代方法

在我的项目中,有两种类型的文件,它们都是使用相同的命令创建的,但具有先决条件:

%.blvp: lab_bd.act %.ext
%.slvp: lab_syn.act %.ext

%.blvp %.slvp:
    $(eval x := $(basename $@))
    act2lvp $< $x
    lvp -sDEv $x.ext $x.prs && touch $@

我怎样才能从上面得到要进行的先决条件?或者,您是否可以针对这种情况建议一种替代方法?

模式规则不会以这种方式组合,但您可以通过以下方法获得相同的效果:

另外,您可以通过以下方式省去一些麻烦:

编辑:我忽略了重建*.act文件的任务。我们可以添加$ACT作为前提条件,如果我们使用:


我要明确一点:你的前两条线不是行动计划。模式规则必须有一个配方,否则将被解释为删除该模式规则。还要注意:在配方中使用eval或shell通常是一种反模式。无论你想做什么,这几乎都不是最好的方法。我怀疑basename不是最好的方法。$*这正是我想要解决的问题。非常感谢。但是,使用此设置,*.act文件实际上是否不再依赖?如果其中一个文件发生更改,是否将进行重新编译?如何使用通配符定义这些变量?是否有方法执行%.xyz:FILE=%.abc?
$ make xyz.slvp
act2lvp  xyz
Usage: /usr/local/cad/bin/act2lvp  <actfile> <processname>
makefile:17: recipe for target 'xyz.slvp' failed
make: *** [xyz.slvp] Error 1
%.blvp: ACT=lab_bd.act
%.slvp: ACT=lab_syn.act

%.blvp %.slvp : %.ext
    $(eval x := $(basename $@))
     act2lvp $(ACT) $x
     lvp -sDEv $x.ext $x.prs && touch $@
%.blvp %.slvp : %.ext
     act2lvp $(ACT) $*
     lvp -sDEv $*.ext $*.prs && touch $@
.SECONDEXPANSION:
%.blvp %.slvp : %.ext $$(ACT)
     act2lvp $(ACT) $*
     lvp -sDEv $*.ext $*.prs && touch $@