uboot make xxx_defconfig 过程分析

本文发布时间: 2019-Mar-22
/********************************************************************************* @author ? ?Maoxiao Hu* @version ? V1.0.0* @date ? ? ? Dec-2014******************************************************************************* < COPYRIGHT 2014 ISE of SHANDONG UNIVERSITY >*********************************************************************************/Based on u-boot-2014-10.?当我们执行make xxx_defconfig时,顶层Makefile中唯一的匹配目标是:?%config:?scripts_basic outputmakefile FORCE? ??+$(Q)$(CONFIG_SHELL) $(srctree)/scripts/multiconfig.sh?$@?依赖条件1:scripts_basicscripts_basic:? ??$(Q)$(MAKE) $(build)=scripts/basic?? ??$(Q)rm -f .tmp_quiet_recordmcount?依赖条件2:outputmakefileoutputmakefile:ifneq ($(KBUILD_SRC),)? ??$(Q)ln -fsn $(srctree) source? ??$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile ? ? ? $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)endif?此时由于KBUILD_SRC为空,所以此条依赖条件并不执行。依赖条件3:FORCEFORCE:执行命令:+$(Q)$(CONFIG_SHELL) $(srctree)/scripts/multiconfig.sh?$@几个变量:$(Q) = @ ?$(CONFIG_SHELL) = /bin/sh$(MAKE) = make$@ = %config$(srctree) = .所以依赖条件1变成:scripts_basic:? ??@make $(build)=scripts/basic? ??@rm -f .tmp_quiet_recordmcount$(build)的定义在:scripts/Kbuild.includebuild := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build objKBUILD_SRC为空,所以$(if $(KBUILD_SRC),$(srctree)/)也为空。所以变为:build?:= -f scripts/Makefile.build?obj所以依赖条件1变为:scripts_basic:? ??@make -f?scripts/Makefile.build?obj=scripts/basic? ??@rm -f .tmp_quiet_recordmcount此时主目标变成:%config:?scripts_basic? ??+@/bin/sh ./scripts/multiconfig.sh?%config?一、script_basic分析scripts_basic:? ??@make?-f?scripts/Makefile.build?obj=scripts/basic? ??@rm -f .tmp_quiet_recordmcount在这里主要还是对@make?-f?scripts/Makefile.build?obj=scripts/basic这句命令的分析。将obj = scripts/basic 这个变量名传入Makefile.build。二、主目标分析%config:?scripts_basic? ??+@/bin/sh ./scripts/multiconfig.sh?%config加入我们输入的命令是:make trats_defconfig那么得到:trats_defconfig:?scripts_basic? ??+@/bin/sh ./scripts/multiconfig.sh trats_defconfig也就是将trats_defconfig这个文件传入multiconfig.sh脚本中,然后执行。三、调用?multiconfig.sh 脚本过程分析下面再来解析multiconfig.sh:target=$1?case $target in?*_defconfig)?? ??do_board_defconfig $target;;esac此时target = trats_defconfig 符合*_defconfig,执行:do_board_defconfig trats_defconfig;do_board_defconfig是一个内部函数,另外经过替换一些已知变量后得到:?do_board_defconfig?() {? ?? defconfig_path=$srctree/configs/trats_defconfig? ?? tmp_defconfig_path=configs/.tmp_defconfig?? ?? sed -n -e?'/^[+A-Z]*:/!p'?-e?'s/^+[A-Z]*://p'$srctree/configs/trats_defconfig >?configs/.tmp_defconfig?? ?? run_make_config .tmp_defconfig?||?{? ? ? ?? cleanup_after_defconfig? ? ? ?? exit?1? ?? }?? ?? for img in?$(get_enabled_subimages)? ?? do? ? ? ?? symbol=$(echo$img| cut -c?1?| tr?'[a-z]'?'[A-Z]')?? ? ? ?? # defconfig for SPL, TPL:? ? ? ?? #?? pick lines with 'S', 'T' prefix and rip the prefixes off? ? ? ?? sed -n -e?'s/^[+A-Z]*'$symbol'[A-Z]*://p'$defconfig_path > configs/.tmp_defconfig??????? run_make_config .tmp_defconfig?$img?|| {??????????? cleanup_after_defconfig??????????? exit?1??????? }??? done??? cleanup_after_defconfig}大概意思是先把trats_defconfig复制一份到configs/.tmp_defconfig然后,基本可以分为红色和粉红色两部分:红色部分:run_make_config .tmp_defconfig?||?{? ? ? ?? cleanup_after_defconfig? ? ? ?? exit?1}再次把.tmp_defconfig当作参数给run_make_config函数,run_make_config经过已知变量代换后变成:run_make_config () {? ? ? target=.tmp_defconfig? ? ? objdir=?? ? ? options="SRCARCH=.. KCONFIG_OBJDIR="? ? ? build scripts/kconfig?SRCARCH=.. KCONFIG_OBJDIR= .tmp_defconfig}最后一句再次调用build函数:?build () {? ?? make -f $srctree/scripts/Makefile.build obj=“$@"}变量代换后变成:make?-f $srctree/scripts/Makefile.build obj=scripts/kconfig?SRCARCH=.. KCONFIG_OBJDIR=?.tmp_defconfig?粉红色部分:? ? ?for img in?$(get_enabled_subimages)? ?? do? ? ? ?? symbol=$(echo$img| cut -c?1?| tr?'[a-z]'?'[A-Z]')?? ? ? ?? # defconfig for SPL, TPL:? ? ? ?? #?? pick lines with 'S', 'T' prefix and rip the prefixes off? ? ? ?? sed -n -e?'s/^[+A-Z]*'$symbol'[A-Z]*://p'$defconfig_path > configs/.tmp_defconfig??????? run_make_config .tmp_defconfig?$img?|| {??????????? cleanup_after_defconfig??????????? exit?1??????? }在这我们没有定义过SPL和TPL,所以跳过这一步。最后,其实只有一句话:make?-f $srctree/scripts/Makefile.build obj=scripts/kconfig?SRCARCH=.. KCONFIG_OBJDIR=?.tmp_defconfig四、Makefile.build分析从二三节得到了两条待执行的指令:make?-f?scripts/Makefile.build?obj=scripts/basicmake?-f scripts/Makefile.build obj=scripts/kconfig?SRCARCH=.. KCONFIG_OBJDIR=?.tmp_defconfig先分析第1条:make?-f?scripts/Makefile.build?obj=scripts/basic编译scripts/basic.c文件再分析第2条:把scripts/kconfig 先传入Makefile.build中,然后再将根据其初始化的值暴露到顶层Makefile中。匹配kconfig/Makefile里的:%_defconfig:$(obj)/conf? ??$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)展开后:.tmp_defconfig:scripts/kconfig/conf? ? @scripts/kconfig/conf —defconfig=arch/../configs/.tmp_defconfig Kconfig这句话的意图很明显,先编译scripts/kconfig/conf.c生成scripts/kconfig/conf,然后输入两个参数:—defconfig=arch/../configs/.tmp_defconfigKconfig五、scripts/kconfig/conf.c 解析详见以后博客。


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:09pm
栏目列表