make syncconfig
# 顶层 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 ...... 563 %config: scripts_basic outputmakefile FORCE 564 $(Q)$(MAKE) $(build)=scripts/kconfig $@ ...... 2318 FORCE:
执行命令
make syncconfig V=1
时,94行条件成立,KBUILD_VERBOSE = 1
,则101行条件成立,quiet 和 Q 为空
,则输出整个命令。
在顶层Makefile的 <386行> 引用scripts/Kbuild.include
,其中有如下定义:# scripts/Kbuild.include 184 build := -f $(srctree)/scripts/Makefile.build obj
最终展开为:
# make syncconfig V=1 # 顶层 Makefile 563 syncconfig: scripts_basic outputmakefile FORCE 564 make -f ./scripts/Makefile.build obj=scripts/kconfig syncconfig
由上可知,依赖关系如下图所示:
- 创建目标
syncconfig
,见下面《3. 创建目标 syncconfig》, 回显 4-10
1.1 创建scripts_basic
,见下面《1. 创建 scripts_basic》, 回显 1-3
1.2 创建outputmakefile
,见下面《2. 创建 outputmakefile》,什么都不做
1.3 创建FORCE
,什么都不做
最终:
- 执行命令:
make -f ./scripts/Makefile.build obj=scripts/basic
, 回显 1
1.1 打印和执行$(cmd_host-csingle)
命令,将创建scripts/basic/fixdep
所用的命令、源码、头文件等信息全部写入到scripts/basic/.fixdep.cmd
文件中。 回显 2- 执行命令:
rm -f .tmp_quiet_recordmcount
, 回显 3- 执行命令
make -f ./scripts/Makefile.build obj=scripts/kconfig syncconfig
, 回显 4
3.1 打印和执行$(cmd_host-cobjs)
命令,并将创建scripts/kconfig/conf.o
所用的命令、源码、头文件等信息全部写入到scripts/kconfig/.conf.o.cmd
文件中。 回显 5
3.2 打印和执行$(cmd_bison)
命令,并将cmd_scripts/kconfig/zconf.tab.c := $(cmd_bison)
的内容输入到scripts/kconfig/.zconf.tab.c.cmd
文件中。 回显 6
3.3 打印和执行$(cmd_flex)
命令,并将cmd_scripts/kconfig/flex.lex.c := $(cmd_flex)
的内容输入到scripts/kconfig/.zconf.lex.c.cmd
文件中。 回显 7
3.4 打印和执行$(cmd_host-cobjs)
命令,并将创建$(obj)/zconf.tab.o
所用的命令、源码、头文件等信息全部写入到scripts/kconfig/.zconf.tab.o.cmd
文件中。 回显 8
3.5 打印和执行$(cmd_host-cmulti)
命令,并将cmd_scripts/Kconfig/conf := $(cmd_host-cmulti)
的内容输入到scripts/Kconfig/.conf.cmd
文件中。 回显 9
3.6 打印和执行命令:scripts/kconfig/conf --syncconfig Kconfig
,《2. conf 工具》,执行结果如下: 回显 10
3.6.1 创建include/config/auto.conf
3.6.2 创建include/config/auto.conf.cmd
3.6.3 创建include/config/tristate.conf
3.6.4 创建include/generated/autoconf.h
回显 1-101 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 syncconfig 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 --syncconfig Kconfig
创建:
创建 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
创建 include/config/auto.conf 回显 10
创建 include/config/auto.conf.cmd 回显 10
创建 include/config/tristate.conf 回显 10
创建 include/generated/autoconf.h 回显 10
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
在顶层Makefile的 <386行> 引用
scripts/Kbuild.include
,其中有如下定义:# 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. 创建目标 syncconfig
# make syncconfig V=1 # 顶层 Makefile 563 syncconfig: scripts_basic outputmakefile FORCE 564 make -f ./scripts/Makefile.build obj=scripts/kconfig syncconfig
由《1. 创建 scripts_basic》《2. 创建 outputmakefile》可知,目标的所有依赖都已创建,接下来执行目标的创建命令即可。 回显 4
最终:由 < 4. make -f ./scripts/Makefile.build obj=scripts/kconfig syncconfig > 分析可知:
- 打印和执行
$(cmd_host-cobjs)
命令,并将创建scripts/kconfig/conf.o
所用的命令、源码、头文件等信息全部写入到scripts/kconfig/.conf.o.cmd
文件中。 回显 5- 打印和执行
$(cmd_bison)
命令,并将cmd_scripts/kconfig/zconf.tab.c := $(cmd_bison)
的内容输入到scripts/kconfig/.zconf.tab.c.cmd
文件中。 回显 6- 打印和执行
$(cmd_flex)
命令,并将cmd_scripts/kconfig/flex.lex.c := $(cmd_flex)
的内容输入到scripts/kconfig/.zconf.lex.c.cmd
文件中。 回显 7- 打印和执行
$(cmd_host-cobjs)
命令,并将创建$(obj)/zconf.tab.o
所用的命令、源码、头文件等信息全部写入到scripts/kconfig/.zconf.tab.o.cmd
文件中。 回显 8- 打印和执行
$(cmd_host-cmulti)
命令,并将cmd_scripts/Kconfig/conf := $(cmd_host-cmulti)
的内容输入到scripts/Kconfig/.conf.cmd
文件中。 回显 9- 打印和执行命令:
scripts/kconfig/conf --syncconfig Kconfig
,《2. conf 工具》, 回显 10
执行结果如下:
6.1 创建include/config/auto.conf
6.2 创建include/config/auto.conf.cmd
6.3 创建include/config/tristate.conf
6.4 创建include/generated/autoconf.h
回显 4-104 make -f ./scripts/Makefile.build obj=scripts/kconfig syncconfig 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 --syncconfig Kconfig
创建:
创建 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
创建 include/config/auto.conf 回显 10
创建 include/config/auto.conf.cmd 回显 10
创建 include/config/tristate.conf 回显 10
创建 include/generated/autoconf.h 回显 10