您的位置:首页 > 运维架构 > Linux

Linux内核---6.make menuconfig 流程分析

2016-07-02 14:31 686 查看
分析一下在命令行输入了make menuconfig 之后,到底发生了哪些事情:

点击(此处)折叠或打开

linux_2.6.30.4/Makefile
#scripts/Kbuild.include 文件L144包含build

        #L144 build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj

   184    $(srctree)/scripts/Kbuild.include: ;

   185    include $(srctree)/scripts/Kbuild.include

           

   245    

   246    PHONY += scripts_basic

   247    scripts_basic:

   248        $(Q)$(MAKE) $(build)=scripts/basic

           #make -f scripts/Makefile.build obj=scripts/basic

   249    

   250    scripts/basic/%: scripts_basic ;

   251    

   252    PHONY += outputmakefile

   253    outputmakefile:

           #此处KBUILD_SRC为空,ifneq条件不成立,所以outputmakefile不作任何操作

   254    ifneq ($(KBUILD_SRC),)

   255        $(Q)ln -fsn $(srctree) source

   256        $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \

   257         $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)

   258    endif

   259    

   260    

   261    no-dot-config-targets := clean mrproper distclean \

   262                 cscope TAGS tags help %docs check% \

   263                 include/linux/version.h headers_% \

   264                 kernelrelease kernelversion

   265    

   266    config-targets := 0

   267    mixed-targets := 0

   268    dot-config := 1

   269 #因为MAKECMDGOALS=menuconfig,此处filter结果为空,ifneq条件不成立,所以dot-config:=1

   270    ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)

   271        ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)

   272            dot-config := 0

   273        endif

   274    endif

   275 #KBUILD_EXTMOD为空,ifeq条件成立进入,filter执行结果为menuconfig不为空,ifneq条件不成立config-targets=1,mixed-targets=0    

   276    ifeq ($(KBUILD_EXTMOD),)

   277     ifneq ($(filter config %config,$(MAKECMDGOALS)),)

   278     config-targets := 1

   279     ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)

   280     mixed-targets := 1

   281     endif

   282     endif

   283    endif

   284 #config-targets=1 mixed-targets=0 dot-config=1    #所以执行L291

   285    ifeq ($(mixed-targets),1)

   286    

   287    %:: FORCE

   288        $(Q)$(MAKE) -C
$(srctree) KBUILD_SRC= $@

   289    

   290    else

   291    ifeq ($(config-targets),1)

   292    # 将 ./arch/arm/Makefile 包含进来

   293    include $(srctree)/arch/$(SRCARCH)/Makefile

   294    export KBUILD_DEFCONFIG KBUILD_KCONFIG

   295    

   296    config: scripts_basic outputmakefile FORCE

   297        $(Q)mkdir -p include/linux include/config

   298        $(Q)$(MAKE) $(build)=scripts/kconfig
$@

   299    #%config匹配了menuconfig,不仔细看还真看不出来

   300    %config: scripts_basic outputmakefile FORCE

   301        $(Q)mkdir -p include/linux include/config

   302        $(Q)$(MAKE) $(build)=scripts/kconfig
$@

#由scripts/Kbuild.include的build知,L302:make -f scripts/Makefile.build obj=scripts/kconfig menuconfig

所以执行了 make menuconfig 之后,会执行以下五步:
1. 执行 scripts_basic 依赖:( make -f scripts/Makefile.build obj=scripts/basic )
2. 执行 outputmakefile 依赖:(KBUILD_SRC为空,所以不做任何操作 )
3. FORCE
4. mkdir -p include/linux include/config :(创建文件夹)
5. $(MAKE) $(build)=scripts/kconfig $@ (make -f scripts/Makefile.build obj=scripts/kconfig menuconfig)
所以最重要的是第1步和第5步,下面详细分析一下这两步
1.执行 scripts_basic 依赖:( make -f scripts/Makefile.build obj=scripts/basic )

点击(此处)折叠或打开

