在我的项目中,有两种文件,两种文件都使用相同的命令创建,但前提条件是:
%.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
我如何获得从上方进行的前提条件?另外,您是否会建议这种情况的替代方法?
答案 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 $@