Makefile学习笔记
-
makefile文件本质上是帮助make如何一键编译,进行批处理,makefile文件包含的规则命令使我们不需要繁琐的操作,提高了开发效率。
-
makefile可以根据指定的依赖规则和文件是否有修改来执行命令。常用来编译软件源代码,只需要重新编译修改过的文件,使得编译速度大大加快。
示例一:基本格式
目标:依赖
命令
目标是要生成的结果,依赖是需要的源文件,命令是当目标不存在或者依赖更新时就会执行的语句。注意命令前必须用tab来缩进,不可以用空格。
simv: tb.sv dut.v
vcs -full64 -sverilog tb.sv dut.v
这个例子中,simv 是目标,运行后打算生成该仿真执行文件。tb.sv 和 dut.v 是依赖,执行命令前会先检查 tb.sv 和 dut.v 是否存在,以及是否有修改。当目标不存在或依赖有修改时,则执行命令 vcs -full64 -sverilog tb.sv dut.v 来生成 simv。
示例二:伪目标
有时候目标并不是真实要生成的文件,比如我们要用 Makefile 调用 sim 这个可执行文件来仿真,但 sim 并不是一个目标文件,这种情况我们称之为伪目标PHONY。
sim: simv
./simv -xxx
这个例子中,sim 并不是同级目录下的某个 sim 文件,而只是我们给操作起的一个名字。makefile文件的同级目录下如果有和目标相同名字的文件,那么makefile会去执行该文件,这样可能不是我们要的操作。那么就可以采用伪目标的方式,指定该名称为伪目标,并不是真实的文件,不要调用该文件,而是执行 makefile 中的命令。
我们常常在 Makefile 的开头来用 .PHONY 显式指明伪目标。
.PHONY sim
sim: simv
./simv -xxx
这样,我们在 terminal 里就可以用 make sim 来调用仿真命令。
示例三:默认目标
如果我们只是敲 make(后面不跟目标),那么将调用 Makefile 里的第一个目标。那么我们为了防止出错通常把第一个目标定义成 all(执行完整的流程)或者 help(显示帮助菜单)。我更倾向于后者,可以帮助我们回忆如何使用 Makefile 脚本。
.PHONY help sim
help:
echo "make help"
echo "make simv to compile"
echo "make sim to run simulation"
simv: tb.sv dut.v
vcs -full64 -sverilog tb.sv dut.v
sim:
./simv -xxx
这样,当我们不记得如何使用Makefile的时候,直接敲make就会有使用帮助菜单。另外,我们还可以看到,一个目标后面可以执行多条命令,比如这里的三条echo命令。
那么执行后,得到的结果如下:
echo "make help"
make help
echo "make simv to compile"
make simv to compile
echo "make sim to run simulation"
make sim to run simulation
偶数行总是显示命令,这叫做命令回显,导致阅读困难,可以将回显功能关闭。关闭回显功能即在echo前加@,如下所示:
.PHONY help sim
help:
@echo "make help"
@echo "make simv to compile"
@echo "make sim to run simulation"
simv: tb.sv dut.v
vcs -full64 -sverilog tb.sv dut.v
sim:
./simv -xxx
示例四:文件集中
当源文件比较多,且常需要增减,我们可以把依赖定义成一个变量,放成文件开头,类似 filelist,如下。
tbfile := tb.sv env_pkg.sv test_pkg.sv
rtlfile := dut.v a.v b.v c.v
simv: $(tbfile) $(rtlfile)
vcs -full64 -sverilog $(tbfile) $(rtlfile)
还可以在 Makefile 里调用 shell 命令来帮助生成。如下面的例子:
tbfile := $(shell ls *.sv)
rtlfile := $(shell find rtl -name "*.v")
simv: $(tbfile) ($rtlfile)
vcs -full64 -sverilog $(tbfile) $(rtlfile)
tb和rtl文件写两遍,是不是有点麻烦。我们最好能简化一下。在Makefile中有几个特殊变量,如$@表示目标,$^表示依赖。所以示例七中的命令可以简化成:
simv: $(tbfile) $(rtlfile)
vcs -full64 -sverilog $^

浙公网安备 33010602011771号