Linux 的顶层 Makefile 和 uboot 的顶层 Makefile 非常相似,因为 uboot 参考了 Linux,前 602行几乎一样,所以前面部分我们大致看一下就行了。
1、版本号
顶层 Makefile 一开始就是 Linux 内核的版本号
2、 MAKEFLAGS 变量
MAKEFLAGS 变量设置如下所示:
。
3、命令输出
Linux 编译的时候也可以通过“V=1”来输出完整的命令,这个和 uboot 一样
4、静默输出
Linux 编译的时候使用“make -s”就可实现静默编译,编译的时候就不会打印任何的信息,同 uboot 一样
5、设置编译结果输出目录
Linux 编译的时候使用“O=xxx”即可将编译产生的过程文件输出到指定的目录中,相关代码如下:
6、代码检查
Linux 也支持代码检查,使用命令“make C=1”使能代码检查,检查那些需要重新编译的文件。“make C=2”用于检查所有的源码文件,顶层 Makefile 中的代码如下:
7、模块编译
Linux 允许单独编译某个模块,使用命令“make M=dir”即可,旧语法“make SUBDIRS=dir”也是支持的。顶层 Makefile 中的代码如下:
8、设置目标架构和交叉编译器
同 uboot一样, Linux编译的时候需要设置目标板架构ARCH 和交叉编译器 CROSS_COMPILE,在顶层 Makefile 中代码如下:
为了方便,一般直接修改顶层 Makefile 中的 ARCH 和 CROSS_COMPILE,直接将其设置为对应的架构和编译器,比如本教程将 ARCH 设置为为 arm, CROSS_COMPILE 设置为 armlinux-gnueabihf-,如下所示:
252 ARCH ?= arm
253 CROSS_COMPILE ?= arm-linux-gnueabihf-
9、调用 scripts/Kbuild.include 文件
同 uboot 一样, Linux 顶层 Makefile 也会调用文件 scripts/Kbuild.include,顶层 Makefile 相应代码如下:
10、交叉编译工具变量设置
顶层 Makefile 中其他和交叉编译器有关的变量设置如下
11、头文件路径变量
顶层 Makefile 定义了两个变量保存头文件路径: USERINCLUDE 和 LINUXINCLUDE,相关代码如下:
第 381~386 行是 USERINCLUDE 是 UAPI 相关的头文件路径,第 390~396 行是LINUXINCLUDE 是 Linux 内核源码的头文件路径。重点来看一下 LINUXINCLUDE,其中srctree=., hdr-arch=arm, KBUILD_SRC 为空,因此,将 USERINCLUDE 和 LINUXINCLUDE 展开以后为:
USERINCLUDE := \
-I./arch/arm/include/uapi \
-Iarch/arm/include/generated/uapi \
-I./include/uapi \
-Iinclude/generated/uapi \
-include ./include/linux/kconfig.h
LINUXINCLUDE := \
-I./arch/arm/include \
-Iarch/arm/include/generated/uapi \
-Iarch/arm/include/generated \
-Iinclude \
-I./arch/arm/include/uapi \
-Iarch/arm/include/generated/uapi \
-I./include/uapi \
-Iinclude/generated/uapi \
-include ./include/linux/kconfig.h
12、导出变量
顶层 Makefile 会导出很多变量给子 Makefile 使用,导出的这些变量如下: