相同的规则,不同的先决条件
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 $@
在我的项目中,有两种文件,都是使用相同的命令创建的,但具有先决条件:
%.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 $@