IMX8 UBOOT源码分析(三)UBOOT Makefile分析

接着上篇博客继续向下分析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的作用。

猜你喜欢

转载自blog.csdn.net/yanggx0929/article/details/87904783