Why do Makefiles exist?
在软件或者芯片的开发中,一般都会用到Makefile,它是一个文本文件,其中包含有关如何编译和链接程序的指令。Makefile 由 make 工具使用,make 工具是一个自动化构建工具,可以根据 Makefile 中的指令自动执行编译和链接过程。
Makefile 在芯片开发中的主要作用包括:
- 自动化编译过程:Makefile 可以指定要编译的源代码文件、编译器和编译选项。这使芯片开发人员能够轻松地编译整个项目,而无需手动执行每个编译步骤。
- 管理依赖关系:Makefile 可以指定源文件和目标文件之间的依赖关系。这使 make 工具能够确定哪些文件需要重新编译,从而优化编译过程并节省时间。
- 链接目标文件:Makefile 可以指定要链接的目标文件、链接器和链接选项。这使芯片开发人员能够轻松地将多个目标文件链接到一个可执行文件或库。
- 执行测试和仿真:Makefile 可以包含执行测试和仿真脚本的规则。这使芯片开发人员能够自动化测试和仿真过程,从而提高开发效率。
从最简单的Makefile开始
Makefile的语法
targets: prerequisites
command
command
command
其中,targets是我们要执行指令的名字,prerequisites是我们要执行指令的前置条件,command是我们要执行的指令。
需要注意的是,command前面需要有tab键(多个tab也可以),但不能使用空格。
hello:
echo "Hello, World"
执行make,结果如下:

可以看到,在执行make后,它会先将我们要执行的指令打印出来,然后再执行该指令。
如果只想看我们的Makefile写的是不是正确,即把我们具体要执行的指令显示出来,而不想执行该指令,可以执行make -n: make hello -n,结果如下:
echo "Hello, World"
对于echo指令,如果只想看执行结果,而不想看回显的结果,可以使用@echo:
hello:
@echo "Hello, World"
如果command前面是空格,那么执行后会提示:
*** missing separator. Stop.
multiple targets
如果有多个targets,比如:
hello1:
echo "Hello1, World"
hello2:
echo "Hello2, World"
我们可以指定执行哪个target:make hello2
如果没有指定,执行了make,那默认就是执行第一个target。
行首行尾的空格
在 Makefile 中,行尾的空格不会被去除,而行首的空格则会被忽略。这意味着如果你需要创建一个包含单个空格的变量,直接在变量赋值时使用空格可能会因行首空格被忽略而导致无法达到预期效果。为了解决这个问题,你可以利用 $(nullstring) 这一特殊变量来确保正确创建含有单个空格的变量。
$(nullstring) 是 Makefile 中的一个内置变量,其值为空字符串。通过在变量赋值时结合使用 $(nullstring) 和空格,可以确保空格被当作有效字符包含在变量值内,而不被当作无意义的行首空格处理掉。
with_spaces = hello # with_spaces has many spaces after "hello"
after = $(with_spaces)there
nullstring =
space = $(nullstring) # Make a variable with a single space.
all:
echo "$(after)"
echo start"$(space)"end
运行结果如下:

multiline
如果一行的内容太长,需要放到多行,那就使用\符号:
some_file:
echo This line is too long, so \
it is broken up into multi

本文探讨了Makefile在软件和芯片开发中的重要性,包括自动化编译、管理依赖、链接目标和执行测试。文章介绍了Makefile的基本结构、变量赋值、条件语句和内置函数,以及如何在实际项目中使用它们以提高开发效率。
最低0.47元/天 解锁文章
1744

被折叠的 条评论
为什么被折叠?



