第十一章 U-boot 顶层 Makefile 详解 (Makefile.build 脚本分析)

11.2.14 Makefile.build 脚本分析

        从上一小节可知,“make xxx_defconfig“配置 uboot 的时候如下两行命令会执行脚本
scripts/Makefile.build:
        @make -f ./scripts/Makefile.build obj=scripts/basic
        @make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

1、scripts_basic 目标对应的命令

        scripts_basic 目标对应的命令为:@make -f ./scripts/Makefile.build obj=scripts/basic。
打开文件scripts/Makefile.build。

        第 7 行定义了变量 prefix 值为 tpl。
        第 8 行定义了变量 src,这里用到了函数 patsubst,此行代码展开后为:

$(patsubst tpl/%,%, scripts/basic)

         patsubst 是替换函数,格式如下:

$(patsubst <pattern>,<replacement>,<text>)

         此函数用于在 text 中查找符合 pattern 的部分,如果匹配的话就用 replacement 替换掉。pattenr 是可以包含通配符“%”,如果 replacement 中也包含通配符“%”,那么 replacement 中的这个“%”将是 pattern 中的那个“%”所代表的字符串。函数的返回值为替换后的字符串。
       因 此,第 8 行就是在“scripts/basic”中查找符合“tpl/%”的部分,然后将“tpl/”取消掉,但是“scripts/basic”没有“tpl/”,所以 src= scripts/basic。
        第 9 行判断变量 obj 和 src 是否相等,相等的话条件成立,很明显,此处条件成立。
        第 10 行和第 7 行一样,只是这里处理的是“spl”,“scripts/basic”里面也没有“spl/”,所以
src 继续为 scripts/basic。
        第 12 行因为变量 obj 和 src 相等,所以 prefix=.。

继续分析 scripts/Makefile.build,有如下代码:

将 kbuild-dir 展开后为:
                        $(if $(filter /%, scripts/basic), scripts/basic, ./scripts/basic)
        因 为 没 有 以 “ / ” 为 开 头 的 单 词 , 所 以 $(filter /%, scripts/basic) 的 结 果 为 空 ,
        kbuild-dir=./scripts/basic
将 kbuild-file 展开后为:
         $(if $(wildcard ./scripts/basic/Kbuild), ./scripts/basic/Kbuild, ./scripts/basic/Makefile)
        因为 scrpts/basic 目录中没有 Kbuild 这个文件,所以 kbuild-file= ./scripts/basic/Makefile。最后将 57 行展开,即:
        include ./scripts/basic/Makefile
        也就是读取 scripts/basic 下面的 Makefile 文件。

继续分析 scripts/Makefile.build。

        __build 是默认目标,因为命令“@make -f ./scripts/Makefile.build obj=scripts/basic”没有指定目标,所以会使用到默认目标:__build。
        在顶层 Makefile 中,KBUILD_BUILTIN 为 1,KBUILD_MODULES 为 0
因此展开后目标__build 为:
                __build:$(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)
                           @:                                                                                                                                                  
        可以看出目标__build 有 5 个依赖:builtin-target、lib-target、extra-y、subdir-ym 和 always。这 5 个依赖的具体内容我们就不通过源码来分析了,直接在 scripts/Makefile.build 中输入图11.2.14.1 所示内容,将这 5 个变量的值打印出来:

        执行如下命令:
                                make stm32mp157d_atk_defconfig V=1

        从上图可以看出,只有 always 有效,因此__build 最终为:
                                        __build: scripts/basic/fixdep
                                                @:                               
        __build 依赖于 scripts/basic/fixdep,所以要先 scripts/basic/fixdep.c 编译,生成 fixdep,前面
已经读取了 scripts/basic/Makefile 文件。
        综上所述,scripts_basic 目标的作用就是编译出scripts/basic/fixdep 这个软件。

2、%config 目标对应的命令

        %config 目 标 对 应 的 命 令 为 :
                        @make -f ./scripts/Makefile.build obj=scripts/kconfig
xxx_defconfig,各个变量值如下:

src= scripts/kconfig
kbuild-dir = ./scripts/kconfig
kbuild-file = ./scripts/kconfig/Makefile
include ./scripts/kconfig/Makefile

        可以看出,Makefilke.build 会读取 scripts/kconfig/Makefile 中的内容,此文件有如下内容:

        目标%_defconfig 刚好和我们输入的 xxx_defconfig 匹配,所以会执行这条规则。依赖为$(obj)/conf,展开后就是 scripts/kconfig/conf。
        接下来就是检查并生成依赖 scripts/kconfig/conf。conf 是主机软件。到这里我们就打住,不要纠结 conf 是怎么编译出来的,否则就越陷越深,太绕了,像 conf 这种主机所使用的工具类软件我们一般不关心它是如何编译产生的。如果一定要看是 conf 是怎么生成的,可以输入如下命令重新配置 uboot,在重新配置 uboot 的过程中就会输出 conf 编译信息。

make distclean
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- stm32mp157d_atk_defcon
fig V=1

        得到 scripts/kconfig/conf 以后就要执行目标%_defconfig 的命令。
                $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
相关的变量值如下:

silent=-s 或为空
SRCARCH=..
Kconfig=Kconfig

        将其展开就是:
                @ scripts/kconfig/conf --defconfig=arch/../configs/xxx_defconfig Kconfig

        上述命令用到了 xxx_defconfig 文件,比如 mx6ull_alientek_emmc_defconfig。这里会将mx6ull_alientek_emmc_defconfig 中的配置输出到.config 文件中,最终生成 uboot 根目录下
的.config 文件。
        这个就是命令 make xxx_defconfig 执行流程。总结如下图:

        图 11.2.14.4 make xxx_defconfig 执行流程图

        至此,make xxx_defconfig 就分析完了,接下来就要分析一下 u-boot.bin 是怎么生成的了。

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值