我是makefile的新手,我试图编写一个执行多个命令的新手。每个命令输出不同的文件,然后传递给下一个文件。
SOURCE=sequencer
ENCODINGS= j a m o r
FILES= $(foreach enc,$(ENCODINGS),$(SOURCE)$(enc))
all: syf boom boog loon proof scapin
syf : $(SOURCE).fsm
for enc in j a m o u r ; do syf -CEV -$$enc $(SOURCE); done
boom : $(foreach file,$(FILES),$(file)_b.vbe)
boog : $(foreach file,$(FILES),$(file)_b.vst)
loon : $(foreach file,$(FILES),$(file)_b_l.vst)
proof : $(foreach file,$(FILES),$(file)_b_l_net.vbe)
scapin : $(foreach file,$(FILES),$(file)_b_l_scan.vst)
#------------------Behavioral Optimization---------------------#
%_b.vbe: %.vbe
@echo " Boolean Optimization -> $@ "
boom -d 50 $* $*_b
#------------------Standard Cell Mapping-----------------------#
%.vst : %.vbe
@echo " Logical Synthesis -> $@ "
boog -x 0 -l paramfile $*
#------------------Netlist Optimization------------------------#
%_l.vst : %.vst paramfile.lax
@echo " Netlist Optimization -> $@ "
loon -x 0 -l paramfile $* $*_l
#------------------Netlist compare-----------------------------#
%_b_l_net.vbe : %_b_l.vst %.vbe
@echo " Formal checking -> $@ "
flatbeh $*_b_l $*_b_l_net
proof -d $* $*_b_l_net
#------------------Scan-path insertion-------------------------#
%_scan.vst : %.vst scan.path
@echo " scan-path insertion -> $@ "
scapin -VRB $* scan $*_scan
clear :
@echo "Erase all the files generated by the makefile"
rm -f *.vbe *.enc *.vst *.xsc
当我第一次运行make all
时,前面的代码会输出以下错误。
make: *** No rule to make target 'sequencerj_b.vbe', needed by 'boom'. Stop.
第一个命令syf
成功执行并输出正确的文件。但是,命令boom
无法运行。但是,当我第二次运行make all
- 没有删除文件时 - makefile成功完成其操作。我错过了什么吗?也许boom
并不等待syf
完成投放。
foo.fsm - > syf
- > fooj.vbe - > boom
- > fooj_b.vbe - > boog
- > fooj_b.vst - > loon
- > fooj_b_l.vst
fooj_b_l.vst - > flatbeh
- > fooj_b_l_net.vbe
fooj_b_l.vst - > scapin
- > fooj_b_l_scan.vst
proof
只比较2个没有输出的文件
答案 0 :(得分:1)
可见错误是由Make不知道这些规则产生的事实引起的。它知道boom
需要sequencerj_b.vbe
,但它不知道如何构建该文件; syf
规则构建它,但Make不知道。
这正是Make旨在解决的问题,但必须编写规则以提供所需信息。
你有一个我无法重现的复杂构建系统,所以这可能需要几次迭代。首先删除“行为优化”之上的所有内容,然后将其替换为::
SOURCE=sequencer
TARGETS := $(patsubst %, $(SOURCE)%_b_l.vst, j a m o r)
all: $(TARGETS)
$(SOURCE)%.vbe: $(SOURCE)%.fsm
syf -CEV -$* $(SOURCE)
尝试一下,并告诉我们它是怎么回事(在对这个答案的评论中)。
答案 1 :(得分:0)
Beta的答案的前两段是现场解决,只有建议的解决方案不起作用。
要解决此问题,请将syf
目标名称替换为实际目标文件名,并相应地更改命令行,以便make
获取有关实际生成的文件的信息 - i。即取代
all: syf boom boog loon proof scapin
syf : $(SOURCE).fsm
for enc in j a m o u r ; do syf -CEV -$$enc $(SOURCE); done
与
# These are the files to be made by the command "syf ...":
syf=$(FILES:=.vbe) $(SOURCE)u.vbe
all: $(syf) boom boog loon proof scapin
$(syf) : $(SOURCE).fsm
syf -CEV -$(patsubst $(SOURCE)%.vbe,%,$@) $(SOURCE)
- 现在规则中指定了所有单个目标文件(sequencerj.vbe sequencera.vbe sequencerm.vbe sequencero.vbe sequencerr.vbe sequenceru.vbe
),syf
命令行只需创建其中一个文件;所需的编码选项由patsubst
function for string substitution,即目标名称提取。 G。 $(patsubst sequencer%.vbe,%,sequencerj.vbe)
生成j
。