接着上篇博客继续向下分析uboot的Makefile过程
在configprocess.txt中,我们可以看到接下来执行了下面的命令
make -f ./scripts/Makefile.build obj=scripts/kconfig imx8qxp_mek_defconfig
由上篇博客我们可以知道make imx8qxp_mek_defconfig过程中自动匹配如下命令行:
495: %config: scripts_basic outputmakefile FORCE
496: $(Q)$(MAKE) $(build)=scripts/kconfig $@
对于依赖项的更新已经在上篇博客中分析过了,下面继续分析到命令行:
现在我们已经知道$(MAKE)即为make, build := -f $(srctree)/scripts/Makefile.build obj
所以命令行就等价于configprocess.txt中的:
make -f ./scripts/Makefile.build obj=scripts/kconfig imx8qxp_mek_defconfig
该命令的意思为:向Makefile.build中传递参数obj=scripts/kconfig并构建最终的目标imx8qxp_mek_defconfig。
1. 目标:imx8qxp_mek_defconfig
在Makefile.build中并没有相关目标的定义,但是该文件中包含了我们传入的scripts/kconfig/文件夹下的Makefile:
127: %_defconfig: $(obj)/conf
128: $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
1.1 $(silent):
21: ifeq ($(quiet),silent_)
22: silent := -s
23: endif
我们在上篇中已经知道$(quiet)为空,并不等于silent_,此处silent为空
1.2 $(SRCARCH):
13: SRCARCH := ..
1.3 $(Kconfig)
15: ifdef KBUILD_KCONFIG
16: Kconfig := $(KBUILD_KCONFIG)
17: else
18: Kconfig := Kconfig
19: endif
KBUILD_KCONFIG并没有定义,所以Kconfig := Kconfig,源命令行等价于:
127: imx8qxp_mek_defconfig: scripts/kconfig/conf
128: scripts/kconfig/conf --defconfig=arch/../configs/imx8qxp_mek_defconfig Kconfig
2. 依赖项:scripts/kconfig/conf
这里的实现方式和上一篇的fixdep实现方式一致:
2.1 在scripts/kconfig/Makefile中:
218: hostprogs-y := conf nconf mconf kxgettext qconf gconf
210: conf-objs := conf.o zconf.tab.o
309: $(obj)/zconf.tab.o: $(obj)/zconf.lex.c
在scripts/Makefile.host中:
111: quiet_cmd_host-cobjs = HOSTCC $@
112: cmd_host-cobjs = $(HOSTCC) $(hostc_flags) -c -o $@ $<
113: $(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE
114: $(call if_changed_dep,host-cobjs)
同上篇博客的分析,先调用cmd_host-cobjs命令来生成conf.o
即为configprocess.txt中的:
cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 -D_GNU_SOURCE -DCURSES_LOC="<ncurses.h>" -DLOCALE -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c
2.2 zconf.tab.o首先依赖zconf.tab.c,zconf.tab.c在scripts/Makefile.lib中定义如下:
222: quiet_cmd_bison = YACC $@
223: cmd_bison = $(YACC) -o$@ -t -l $<
225: $(obj)/%.tab.c: $(src)/%.y FORCE
226: $(call if_changed,bison)
故调用cmd_bison命令生成zconf.tab.c, 即为configprocess.txt中的:
bison -oscripts/kconfig/zconf.tab.c -t -l scripts/kconfig/zconf.y
zconf.tab.o又依赖zconf.lex.c文件,zconf.lex.c的构建规则在scripts/Makefile.lib中:
214: quiet_cmd_flex = LEX $@
215: cmd_flex = $(LEX) -o$@ -L $<
217: $(obj)/%.lex.c: $(src)/%.l FORCE
218: $(call if_changed,flex)
故调用cmd_flex命令来生成zconf.lex.c,即为configprocess.txt中的:
flex -oscripts/kconfig/zconf.lex.c -L scripts/kconfig/zconf.l
zconf.tab.o的生成规则同2.1中的conf.o生成规则,即为configprocess.txt中的:
cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 -D_GNU_SOURCE -DCURSES_LOC="<ncurses.h>" -DLOCALE -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c
2.3 在生成conf.o 和 zconf.tab.o后,最后掉conf的生成规则来生成conf(在scripts/Makefile.host中):
101: quiet_cmd_host-cmulti = HOSTLD $@
102: cmd_host-cmulti = $(HOSTCC) $(HOSTLDFLAGS) -o $@ \
103: $(addprefix $(obj)/,$($(@F)-objs)) \
104: $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
105: $(host-cmulti): FORCE
106: $(call if_changed,host-cmulti)
调用cmd_host_cmulti命令生成conf,即为configprocess.txt中的:
cc -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o
3. 命令行
在更新完imx8qxp_mek_defconfig的所有依赖项后将执行imx8qxp_mek_defconfig的命令行语句:
scripts/kconfig/conf --defconfig=arch/../configs/imx8qxp_mek_defconfig Kconfig
即为configprocess.txt中的最后一行命令
Uboot的主要配置过程就这些,下一篇博客主要分析最后这个命令行的作用,即conf的作用。