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

Same rules, different prerequisites

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

%.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.slvp 使用 lab_syn.act。无论这是哪个文件,都是 act2lvp.

的第一个参数

但是,上面的先决条件不会被带入规则(即,act2lvp $x 被评估;$^ 显然是空的。

$ 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

我怎样才能把上面的先决条件带下来?或者,您会建议针对这种情况的替代方法吗?

模式规则不会以这种方式组合,但您可以使用 pattern-specific variable:

获得相同的效果
%.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 $@

P.S. 你可以使用 automatic variable $*:

来省去一些麻烦
%.blvp %.slvp : %.ext
     act2lvp $(ACT) $*
     lvp -sDEv $*.ext $*.prs && touch $@

编辑: 我忽略了重建 *.act 文件的任务。如果我们使用 Secondary expansion:

,我们可以添加 $(ACT) 作为先决条件
.SECONDEXPANSION:
%.blvp %.slvp : %.ext $$(ACT)
     act2lvp $(ACT) $*
     lvp -sDEv $*.ext $*.prs && touch $@