Makefile与命令相互依赖

时间:2016-12-07 15:15:18

标签: bash makefile

我是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个没有输出的文件

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