scripts/Makefile.build
     1    #传参数obj=scripts/basic

     2    src := $(obj)

     4    PHONY := __build

     5    __build:

    27    -include include/config/auto.conf

    28    

    29    include scripts/Kbuild.include

    32    #src=scripts/basic, filter判断$(src)是不是以/开头,绝对路径,不是绝对路径则加$(srctree)/$(src)    

    33    kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))

        #wildcard判断绝对路径$(srctree)/script/basic目录下是否有Kbuild文件,如果没有则为$(srctree)/script/basic/Makefile

    34    kbuild-file := $(if $(wildcard
$(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)

        #将$(srctree)/script/basic/Makefile加入,这个Makefile中有menuconfig的依赖关系

    35    include $(kbuild-file)

    36

        #在$(srctree)/script/basic/Makefile中定义了,hostprogs-y

    51    ifneq ($(hostprogs-y)$(hostprogs-m),)

    52    include scripts/Makefile.host

    53    endif

        # 有两个__build,用下面这个最新的__build

        # KBUILD_BUILTIN=1, KBUILT_MODULES=null, 所以__build=(builtin-target lib-target extra-y modorder-target subdir-ym always)

        # __build=(modorder-target always)

        # always=scripts/basic/fixdep scripts/basic/docproc scripts/basic/hash

        # modorder-target=scripts/basic/modules.order

    77    __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \

    78         $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \

    79         $(subdir-ym) $(always)

    80        @:

        # $(modorder-target)在Makefile.build中

        # $(modorder-target): $(subdir-ym) FORCE

        #     $(Q)(cat /dev/null; $(modorder-cmds)) > $@

        # 没干什么实事

        # 所以 scripts/basic 就是在scripts/basic/Makefile作用下编译生成docproc fixdep hash 这三个elf文件

    81

5.执行$(MAKE) $(build)=scripts/kconfig $@ (make -f scripts/Makefile.build obj=scripts/kconfig menuconfig) ,与scripts_basic传的obj路径不一样,这将导致执行Makefile的路径也不一样。

点击(此处)折叠或打开

scripts/kconfig/Makefile
#没有定义KBUILD_KCONFIG,所以Kconfig=arch/arm/Kconfig    

     4    ifdef KBUILD_KCONFIG

     5    Kconfig := $(KBUILD_KCONFIG)

     6    else

     7    Kconfig := arch/$(SRCARCH)/Kconfig

     8    endif        
        # 先去生成mconf这个elf文件(看到的图形界面就是这个东东),然后调用scripts/kconfig/mconf arch/arm/Kconfig

        # 这样就可以看到配置选项

    16    menuconfig: $(obj)/mconf

    17        $< $(Kconfig)

        

    86    check-lxdialog := $(srctree)/$(src)/lxdialog/check-lxdialog.sh

    87    

    88    HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)

    89    HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags
$(HOSTCC))

    90    

    91    HOST_EXTRACFLAGS += -DLOCALE

    92    

    93    

    94    

    95    lxdialog := lxdialog/checklist.o lxdialog/util.o
lxdialog/inputbox.o

    96    lxdialog += lxdialog/textbox.o lxdialog/yesno.o
lxdialog/menubox.o

    97    #没有看出mconf和mconf-objs是通过什么关系对应起来的,通过打印mconf的生成过程,可以看出mconf就是mconf-objs

        #gcc -o scripts/kconfig/mconf scripts/kconfig/mconf.o scripts/kconfig/zconf.tab.o scripts/kconfig/lxdialog/checklist.o scripts/kconfig/lxdialog/util.o scripts/kconfig/lxdialog/inputbox.o scripts/kconfig/lxdialog/textbox.o
scripts/kconfig/lxdialog/yesno.o scripts/kconfig/lxdialog/menubox.o -lncurses 
    99    mconf-objs    := mconf.o zconf.tab.o
$(lxdialog)

   101    

   102    hostprogs-y := conf qconf gconf kxgettext

   103    

   104    ifeq ($(MAKECMDGOALS),menuconfig)

   105        hostprogs-y += mconf

   106    endif

   130    PHONY += $(obj)/dochecklxdialog

   131    $(addprefix $(obj)/,$(lxdialog)): $(obj)/dochecklxdialog

   132    $(obj)/dochecklxdialog:

   133        $(Q)$(CONFIG_SHELL) $(check-lxdialog) -check
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOST_LOADLIBES)

   134    

   135    always := dochecklxdialog

写到快吐了!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: