u-boot-2017.09 make配置过程分析

概述

本文基于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多平台发布

  • 24
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值