文章目录
- 执行依赖scripts_basic
- 执行依赖outputmakefile
- 实现%config
make rpi_3_32b_defconfig V=1:
make -f ./scripts/Makefile.build obj=scripts/basiccc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11     -o scripts/basic/fixdep scripts/basic/fixdep.c   
rm -f .tmp_quiet_recordmcount
make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfigcc -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.cbison -oscripts/kconfig/zconf.tab.c -t -l scripts/kconfig/zconf.yflex -oscripts/kconfig/zconf.lex.c -L scripts/kconfig/zconf.lcc -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.ccc   -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o   
scripts/kconfig/conf  --defconfig=arch/../configs/rpi_3_32b_defconfig Kconfig
#
# configuration written to .config
#
make rpi_3_32b_defconfig :
  HOSTCC  scripts/basic/fixdepHOSTCC  scripts/kconfig/conf.oYACC    scripts/kconfig/zconf.tab.cLEX     scripts/kconfig/zconf.lex.cHOSTCC  scripts/kconfig/zconf.tab.oHOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
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
......
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 为空,则输出整个命令。
输入命令自动匹配顶层 Makefile 的第563 行并执行,由于目标%config依赖scripts_basic、outputmakefile和FORCE, 则执行顺序如下:1. 执行依赖
scripts_basic,481-483行
2. 执行依赖outputmakefile,492-497行
3. 执行依赖FORCE,什么都不做,2318行
执行依赖scripts_basic
481 scripts_basic: 482 $(Q)$(MAKE) $(build)=scripts/basic 483 $(Q)rm -f .tmp_quiet_recordmcount
$(build)在 scripts/Kbuild.include 文件【在顶层Makefile的386行引用】的第184行定义:184 build := -f $(srctree)/scripts/Makefile.build obj
$(srctree)在顶层 Makefile 中定义为srctree = .,所以展开后为:scripts_basic:make -f ./scripts/Makefile.build obj=scripts/basicrm -f .tmp_quiet_recordmcount结果:由 ./scripts/Makefile.build 分析可知:打印并执行下列第2行的内容,生成
scripts/basic/fixdep软件,将cmd_scripts/basic/fixdep := cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 -o scripts/basic/fixdep scripts/basic/fixdep.c内容写入到scripts/basic/.fixdep.cmd文件中【此文件没有回自动创建】
回显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
执行依赖outputmakefile
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行条件不成立,这里什么都不做。
实现%config
由上面的分析可知,
%config的三个依赖scripts_basic、outputmakefile和FORCE都已经实现。
1.依赖scripts_basic:为了生成scripts/basic/fixdep
2.依赖outputmakefile:什么都不做
3.依赖FORCE:什么都不做563 %config: scripts_basic outputmakefile FORCE 564 $(Q)$(MAKE) $(build)=scripts/kconfig $@最后执行第564行命令来生成最终目标
%config,最终展开为:563 %config: scripts_basic outputmakefile FORCE 564 make ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig结果:由 ./scripts/Makefile.build 分析可知: