一 UBOOT编译--- make xxx_deconfig过程详解

make xxx_deconfig过程详解

  • 1. 前言
  • 2. 概述
  • 3. build变量的定义
  • 4. 目标%config的定义
    • 4.1 依赖 scripts_basic
      • 4.1.1 语句$(if $ (KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))
      • 4.1.2 语句 $(if $ (KBUILD_MODULES),$(obj-m) $(modorder-target))*
      • 4.1.3 $(subdir-ym)
      • 4.1.4 $(always) 重点关注
        • 4.1.4.1 src的定义
        • 4.1.4.2 kbuild-dir的定义
        • 4.1.4.3 kbuild-file的定义
        • 4.1.4.4 又在Makefile.build中包含include scripts/Makefile.lib
    • 4.2 依赖 outputmakefile
    • 4.3 依赖 FORCE
    • 4.4 规则 $ (Q)$(MAKE) $(build)=scripts/kconfig $@
  • 5 总结
1. 前言
 UBOOT版本:uboot2018.03,开发板myimx8mmek240 。
2. 概述Ubootb编译第一步通常是执行make xxx_config,在编译指定顶层目录生成.config文件,这种方式要求厂商提供一个基础的xxx_config文件(通常来说开发者不会通过执行make menuconfig从零开始配置,这个工作过量太大了) 。本文接下来的章节主要解析这条指令背后主要做了什么 。我是用的开发板执行命令为:make myimx8mmek240-8mm-2g_defconfig
3. build变量的定义在scripts/Kbuild.include 中定义:
#### Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=# Usage:# $(Q)$(MAKE) $(build)=dirbuild := -f $(srctree)/scripts/Makefile.build obj4. 目标%config的定义在顶层Makefile中定义:
# We need some generic definitions (do not try to remake the file).scripts/Kbuild.include: ;include scripts/Kbuild.include//注意这个引用......config: scripts_basic outputmakefile FORCE $(Q)$(MAKE) $(build)=scripts/kconfig $@%config: scripts_basic outputmakefile FORCE $(Q)$(MAKE) $(build)=scripts/kconfig $@4.1 依赖 scripts_basic(参考:linux内核Makefile中的变量build— 过渡篇(五))
# 顶层Makefile# Basic helpers built in scripts/PHONY += scripts_basicscripts_basic: $(Q)$(MAKE) $(build)=scripts/basic $(Q)rm -f .tmp_quiet_recordmcount展开变量build
# 顶层Makefile# Basic helpers built in scripts/PHONY += scripts_basicscripts_basic: $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj=scripts/basic $(Q)rm -f .tmp_quiet_recordmcount
 make -f $(srctree)/scripts/Makefile.build obj=scripts/basic的解析如下:
这是一种不指定目标的情况,由于未指定目标,这时会使用Makefile.build中的默认目标__build 。然后更进一步,会使用$(obj)/Makefile(scripts/basic/Makefile)中定义的变量来进行目标匹配 。
__build在Makefile.build中的构建规则为:
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \$(subdir-ym) $(always) @:4.1.1 语句$(if $ (KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))在顶层Makefile中,KBUILD_BUILTIN的定义如下:
# note:顶层MakefileKBUILD_BUILTIN := 1export KBUILD_MODULES KBUILD_BUILTIN该语句展开为:
$(builtin-target) $(lib-target) $(extra-y)(1)lib-target
# note:顶层Makefileifneq ($(strip $(lib-y) $(lib-m) $(lib-)),) lib-target := $(obj)/lib.aendif在此语句之前obj-y := ;obj-m := ;obj-未定义 。因此lib-target为空 。
(2)builtin-target ???????
# note:顶层Makefileifneq ($(strip $(obj-y) $(obj-m) $(obj-) $(subdir-m) $(lib-target)),) builtin-target := $(obj)/built-in.oendif在此语句之前obj-y := ; obj-m := ;obj-未定义 ; subdir-m := ;并且在所包含的文件中也没有给这些变量增加值 。lib-target 为空 。因此builtin-target为空 。
(3)extra-y未定义 综上:语句$(if $ (KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))为空 。
4.1.2 语句 $(if $ (KBUILD_MODULES),$(obj-m) $(modorder-target))*在顶层Makefile中,KBUILD_BUILTIN的定义如下:

经验总结扩展阅读