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

时间:2018-11-27 20:40:04

标签: 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,而.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

我如何获得从上方进行的前提条件?另外,您是否会建议这种情况的替代方法?

1 个答案:

答案 0 :(得分: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 $@

PS ,您可以使用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 $@