韦东山的通用Makefile文件提供了一系列适用于嵌入式系统开发的标准构建脚本,简化了项目管理和编译过程。
本程序的Makefile分为三类:1. 顶层目录下的Makefile;2. 顶层目录下的Makefile.build文件;3. 各级子目录中的Makefile。
一、各级子目录的Makefile:
这类Makefile最为简单,其形式如下所示:
```makefile
EXTRA_CFLAGS :=
CFLAGS_file.o :=
obj-y += file.o
obj-y += subdir/
```
其中,“`obj-y += file.o`”表示将当前目录下的文件file.c编译进程序中;“`obj-y += subdir/`”则意味着需要进入名为subdir的子目录寻找并加入相关文件,具体由该子目录内的Makefile决定。注意:
1. “subdir/”中的斜杠不可省略。
2. 顶层Makefile定义的CFLAGS在编译任意一个.c文件时都会使用到。
3. CFLAGS、EXTRA_CFLAGS及CFLAGS_xxx.o三者共同决定了xxx.c的编译选项。
二、顶层目录下的Makefile:
这类Makefile主要负责指定根目录下需要加入程序中的文件和子目录,并定义工具链前缀(如:`CROSS_COMPILE`)、编译参数(如:`CFLAGS`)及链接参数(如:LDFLAGS)。这些变量通过export命令导出。
三、顶层目录下的Makefile.build:
这是最复杂的一部分,其功能在于将某个目录及其所有子目录中需要加入程序的文件进行编译,并打包成built-in.o。详细说明请参考相关教程视频或文档。
四、如何使用这套Makefile系统:
1. 将顶层目录中的`Makefile`和`Makefile.build`放入程序的顶级位置,在每个子目录下创建一个空白的Makefile。
2. 确定要编译哪些源文件:通过修改各层级下的obj-y来指定需要加入到最终可执行文件中的.o目标,例如:
```makefile
obj-y += xxx.o
obj-y += yyy/
```
3. 设置编译和链接选项:在顶层Makefile中调整`CFLAGS`(所有.c文件的通用编译参数)及`LDFLAGS`(最终应用程序的连接参数);并在各个子目录下的Makefile里添加特定于该目录或单个源文件的额外编译标志。
4. 指定使用的交叉编译器:通过修改顶层Makefile中的CROSS_COMPILE定义,设置工具链前缀(例如arm-linux-)来指定正确的交叉编译环境。
5. 定义应用程序名称:在顶层Makefile中设定TARGET变量以指明最终生成的应用程序文件名。
6. 编译过程:
- 使用`make`命令进行源代码的构建;
- 通过执行`make clean`清理已产生的中间目标和对象文件;
- 执行`make distclean`则会彻底清除所有由Makefile创建出来的产物。