U-boot 顶层Makefile 学习(1)
U-boot顶层Makefile
9、设置目标架构,交叉编译器和配置文件
在编译Uboot的时候需要设置架构和交叉编译器,例如"make ARCH=arm CRPOSS_COMPILE=arm-linux-gnueabihf-",就是用于设置ARCH和CROSS_COMPILE。
- Line 250 判定主机架构和命令行输入的架构是否相同,如果相同,交叉编译器设置为空。(感觉不重要,因为下面会对其进行重复赋值)。
- 为了避免每次编译都要输入"ARCH=arm CRPOSS_COMPILE=arm-linux-gnueabihf-",直接在顶层Makefile中添加该信息。
Line 253 赋给 ARCH = arm,CROSS_COMPILE = arm-linux-gnueabihf- - Line 256 是配置文件.config,是一个实时有效的配置数据。
10、调用Scripts/Kbuild.include
这里顶层Makefile调用了scripts/Kbuild.include这个文件,在这个文件中,有许多变量,如下图所示:
在uboot编译过程中会使用这些变量,具体使用的时候在分析。
11、交叉编译工具变量设置
上面我们只是设置了交叉编译的名字,但是对交叉编译器的其他工具没有进行设置,具体如下:
这里是简单的字符串拼接,但是具体每个命令的用途是什么,还需要学习。
12、导出其它的变量
在顶层Makefile中会导出许多变量,如下:
其中,关键的打印出来后如下
那么上面7个变量的值是从哪里来的呢?
其实是在config.mk文件中定义的
Line 25 ARCH := $(CONFIG_SYS_ARCH:"%"=%)
就是说提取CONFIG_SYS_ARCH 双引号之间的内容赋给ARCH
Line 26 - 37 其它同理。
sinclude 和 include 和-include
include类似于C 语言的include ,当运行到发生错误时,会产生致命错误让Makefile停止。
而-include和sinclude当读取的文件如果不存在的话不会报错。
13、make xxx_defconfig 过程
在编译uboot前要使用"make xxx_defconfig"来配置uboot,那么这个配置是如何运行的呢?
- Line 441行定义了变量version_h,用于保存版本号文件,此文件是自动生成。
- Line 442行定义了变量timestamp_h,用于保存时间戳文件,也是自动生成的
- 往下定义了变量no-dot-config-targets、config-targets = 0、mixed-targets = 0、dot-config = 1
- Line 452行将不符合no-dot-config-targets的部分过滤,MAKECMDGOALS是make的一个环境变量,这个环境变量会保存你所指向的终极目标列表,比如执行“make mx6ull_alientek_emmc_defconfig”,那么MAKECMDGOALS就是mx6ull_alientek_emmc_defconfig。很明显过滤后为空,那么条件不成立,所有dot-config仍为 1。
- Line 458 判断KBUILD_EXTTMOD是否为空。
- Line459 将不符合config和 %confing的部分过滤。这里非空,条件成立,config-targets = 1。
- words 统计单词的个数。MAKECMDGOALS的单词个数为1,条件非成立,所以mixed-targets = 1。综上,config-targets = 1、mixed-targets = 0、dot-config = 1。