IC-Linux(3) Makefile

1、语法

目标 : 依赖文件

        命令1          #命令必须Tab键开头,命令过长使用反斜杠”\”换行

        命令2

① 目标:即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译,否则会重新编译并更新目标文件。

② 依赖:即目标文件由哪些文件生成。依赖文件有可能此时并不存在,需要新制作,那么这个依赖文件就成了其他规则的目标,该目标也会有他自己的依赖和命令

③ 命令:即通过执行命令,由依赖文件生成目标文件。

④ all:默认情况Makefile文件生成第一个目标文件即完成编译,但可以通过all指定所需生成的目标文件。当你在命令行中运行make all时,make命令会寻找并执行all目标,将依次执行target1、target2和target3依赖文件。

        all : target1 target2 target3

        target1 :

        命令1

        target2 :

        命令2

        target3 :

        命令3

⑤ Makefile并不会关心命令如何执行,仅是去执行所有定义的命令,和直接输入命令行一样。

2、变量

变量在声明时需要给值,使用变量时需在变量名前加"$"符号,当变量多于一个字符时使用"( )"将所有字符括起来。

 ① 变量赋值:

         var := var_value                                       #定义var变量并直接赋值

 ② 取变量值:

        objects := main.o display.o search.o        #定义objects变量并直接赋值

        all : $(objects)                                           #使用objects变量     

                命令

3、函数

3.1 foreach函数

$(foreach <var>,<list>,<text/command>)

① 把list中的单词逐一取出放到参数var这个变量中(即赋值给var),然后再执行text(command)所包含的表达式。

② 每一次text(command)都会返回一个字符串,循环过程中text(command)返回的每个字符串以空格分割(command以;分隔),最后当整个循环结束的时候,由text(command)返回的每个字符串组成的整个字符串将会是 foreach 函数的返回值。

③ foreach中的var参数是一个临时的局部变量,foreach 函数执行完后,参数var的变量将不再起作用,其作用域只在 foreach 函数当中。

        names := a b c d

        files := $(foreach var,$(names),$(var).o)         #循环产生text

        all:

                @echo $(files)                 #输出a.o b.o c.o d.o

              

3.2 if函数

$(if <condition>,<then-part>,<else-part>)

参数condition是 if 表达式,如果其是非空字符串,则condition为真,于是then-part就会被计算;否则else-part会被计算,如果else-part没有被定义,则函数返回空字串符。

        OBJ0 := #空字符

        OBJ1 := foo.c

        OBJ2 := $(if $(OBJ0),$(OBJ1),main.c)

        OBJ3 := $(if $(OBJ1),$(OBJ1),main.c)

        all:

                @echo $(OBJ2)         #输出main.c

                @echo $(OBJ3)         #输出foo.c

3.3 shell函数

$(shell command arguments)

shell 函数不像其它的函数,它的参数就是操作系统Shell的命令,shell函数把执行操作系统命令后的输出作为函数返回,如下为执行Shell语言中的seq命令。

        nums = $(shell seq -f "test%03g" -s ´ ´ 1 1 3)

                #输出宽度3位,间隔为空格的序列 nums = test001 test002 test003              

        seq [选项] 首数 增量 尾数

        -f, --format                         #使用指定格式输出

        -s, --separator                   #使用指定字符串分隔数字(默认为\n)

        -w, --width                         #在列前添加0使得宽度相同(不能与%03g格式同时使用)

4、示例

#使用Makefile实现VCS编译仿真、Verdi波形分析

all : clean comp sim

#----------------------------------------------------------------------------------------------

clean:

        rm -rf csrc simv* *.log *.fsdb novas.* ucli.key verdiLog DVEfiles

#----------------------------------------------------------------------------------------------

comp:

        vcs -sverilog -full64 -notice -debug_all -j8 \

        +plusargs_save +libext+.v+.V+.sv+.svh +memcbk \

        -P ${Verdi_HOME}/share/PLI/VCS/LINUX64/novas.tab \

        ${Verdi_HOME}/share/PLI/VCS/LINUX64/pli.a \

        -cm line+cond+fsm+tgl+branch \

        -timescale=1ns/1ns -f ./file.list \

        -l compile.log

#----------------------------------------------------------------------------------------------

sim:

        ./simv -l sim.log +dump -cm line+cond+fsm+tgl+branch

#----------------------------------------------------------------------------------------------

verdi:

        verdi -f ./file.list  -ssf tb.fsdb -nologo &

参考资料:

Makefile中的函数(各类型函数使用格式与举例)_makefile 函数-CSDN博客

shell基础--- seq命令详解_shell seq-CSDN博客

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值