make xxxx_defconfig 分析【生成fixdep、conf工具】

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

  1. 创建scripts_basic,见《1. 创建 scripts_basic》 回显 1-3
  2. 创建outputmakefile,见《2. 创建 outputmakefile》,什么都不做。
  3. 创建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

由上可知,目标无依赖,接下来执行目标的创建语句即可。

  1. 执行命令:make -f ./scripts/Makefile.build obj=scripts/basic 回显 1
    《1. make -f ./scripts/Makefile.build obj=XXX》 分析可知:
    1.1 在《1.1 引用文件》中引用scripts/basic/Makefilescripts/Makefile.libscripts/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
  2. 执行命令:rm -f .tmp_quiet_recordmcount 回显 3


最终:

  1. 执行命令:make -f ./scripts/Makefile.build obj=scripts/basic 回显 1
  2. 打印和执行 $(cmd_host-csingle) 命令,将创建scripts/basic/fixdep 所用的命令、源码、头文件等信息全部写入到 scripts/basic/.fixdep.cmd文件中。 回显 2
  3. 执行命令:rm -f .tmp_quiet_recordmcount 回显 3


回显 1-3

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

创建:
创建 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 #
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值