make rpi_3_32b_defconfig V=1
#顶层 Makefile 94 ifeq ("$(origin V)", "command line") 95 KBUILD_VERBOSE = $(V) 96 endif 97 ifndef KBUILD_VERBOSE 98 KBUILD_VERBOSE = 0 99 endif 100 101 ifeq ($(KBUILD_VERBOSE),1) 102 quiet = 103 Q = 104 else 105 quiet=quiet_ 106 Q = @ 107 endif ...... 386 include scripts/Kbuild.include .... 481 scripts_basic: 482 $(Q)$(MAKE) $(build)=scripts/basic 483 $(Q)rm -f .tmp_quiet_recordmcount ...... 492 outputmakefile: 493 ifneq ($(KBUILD_SRC),) 494 $(Q)ln -fsn $(srctree) source 495 $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \ 496 $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) 497 endif ...... 563 %config: scripts_basic outputmakefile FORCE 564 $(Q)$(MAKE) $(build)=scripts/kconfig $@ ...... 2318 FORCE:
输入
make rpi_3_32b_defconfig V=1
,94行条件成立,KBUILD_VERBOSE = 1
,101行条件成立,quiet 和 Q 为空
,则输出整个命令。输入命令自动匹配 563 行并执行,由上可知,依赖关系如下所示:
执行终极目标%config
,见《3. 执行终极目标 %config》, 回显 4-13
- 创建
scripts_basic
,见《1. 创建 scripts_basic》, 回显 1-3- 创建
outputmakefile
,见《2. 创建 outputmakefile》,什么都不做。- 创建
FORCE
,什么都不做。
最终:
创建《1. fixdep 工具》,通过此工具查找实现目标所用的命令、源码、头文件等全部信息。
创建《2. conf 工具》,通过此工具将配置文件rpi_3_32b_defconfig
和所有Kconfig
文件中的内容写入.config
文件中。
创建 scripts/basic/fixdep 回显 2
创建 scripts/basic/.fixdep.cmd 回显 2
创建 scripts/kconfig/conf.o 回显 5
创建 scripts/kconfig/.conf.o.cmd 回显 5
创建 scripts/kconfig/zconf.tab.c 回显 6
创建 scripts/kconfig/.zconf.tab.c.cmd 回显 6
创建 scripts/kconfig/zconf.lex.c 回显 7
创建 scripts/kconfig/.zconf.lex.c.cmd 回显 7
创建 scripts/kconfig/zconf.tab.o 回显 8
创建 scripts/kconfig/.zconf.tab.o.cmd 回显 8
创建 scripts/kconfig/conf 回显 9
创建 scripts/kconfig/.conf.cmd 回显 9
创建 .config 回显 10
回显 1-13 行:
1 make -f ./scripts/Makefile.build obj=scripts/basic 2 cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 -o scripts/basic/fixdep scripts/basic/fixdep.c 3 rm -f .tmp_quiet_recordmcount 4 make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig 5 cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c 6 bison -oscripts/kconfig/zconf.tab.c -t -l scripts/kconfig/zconf.y 7 flex -oscripts/kconfig/zconf.lex.c -L scripts/kconfig/zconf.l 8 cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c 9 cc -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o 10 scripts/kconfig/conf --defconfig=arch/../configs/rpi_3_32b_defconfig Kconfig 11 # 12 # configuration written to .config 13 #
1. 创建 scripts_basic
# 顶层 Makefile 386 include scripts/Kbuild.include ...... 481 scripts_basic: 482 $(Q)$(MAKE) $(build)=scripts/basic 483 $(Q)rm -f .tmp_quiet_recordmcount
$(build)
在 scripts/Kbuild.include 【在顶层Makefile的386行引用】的第184行定义:# scripts/Kbuild.include 184 build := -f $(srctree)/scripts/Makefile.build obj
$(srctree)
在顶层 Makefile 中定义为srctree = .
,所以展开后为:# 顶层 Makefile 481 scripts_basic: 482 make -f ./scripts/Makefile.build obj=scripts/basic 483 rm -f .tmp_quiet_recordmcount
由上可知,目标无依赖,接下来执行目标的创建语句即可。
- 执行命令:
make -f ./scripts/Makefile.build obj=scripts/basic
, 回显 1
由 《1. make -f ./scripts/Makefile.build obj=XXX》 分析可知:
1.1 在《1.1 引用文件》中引用scripts/basic/Makefile
、scripts/Makefile.lib
和scripts/Makefile.host
等,由此分析可知:
$(builtin-target):$(obj-y) 、$(obj-m) 、$(obj-)、 $(subdir-m) 、$(lib-target)未定义为空
;
$(lib-target):$(lib-y)、$(lib-m)、$(lib-)未定义为空
;
$(extra-y):未定义为空
;
$(subdir-ym):未定义为空
;
$(always) :=$(obj)/fixdep
;
2.2. 由步骤1中的定义可知,《1.2 创建 $(builtin-target)》,什么都不做;
2.3. 由步骤1中的定义可知,《1.3 创建 $(lib-target)》,什么都不做;
2.4. 由步骤1中的定义可知,《1.4 创建 $(extra-y)》,什么都不做;
2.5. 由步骤1中的定义可知,《1.5 创建 $(subdir-ym)》,什么都不做;
2.6. 由步骤1中的定义可知, 《1.6 创建 $(always)》,什么都不做;
由《1. 目标 $(obj)/fixdep》分析可知:
打印和执行$(cmd_host-csingle)
命令,将创建scripts/basic/fixdep
所用的命令、源码、头文件等信息全部写入到scripts/basic/.fixdep.cmd
文件中。 回显 2- 执行命令:
rm -f .tmp_quiet_recordmcount
, 回显 3
最终:
- 执行命令:
make -f ./scripts/Makefile.build obj=scripts/basic
, 回显 1- 打印和执行
$(cmd_host-csingle)
命令,将创建scripts/basic/fixdep
所用的命令、源码、头文件等信息全部写入到scripts/basic/.fixdep.cmd
文件中。 回显 2- 执行命令:
rm -f .tmp_quiet_recordmcount
, 回显 3
回显 1-31 make -f ./scripts/Makefile.build obj=scripts/basic 2 cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 -o scripts/basic/fixdep scripts/basic/fixdep.c 3 rm -f .tmp_quiet_recordmcount
创建:
创建 scripts/basic/fixdep 回显 2
创建 scripts/basic/.fixdep.cmd 回显 2
2. 创建 outputmakefile
# 顶层 Makefile 492 outputmakefile: 493 ifneq ($(KBUILD_SRC),) 494 $(Q)ln -fsn $(srctree) source 495 $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \ 496 $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL) 497 endif
当输入
make O=dir
时,KBUILD_SRC=dir
,由于这里没有O=
,所以第493行条件不成立,这里什么都不做。
3. 执行终极目标 %config
#顶层 Makefile 386 include scripts/Kbuild.include .... 563 %config: scripts_basic outputmakefile FORCE 564 $(Q)$(MAKE) $(build)=scripts/kconfig $@
$(srctree)
在顶层 Makefile 中定义为srctree = .
在 <386行> 引用的scripts/Kbuild.include
中有如下定义:# scripts/Kbuild.include 184 build := -f $(srctree)/scripts/Makefile.build obj
所以最终展开为:
# make ARCH=arm CROSS_COMPILE=****** rpi_3_32b_defconfig # 顶层 Makefile 563 rpi_3_32b_defconfig: scripts_basic outputmakefile FORCE 564 make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig
由《1. 创建 scripts_basic》《2. 创建 outputmakefile》可知,目标的依赖都已创建,接下来执行目标的创建命令即可。 回显 4
由 《2. make ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig 》 分析可知: 回显 5-13
最终:
创建《2. conf 工具》,通过此工具将配置文件rpi_3_32b_defconfig
和所有Kconfig
文件中的内容写入.config
文件中。
创建 scripts/kconfig/conf.o 回显 5
创建 scripts/kconfig/.conf.o.cmd 回显 5
创建 scripts/kconfig/zconf.tab.c 回显 6
创建 scripts/kconfig/.zconf.tab.c.cmd 回显 6
创建 scripts/kconfig/zconf.lex.c 回显 7
创建 scripts/kconfig/.zconf.lex.c.cmd 回显 7
创建 scripts/kconfig/zconf.tab.o 回显 8
创建 scripts/kconfig/.zconf.tab.o.cmd 回显 8
创建 scripts/kconfig/conf 回显 9
创建 scripts/kconfig/.conf.cmd 回显 9
创建 .config 回显 10
回显 4-13 行:4 make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig 5 cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c 6 bison -oscripts/kconfig/zconf.tab.c -t -l scripts/kconfig/zconf.y 7 flex -oscripts/kconfig/zconf.lex.c -L scripts/kconfig/zconf.l 8 cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c 9 cc -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o 10 scripts/kconfig/conf --defconfig=arch/../configs/rpi_3_32b_defconfig Kconfig 11 # 12 # configuration written to .config 13 #