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    &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值