文章目录
- 1. 目标 $(obj)/fixdep
- 2. 目标 $(obj)/conf
- 3. 目标 $(obj)/mconf
- 4. 源码展开
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
,源码目录下存在此依赖文件,接下来执行目标创建命令即可。创建:
回显 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.o
,见下面《2.1 创建 $(obj)/conf.o》, 回显 5- 创建
$(obj)/zconf.tab.o
,见下面《2.2 创建 $(obj)/zconf.tab.o》, 回显 6-8
由上面两步可知,创建$(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 &