好不容易有时间空闲下来,就想着把之前心心念念的u-boot研究一下,顺带记录着。
Makefile简单分析
我们对整个u-boot-sunxi-with-spl进行编译的时候,一般需要执行以下几条命令:
shell
make distclean
make ARCH=arm CROSS_COMPILE=/home/ender/sunxi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- licheepi_nano_defconfig
make ARCH=arm CROSS_COMPILE=/home/ender/sunxi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- CFLAGS=-g -j16
为了分析对应的指令的执行过程,可以在顶层Makefile中查找相应指令。
第一条指令,执行distclean:
即从
srctree
目录下找出符合条件的文件并打印至标准输出,再由管道输入到xargs
命令构造参数,最后传给rm -rf
,执行构建清除。当在顶层编译时,srctree
的定义即为.(当前目录)。
第二条指令,执行defconfig:
由于xxxx_defconfig的前缀在不断发生变化,因此通过搜索后缀config找到匹配的目标为 搜索
build
变量的定义,位于srctree/scripts/Kbuild.include内 因此实际的make ARCH=arm CROSS_COMPILE=/home/ender/sunxi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- licheepi_nano_defconfig在Makefile中的依赖可以化简为以下:
Makefile
licheepi_nano_defconfig: scripts_basic outputmakefile FORCE
make -f ./scripts/Makefile.build obj=scripts/kconfig licheepi_nano_defconfig
FORCE
使得目标被强制执行,其中依赖scripts_basic
位于顶层Makefile内
依赖
outputmakefile
也位于顶层Makefile内
由此可知licheepi_nano_defconfig该目标终究会调用./scripts/Makefile.build,并传入参数obj=scripts/kconfig licheepi_nano_defconfig。
注意到Makefile.build中没有与licheepi_nano_defconfig
相匹配的目标,因此先分析obj
参数,看源码可知obj
参数被做如下处理:
经过转换后,去除特定前缀,则src=obj=scripts/kconfig。
进一步的,
src
被用于组成kbuild-file
,展开后得知kbuild-file=./scripts/kconfig/Makefile。并且在57行的include $(kbuild-file)中将文件./scripts/kconfig/Makefile包含进来了。 打开./scripts/kconfig/Makefile文件搜索,即可找到licheepi_nano_defconfig
对应的目标如下:

此处第一条命令把licheepi_nano_defconfig
文件经过$(CPP)
工具预处理生成 generated_defconfig
。 之后第二条命令通过 sed
去掉每行开头的空白字符。 最后第三条命令调用 $<
,即$(obj)/conf
并结合KConfig
来生成完整的配置信息,最终写入.config
文件。
第三条指令:执行make:
U-Boot的默认目标是_all
,因此在顶层Makefile中可以搜索到关键字:
此处150行的
_all:
没有指定目标所需的依赖,通过搜索找到225行处的以下定义:
得知
_all
依赖于all
,故查找目标all
:
all
又依赖于目标.binman_stamp
,而目标.binman_stamp
又依赖于目标$(INPUTS-y)
,在980行处看到如下定义:
可知这里便是根据具体配置信息将依赖添加入
$(INPUTS-y)
,从而使得Makefile能够正确构建出u-boot.bin
,spl/u-boot-spl.bin
等文件,然而我们的目标是u-boot-sunxi-with-spl.bin
,继续搜索关键字,在arch/arm/dts/sunxi-u-boot.dtsi
中得到以下内容:
得知其是通过
binman
工具整合而来,且依赖于spl/sunxi-spl.bin
u-boot-nodtb
等文件,查找spl/sunxi-spl.bin
依赖,在顶层Makefile中得到以下内容:
可知其依赖于
spl/u-boot-spl
,追溯可得:
该命令等价于:
Makefile
make obj=spl -f ./scripts/Makefile.xpl all