• scripts/Makefile.host 分析【fixdep、conf】


    1. 目标 $(obj)/fixdep

    《1.1 引用文件》可知,引用scripts/basic/Makefile,其中有如下定义:

    # 执行命令:make -f ./scripts/Makefile.build obj=scripts/basic
    # scripts/basic/Makefile
    12 hostprogs-y	:= fixdep
    13 always		:= $(hostprogs-y)
    16 $(addprefix $(obj)/,$(filter-out fixdep,$(always))): $(obj)/fixdep
    

    《1.1 引用文件》可知,引用scripts/Makefile.host,其中根据变量定义展开为:

    # scripts/Makefile.host
    24 __hostprogs   := fixdep
    25 host-cshlib 	 :=
    26 host-cxxshlib :=
    ......
    30 host-csingle	 := fixdep
    34 host-cmulti	 := 
    38 host-shared	 :=
    42 host-cobjs	 := 
    47 host-cxxmulti := 
    50 host-cxxobjs	 := 
    53 host-cshobjs  :=
    54 host-cxxshobjs:=
    ......
    56 host-csingle	 := $(obj)/$(host-csingle)
    57 host-cmulti	 := 
    58 host-cobjs	 := 
    59 host-cxxmulti := 
    60 host-cxxobjs	 :=
    61 host-cshlib	 :=
    62 host-cxxshlib := 
    63 host-cshobjs	 :=
    64 host-cxxshobjs:=
    65 host-shared	 :=
    ......
    70 _hostc_flags   = $(KBUILD_HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
    71                 $(HOSTCFLAGS_$(basetarget).o)
    74
    75 ifeq ($(KBUILD_SRC),)
    76 __hostc_flags	= $(_hostc_flags)
    78 else
    79 __hostc_flags	= -I$(obj) $(call flags,_hostc_flags)
    81 endif
    82
    83 hostc_flags    = -Wp,-MD,$(depfile) $(__hostc_flags)
    ......
    92 cmd_host-csingle	= $(HOSTCC) $(hostc_flags) -o $@ $< \
    93 	  	$(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
    94 $(host-csingle): $(obj)/%: $(src)/%.c FORCE
    95 	  $(call if_changed_dep,host-csingle)
    
    • 70行:$(KBUILD_HOSTCFLAGS)在顶层 Makefile 中定义为:
      $(KBUILD_HOSTCFLAGS) = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11
    • 70行:$(HOST_EXTRACFLAGS)$(HOSTCFLAGS_$(basetarget).o)未定义为空
    • 75-81行:当输入make O=dir时,KBUILD_SRC=dir,由于这里没有O=,所以 <75行> 条件成立,由 <70行> 可知:
      $(__hostc_flags) = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11
    • 83行: $(depfile) 在scripts/Kbuild.include 【在顶层Makefile的396行引用】中定义为:
      $(depfile) = $(dir $@).$(notdir $@).d
    • 83行: $(__hostc_flags)在 <75-81行> 中定义,所以:
      $(hostc_flags) = -Wp,-MD,$(dir $@).$(notdir $@).d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11
    • 92行:$(HOSTCC) 在顶层 Makefile 的282行定义: $(HOSTCC) = cc
    • 93行:《@F介绍》$(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F) 未定义为空
    • 94行:根据 <30-56行> 的定义可知: $(host-csingle) = $(obj)/fixdep
    • 94行:由《1.1 引用文件》可知: $(obj) = $(src)


    最终展开为:

    # make -f ./scripts/Makefile.build obj=scripts/basic
    # scripts/Makefile.host
    92 cmd_host-csingle = cc -Wp,-MD,$(dir $@).$(notdir $@).d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11     -o $@ $<
    93
    94 $(obj)/fixdep: $(obj)/fixdep: $(obj)/fixdep.c FORCE
    95 	  $(call if_changed_dep,host-csingle)
    

    目标依赖$(obj)/fixdep.c,源码目录下存在此依赖文件,接下来执行目标创建命令即可。


    最终: 《if_changed_dep函数》
    在这里插入图片描述

    创建:
    在这里插入图片描述

    回显 2

    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
    

    2. 目标 $(obj)/conf

    《2.1 引用 scripts/kconfig/Makefile》可知,引用scripts/kconfig/Makefile,其中有如下定义:

    # 执行命令:make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig
    # scripts/kconfig/Makefile
    175 hostprogs-y := conf
    184 hostprogs-y	+= nconf
    194 hostprogs-y	+= mconf
    206 hostprogs-y	+= qconf
    222 hostprogs-y	+= gconf
    ......
    195 lxdialog		:= checklist.o inputbox.o menubox.o textbox.o util.o yesno.o
    173 conf-objs		:= conf.o  zconf.tab.o
    185 nconf-objs		:= nconf.o zconf.tab.o nconf.gui.o
    196 mconf-objs		:= mconf.o zconf.tab.o $(addprefix lxdialog/, $(lxdialog))
    208 qconf-objs		:= zconf.tab.o
    223 gconf-objs		:= gconf.o zconf.tab.o
    207 qconf-cxxobjs	:= qconf.o
    

    《2.2 引用 scripts/Makefile.host》可知,引用scripts/Makefile.host,其中根据变量定义展开为:

    # scripts/Makefile.host
    24 __hostprogs   := conf gconf mconf nconf qconf
    25 host-cshlib 	 :=
    26 host-cxxshlib :=
    ......
    30 host-csingle	 :=
    34 host-cmulti	 := conf gconf mconf nconf
    38 host-shared	 :=
    42 host-cobjs	 := conf.o gconf.o lxdialog/checklist.o lxdialog/inputbox.o lxdialog/menubox.o lxdialog/textbox.o lxdialog/util.o lxdialog/yesno.o mconf.o nconf.gui.o nconf.o zconf.tab.o
    47 host-cxxmulti := qconf
    50 host-cxxobjs	 := qconf.o
    53 host-cshobjs  :=
    54 host-cxxshobjs:=
    ......
    56 host-csingle	 :=
    57 host-cmulti	 := $(obj)/conf $(obj)/gconf $(obj)/mconf $(obj)/nconf
    58 host-cobjs	 := $(obj)/conf.o gconf.o $(obj)/lxdialog/checklist.o $(obj)/lxdialog/inputbox.o $(obj)/lxdialog/menubox.o $(obj)/lxdialog/textbox.o $(obj)/lxdialog/util.o $(obj)/lxdialog/yesno.o $(obj)/mconf.o $(obj)/nconf.gui.o $(obj)/nconf.o $(obj)/zconf.tab.o
    59 host-cxxmulti := $(obj)/qconf
    60 host-cxxobjs	 := $(obj)/qconf.o
    61 host-cshlib	 :=
    62 host-cxxshlib := 
    63 host-cshobjs	 :=
    64 host-cxxshobjs:=
    65 host-shared	 :=
    ......
    100 cmd_host-cmulti	= $(HOSTCC) $(KBUILD_HOSTLDFLAGS) -o $@ \
    101 	$(addprefix $(obj)/,$($(@F)-objs)) \
    102 	$(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
    103 $(host-cmulti): FORCE
    104 	$(call if_changed,host-cmulti)
    
    • 100行:$(HOSTCC) 在顶层 Makefile 的282行定义 HOSTCC = cc
    • 100行:$(KBUILD_HOSTLDFLAGS) 未定义为空
    • 101行:经 @F介绍 分析可知,展开为: $(obj)/$($(notdir $@)-objs)
    • 102行:$(KBUILD_HOSTLDLIBS)$(HOSTLDLIBS_$(@F)未定义为空


    <57 行>host-cmulti的定义和只需生成$(obj)/conf可知,展开后为:

    # make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig
    # scripts/Makefile.host
    100 cmd_host-cmulti = cc -o $@  $(obj)/$(conf-objs)
    103 $(obj)/conf: FORCE
    104 	$(call if_changed,host-cmulti)
    

    《2.1 引用 scripts/kconfig/Makefile》可知,引用scripts/kconfig/Makefile,其中有如下定义:

    # scripts/kconfig/Makefile
    173 conf-objs := conf.o  zconf.tab.o
    

    最终展开为:

    # scripts/Makefile.host
    100 cmd_host-cmulti = cc -o $@  $(obj)/conf.o  $(obj)/zconf.tab.o
    103 $(obj)/conf: FORCE
    104 	$(call if_changed,host-cmulti)
    

    创建目标需要 $(obj)/conf.o$(obj)/zconf.tab.o ,这两个文件不存在,需要优先创建。


    由上面两步可知,创建$(obj)/conf所需的文件都已创建,接下来执行目标的创建命令即可, 回显 9


    最终:
    在这里插入图片描述

    创建:
    在这里插入图片描述

    回显 5-9

    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   
    

    2.1 生成 $(obj)/conf.o 文件

    《2.2 引用 scripts/Makefile.host》 可知,引用 scripts/Makefile.host,其中有如下定义:

    # make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig
    # scripts/Makefile.host
    58 host-cobjs := $(obj)/conf.o gconf.o $(obj)/lxdialog/checklist.o $(obj)/lxdialog/inputbox.o $(obj)/lxdialog/menubox.o $(obj)/lxdialog/textbox.o $(obj)/lxdialog/util.o $(obj)/lxdialog/yesno.o $(obj)/mconf.o $(obj)/nconf.gui.o $(obj)/nconf.o $(obj)/zconf.tab.o
    ......
    70 _hostc_flags   = $(KBUILD_HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
    71                 $(HOSTCFLAGS_$(basetarget).o)
    74
    75 ifeq ($(KBUILD_SRC),)
    76 __hostc_flags	= $(_hostc_flags)
    78 else
    79 __hostc_flags	= -I$(obj) $(call flags,_hostc_flags)
    81 endif
    82
    83 hostc_flags    &
  • 相关阅读:
    【Crypto | CTF】BugKu 简单的RSA
    Flink SQL: LOAD Statements
    String和stringbuffer和stringbuilder
    什么是低代码(Low-Code)?低代码适用于哪些场景?
    原料价格上涨,APS智能排产在锂电池行业的应用
    474922-22-0 DSPE-PEG-MAL Maleimide-PEG-DSPE 磷脂-聚乙二醇-马来酰亚胺
    2022年卡塔尔世界杯黑科技盘点
    提示工程101|与 AI 交谈的技巧和艺术
    Jmeter接口测试和性能测试
    vue3 prop验证类型
  • 原文地址:https://blog.csdn.net/weixin_51459644/article/details/139274680