摘要:Makefile 是一个名为 GNU-Make 软件所需要的脚本文件,该脚本文件可以指导 Make 软件控制 arm-gcc 等工具链去编译工程文件最终得到可执行文件,几乎所有的 Linux 发行版都内置了 GNU-Make 软件,VScode 等多种 IED 也内置了 Make 程序。
什么是 Makefile
Makefile 是一个名为 GNU-Make 软件所需要的脚本文件,该脚本文件可以指导 Make 软件控制 arm-gcc 等工具链去编译工程文件最终得到可执行文件,几乎所有的 Linux 发行版都内置了 GNU-Make 软件,VScode 等多种 IED 也内置了 Make 程序。
你见到的 xxx.mk 文件或者 Makefile 都统称为 Makefile 脚本文件。
Makefile 脚本文件的语法学习可以参考
https://www.gnu.org/software/make/manual/make.html (GNU make 官方文档)
https://seisman.github.io/how-to-write-makefile/overview.html (跟我一起写 Makefile 陈皓)
Makefile 的规则
Makefile 的规则如下,这里的[TAB]指键盘上的 TAB 按键,不是空格,如果在命令前输入了空格则会造成错误,并且在 Makefile 中 TAB 键不能随意使用:
目标 : 依赖
[TAB]命令
例如:
Hello :
@echo “Hello”
这时执行 make 命令就会输出一条语句”Hello”,Hello 是目标,依赖为空,为了生成目标,需要执行 echo “Hello”语句,从而导致输出 Hello。
例如:假设我们有一个 Hello.c C 语言源文件,需要将其编译不链接为 Hello.o 文件,最后在进行连接,Makefile 内容如下:
Hello.out : Hello.o
gcc -o Hello.out Hello.o
Hello.o : Hello.c
gcc -c -o Hello.o Hello.c
这时执行 make 命令,make 解释器发现目标为“Hello.out”,但是生成 Hello.out 需要 Hello.o,发现目录下找不到“Hello.o”,就向下查找是否有生成 Hello.o 的规则,找到了,发现”Hello.o”依赖于”Hello.c”,在目录下也找到了 Hello.c,就执行语句“gcc -c -o Hello.o Hello.c”生成”Hello.o”,只要编译过程不出错,即可得到”Hello.o”,这时可以执行“gcc -o Hello.out Hello.o“生成”Hello.out”
哪里开始分析?
这里可以用分析一个 C 语言或 Java 语言程序来类比,一般都是根据程序是执行流来进行分析,也就是先找到 main 函数,因为 main 函数是程序的执行入口,Makefile 也有执行入口,在执行 make 命令时,make 解释器默认搜索当前目录下名为“Makefile”的文件,找到后,执行生成第一个目标的命令及生成其依赖所需的命令。
这里选择在 SDK/Targets 目录中 STM32