概述
本文基于firefly RK3588Q SDK uboot配置过程进行分析,环境如下:
编译环境:Ubuntu 20.04 LTS
编译工具:aarch64-linux-gnu-
代码版本:u-boot v2017.09
配置文件:rk3588_defconfig
Uboot配置单板
本文涉及的配置命令
make rk3588_defconfig
配置单板过程分析
想看具体配置详细日志的加参数
make rk3588_defconfig V=1
配置输出如下:
u-boot$ make rk3588_defconfig V=1
make -f ./scripts/Makefile.build obj=scripts/basic
rm -f .tmp_quiet_recordmcount
make -f ./scripts/Makefile.build obj=scripts/kconfig rk3588_defconfig
scripts/kconfig/conf --defconfig=arch/../configs/rk3588_defconfig Kconfig
#
# configuration written to .config
#
配置命令参数说明:
- rk3588_defconfig 是RK3588单板配置文件
- V=1 指示编译显示详细的输出,默认V=0,编译经显示必要的简略信息
从输出的log看,make rk3588_defconfig的执行主要分为3个部分,见图上标示:
- 1.执行make -f ./scripts/Makefile.build obj=scripts/basic,编译生成scripts/basic/fixdep工具
- 2.执行make -f ./scripts/Makefile.build obj=scripts/kconfig rk3588_defconfig, 编译生成scripts/kconfig/conf 工具
- 3.执行scripts/kconfig/conf --defconfig=arch/…/confs/rk3588_defconfig kconfig生成最终的.config配置文件
编译时用到的文件正是.config,下面分析下.config文件如何一步一步生成的。
Makefile文件是如何一步一步生成的。
复习Makefile
Makefile规则格式
target : prerequisites
command
-
target : 通常是需要生成的目标文件名。
make 所需执行的命令名称。可以包含多个目标,使用空格对多个目标名进行分离。 -
prerequisities : 当前目标 所依赖 的 其他目标或文件。
可以包含多个依赖, 使用空格对多个依赖进行分离。 -
command : 完成目标所需要执行的命令。
每一个命令必须以 [ Tab ] 字符开始, [ Tab ] 字符告诉 make 此行是一个命令行。
Makefile的核心是依赖和命令。对于每个目标,首先会检查依赖,如果依赖存在,则执行命令更新目标;如果依赖不存在,则会以依赖为目标,先生成依赖,待依赖生成后,再执行命令生成目标。
顶层Makefile make rk3588_defconfig规则
执行make xxx_defconfig命令时,u-boot根目录下的Makefile中有唯一的规则匹配目标:
478 %config: scripts_basic outputmakefile FORCE
479 $(Q)$(MAKE) $(build)=scripts/kconfig $@
目标:%config
依赖:scripts_basic outputmakefile FORCE
对于目标,rk3588_defconfig,展开则有:
rk3588_defconfig: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig rk3588_defconfig
其中$(build)在./scripts/Kbuild.include中定义:
build := -f $(srctree)/scripts/Makefile.build obj
分析依赖
依赖的scripts_basic
396 # Basic helpers built in scripts/
397 PHONY += scripts_basic
398 scripts_basic:
399 $(Q)$(MAKE) $(build)=scripts/basic
400 $(Q)rm -f .tmp_quiet_recordmcoun
scripts_basic没有进一步的依赖
依赖的outputmakefile
405 PHONY += outputmakefile
406 # outputmakefile generates a Makefile in the output directory, if using a
407 # separate output directory. This allows convenient use of make in the
408 # output directory.
409 outputmakefile:
410 ifneq ($(KBUILD_SRC),)
411 $(Q)ln -fsn $(srctree) source
412 $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
413 ¦ $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
414 endif
outputmakefile没有进一步的依赖
依赖的FORCE
1731 PHONY += FORCE
1732 FORCE:
1733
FORCE被定义为一个空目标。如果一个目标添加FORCE依赖,每次编译都会先去执行FORCE,然后运行命令更新目标,这样就能确保目标每次都会被更新。在这里也就保证目标rk3588_defconfig的命令,总能被执行
$(Q)$(MAKE) $(build)=scripts/kconfig rk3588_defconfig
分析完依赖在分析命令。
分析命令
依赖scripts_basic的命令
目标rk3588_defconfig的三个依赖scripts_basic,outputmakefile和FORCE中,只有scripts_basic需要执行命令,如下:
398 scripts_basic:
399 $(Q)make -f ./scripts/Makefile.build obj=scripts/basic
400 $(Q)rm -f .tmp_quiet_recordmcoun
make命令会转到文件scripts/Makefile.build去执行。最终结果就是编译scripts/basic/fixdep.c生成主机上的可执行文件fixdep。工具fixdep用于更新每一个生成目标的依赖文件*.cmd
rk3588_defconfig的命令
完成对依赖scripts_basic的更新后,接下来就是执行rk3588_defconfig的更新, 展开后的规则如下:
rk3588_defconfig: scripts_basic outputmakefile FORCE
make -f ./scripts/Makefile.build obj=scripts/basic rk3588_defconfig
也就是说make命令会第二次转到scripts/Makefile.build去执行。
对于这里传入的rk3588_defconfig,匹配的目标是:
%_defconfig: $(obj)/conf
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
其中%_defconfig是rk3588_defconfig, obj是scripts/basic, 所以展开是
rk3588_defconfig: scripts/basic/conf
scripts/kconfig/conf --defconfig=arch/../configs/rk3588_defconfig Kconfig
make rk3588_defconfig配置流程简图
作者潘小帅, 是一名Linux底层爱好者,平时写写技术原创文章,徒步,旅游,看电影的爱好,喜欢我的文章可以点赞收藏+关注,感谢你的支持,微信公众号【Linux随笔录】
本文由mdnice多平台发布