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 $^
posted @ 2023-03-26 19:51  咸鱼IC  阅读(315)  评论(0)    收藏  举报