uboot 顶层Makefile的make xxx_deconfig过程

一.  uboot 的 make xxx_deconfig配置

在编译 uboot 之前要使用 make xxx_defconfig”命令 来配置 uboot,那么这个配置过程是如

何运行的呢?

本文来学习 uboot 源码在执行 make xxx_deconfig 这个配置过程中,顶层 Makefile的执行思路。

二.  make xxx_defconfig 过程

在编译 uboot源码时,执行了配置 uboot命令,即运行了 "make xxx_deconfig" 类似的命令,不同版本的开发板(NAND/EMMC)使用的配置文件不同。

当执行 make xxx_defconfig” 命令时,顶层 Makefile文件主要执行了什么命令呢? make xxx_defconfig 命令对应的顶层 Makefile 关键内容如下:
473 KBUILD_DEFCONFIG := sandbox_defconfig
474 export KBUILD_DEFCONFIG KBUILD_KCONFIG
475
476 config: scripts_basic outputmakefile FORCE
477	$(Q)$(MAKE) $(build)=scripts/kconfig $@
478
479 %config: scripts_basic outputmakefile FORCE
480	$(Q)$(MAKE) $(build)=scripts/kconfig $@

上面 Makefile内容可以看出,当执行了 配置uboot命令后,顶层 Makefile 就会匹配到 479行代码,即 %config 目标,而目标 “%config” 依赖于 scripts_basic、outputmakefile 和 FORCE。

下面重点了解顶层 Makefile的如下内容:

%config: scripts_basic outputmakefile FORCE
	$(Q)$(MAKE) $(build)=scripts/kconfig $@

1. 依赖目标 scripts_basic、outputmakefile 和 FORCE

(1)  依赖目标 FORCE

FORCE 在顶层 Makefile的 1613 行,如下定义:
1613 PHONY += FORCE
1614 FORCE:
可以看出 FORCE 是没有规则和依赖的,所以每次都会重新生成 FORCE 。当 FORCE 作为其他目标的依赖时,由于 FORCE 总是被更新过的,因此依赖所在的规则总是会执行的。

(2) 依赖目标 outputmakefile

依赖文件 outputmakefile 在顶层 Makefile 中的内容如下:
406 PHONY += outputmakefile
407 # outputmakefile generates a Makefile in the output directory, if using a
408 # separate output directory. This allows convenient use of make in the
409 # output directory.
410 outputmakefile:
411 ifneq ($(KBUILD_SRC),)
412	$(Q)ln -fsn $(srctree) source
413    $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
414    $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
415 endif
上面的第 411 行,判断 KBUILD_SRC 是否为空,只有变量 KBUILD_SRC 不为空的时,
outputmakefile 才有意义。测试 KBUILD_SRC的值,在上述代码后面加入测试行,加入如下测试代码:
 
mytest:
	@echo KBUILD_SRC= $(KBUILD_SRC)

进入 uboot源码根目录,根目录输入如下命令测试:

wangtian@wangtian-virtual-machine:~/zhengdian_Linux/linux/uboot/alientek_uboot/uboot-imx-rel_imx_4.1.15_2.1.0_ga_alientek$ make mytest 
KBUILD_SRC=

经过测试,我们知道 KBUILD_SRC 为空,所以 , outputmakefile 无效。

(3) 依赖目标 scripts_basic

依赖文件 scripts_basic 在顶层 Makefile 中的内容如下:
398 PHONY += scripts_basic
399 scripts_basic:
400	$(Q)$(MAKE) $(build)=scripts/basic
401	$(Q)rm -f .tmp_quiet_recordmcount
402
403 # To avoid any implicit rule to kick in, define an empty command.
404 scripts/basic/%: scripts_basic ;
上面是 依赖文件 scripts_basic 的规则,其对应的命令用到了变量 Q MAKE build,由Makefile其他地方的代码,或者直接打印Q、MAKE,可知它们的值:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/linux/uboot/alientek_uboot/uboot-imx-rel_imx_4.1.15_2.1.0_ga_alientek$ make mytest
Q= @
MAKE= make

 
变量 build 是在 scripts/Kbuild.include 文件中有定义,定义如下:
178 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
179 # Usage:
180 # $(Q)$(MAKE) $(build)=dir
181 build := -f $(srctree)/scripts/Makefile.build obj

从 以上的 Kbuild.include文件可以看出, build=-f $(srctree)/scripts/Makefile.build obj ,经过前面的分析 可知,变量 srctree ”.” ,所以,可以知道:
build=-f ./scripts/Makefile.build obj 

scripts_basic 展开以后如下:
scripts_basic:
@make -f ./scripts/Makefile.build obj=scripts/basic //也可以没有@,视配置而定
@rm -f . tmp_quiet_recordmcount //也可以没有@

(4)  %config 执行的第二行命令

接着回到 uboot顶层 Makefile %config 代码处, 内容如下:
%config: scripts_basic outputmakefile FORCE
$(Q)$(MAKE) $(build)=scripts/kconfig $@
将命令展开就是:
make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

三.  总结

最终 uboot的顶层 Makefile %config 处,整条命令展开如下:
%config:make -f ./scripts/Makefile.build obj=scripts/basic 
make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

从命令可以看出,scripts_basic 会调用文件 ./scripts/Makefile.build,第二条命令同样也会涉及 文件 ./scripts/Makefile.build

下一篇文章继续了解 Makefile 有关 "make xxx_config"配置过程,具体了解 %config命令涉及调用到的文件 ./scripts/Makefile.build。

你可能感兴趣的:(嵌入式C开发,linux,arm开发)