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

文章目录

  • 1. 目标 $(obj)/fixdep
    • 1.1 cmd_host-csingle函数分析:
  • 2. 目标 $(obj)/conf
    • 2.1 cmd_host-cmulti函数分析:
    • 2.2 生成 $(obj)/conf.o 文件:
    • 2.3 生成 $(obj)/zconf.tab.o 文件:

1  	# SPDX-License-Identifier: GPL-2.0
2  	# ==========================================================================
3  	# Building binaries on the host system
4  	# Binaries are used during the compilation of the kernel, for example
5  	# to preprocess a data file.
6  	#
7  	# Both C and C++ are supported, but preferred language is C for such utilities.
8  	#
9  	# Sample syntax (see Documentation/kbuild/makefiles.txt for reference)
10 	# hostprogs-y := bin2hex
11 	# Will compile bin2hex.c and create an executable named bin2hex
12 	#
13 	# hostprogs-y    := lxdialog
14 	# lxdialog-objs := checklist.o lxdialog.o
15 	# Will compile lxdialog.c and checklist.c, and then link the executable
16 	# lxdialog, based on checklist.o and lxdialog.o
17 	#
18 	# hostprogs-y      := qconf
19 	# qconf-cxxobjs   := qconf.o
20 	# qconf-objs      := menu.o
21 	# Will compile qconf as a C++ program, and menu as a C program.
22 	# They are linked as C++ code to the executable qconf
23 
24 	__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
25 	host-cshlib := $(sort $(hostlibs-y) $(hostlibs-m))
26 	host-cxxshlib := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m))
27 
28 	# C code
29 	# Executables compiled from a single .c file
30 	host-csingle	:= $(foreach m,$(__hostprogs), \
31 				$(if $($(m)-objs)$($(m)-cxxobjs)$($(m)-sharedobjs),,$(m)))
32 
33 	# C executables linked based on several .o files
34 	host-cmulti	:= $(foreach m,$(__hostprogs),\
35 			   $(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m))))
36 
37 	# Shared object libraries
38 	host-shared	:= $(foreach m,$(__hostprogs),\
39 			   $(if $($(m)-sharedobjs),$(m))))
40 
41 	# Object (.o) files compiled from .c files
42 	host-cobjs	:= $(sort $(foreach m,$(__hostprogs),$($(m)-objs)))
43 
44 	# C++ code
45 	# C++ executables compiled from at least one .cc file
46 	# and zero or more .c files
47 	host-cxxmulti	:= $(foreach m,$(__hostprogs),$(if $($(m)-cxxobjs),$(m)))
48 
49 	# C++ Object (.o) files compiled from .cc files
50 	host-cxxobjs	:= $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
51 
52 	# Object (.o) files used by the shared libaries
53 	host-cshobjs	:= $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs))))
54 	host-cxxshobjs	:= $(sort $(foreach m,$(host-cxxshlib),$($(m:.so=-objs))))
55 
56 	host-csingle	:= $(addprefix $(obj)/,$(host-csingle))
57 	host-cmulti	:= $(addprefix $(obj)/,$(host-cmulti))
58 	host-cobjs	:= $(addprefix $(obj)/,$(host-cobjs))
59 	host-cxxmulti	:= $(addprefix $(obj)/,$(host-cxxmulti))
60 	host-cxxobjs	:= $(addprefix $(obj)/,$(host-cxxobjs))
61 	host-cshlib	:= $(addprefix $(obj)/,$(host-cshlib))
62 	host-cxxshlib	:= $(addprefix $(obj)/,$(host-cxxshlib))
63 	host-cshobjs	:= $(addprefix $(obj)/,$(host-cshobjs))
64 	host-cxxshobjs	:= $(addprefix $(obj)/,$(host-cxxshobjs))
65 	host-shared	:= $(addprefix $(obj)/,$(host-shared))
66 
67 	#####
68 	# Handle options to gcc. Support building with separate output directory
69 
70 	_hostc_flags   = $(KBUILD_HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
71 					 $(HOSTCFLAGS_$(basetarget).o)
72 	_hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
73 					 $(HOSTCXXFLAGS_$(basetarget).o)
74 
75 	ifeq ($(KBUILD_SRC),)
76 	__hostc_flags	= $(_hostc_flags)
77 	__hostcxx_flags	= $(_hostcxx_flags)
78 	else
79 	__hostc_flags	= -I$(obj) $(call flags,_hostc_flags)
80 	__hostcxx_flags	= -I$(obj) $(call flags,_hostcxx_flags)
81 	endif
82 
83 	hostc_flags    = -Wp,-MD,$(depfile) $(__hostc_flags)
84 	hostcxx_flags  = -Wp,-MD,$(depfile) $(__hostcxx_flags)
85 
86 	#####
87 	# Compile programs on the host
88 
89 	# Create executable from a single .c file
90 	# host-csingle -> Executable
91 	quiet_cmd_host-csingle 	= HOSTCC  $@
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)
96 
97 	# Link an executable based on list of .o files, all plain c
98 	# host-cmulti -> executable
99 	quiet_cmd_host-cmulti	= HOSTLD  $@
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)
105	$(call multi_depend, $(host-cmulti), , -objs)
106
107	# Create .o file from a single .c file
108	# host-cobjs -> .o
109	quiet_cmd_host-cobjs	= HOSTCC  $@
110		  cmd_host-cobjs	= $(HOSTCC) $(hostc_flags) -c -o $@ $<
111	$(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE
112		$(call if_changed_dep,host-cobjs)
113
114	# Link an executable based on list of .o files, a mixture of .c and .cc
115	# host-cxxmulti -> executable
116	quiet_cmd_host-cxxmulti	= HOSTLD  $@
117		  cmd_host-cxxmulti	= $(HOSTCXX) $(KBUILD_HOSTLDFLAGS) -o $@ \
118				  $(foreach o,objs cxxobjs,\
119				  $(addprefix $(obj)/,$($(@F)-$(o)))) \
120				  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
121	$(host-cxxmulti): FORCE
122		$(call if_changed,host-cxxmulti)
123	$(call multi_depend, $(host-cxxmulti), , -objs -cxxobjs)
124
125	# Create .o file from a single .cc (C++) file
126	quiet_cmd_host-cxxobjs	= HOSTCXX $@
127		  cmd_host-cxxobjs	= $(HOSTCXX) $(hostcxx_flags) -c -o $@ $<
128	$(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE
129		$(call if_changed_dep,host-cxxobjs)
130
131	# Compile .c file, create position independent .o file
132	# host-cshobjs -> .o
133	quiet_cmd_host-cshobjs	= HOSTCC  -fPIC $@
134		  cmd_host-cshobjs	= $(HOSTCC) $(hostc_flags) -fPIC -c -o $@ $<
135	$(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE
136		$(call if_changed_dep,host-cshobjs)
137
138	# Compile .c file, create position independent .o file
139	# Note that plugin capable gcc versions can be either C or C++ based
140	# therefore plugin source files have to be compilable in both C and C++ mode.
141	# This is why a C++ compiler is invoked on a .c file.
142	# host-cxxshobjs -> .o
143	quiet_cmd_host-cxxshobjs	= HOSTCXX -fPIC $@
144		  cmd_host-cxxshobjs	= $(HOSTCXX) $(hostcxx_flags) -fPIC -c -o $@ $<
145	$(host-cxxshobjs): $(obj)/%.o: $(src)/%.c FORCE
146		$(call if_changed_dep,host-cxxshobjs)
147
148	# Link a shared library, based on position independent .o files
149	# *.o -> .so shared library (host-cshlib)
150	quiet_cmd_host-cshlib	= HOSTLLD -shared $@
151		  cmd_host-cshlib	= $(HOSTCC) $(HOSTLDFLAGS) -shared -o $@ \
152				  $(addprefix $(obj)/,$($(@F:.so=-objs))) \
153				  $(HOST_LOADLIBES) $(HOSTLDLIBS_$(@F))
154	$(host-cshlib): FORCE
155		$(call if_changed,host-cshlib)
156	$(call multi_depend, $(host-cshlib), .so, -objs)
157
158	# Link a shared library, based on position independent .o files
159	# *.o -> .so shared library (host-cxxshlib)
160	quiet_cmd_host-cxxshlib	= HOSTLLD -shared $@
161		  cmd_host-cxxshlib	= $(HOSTCXX) $(HOSTLDFLAGS) -shared -o $@ \
162				  $(addprefix $(obj)/,$($(@F:.so=-objs))) \
163				  $(HOST_LOADLIBES) $(HOSTLDLIBS_$(@F))
164	$(host-cxxshlib): FORCE
165		$(call if_changed,host-cxxshlib)
166	$(call multi_depend, $(host-cxxshlib), .so, -objs)
167
168	targets += $(host-csingle)  $(host-cmulti) $(host-cobjs)\
169		   $(host-cxxmulti) $(host-cxxobjs) $(host-shared) \
170		   $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs)
171

1. 目标 $(obj)/fixdep

  由于顶层 Makefile 的482行执行make -f ./scripts/Makefile.build obj=scripts/basic<见执行依赖scripts_basic>,又在 Makefile.build 中第57行引用scripts/basic/Makefile<见1.1>,并且其中有如下定义:

12 hostprogs-y	:= fixdep
13 always		:= $(hostprogs-y)
16 $(addprefix $(obj)/,$(filter-out fixdep,$(always))): $(obj)/fixdep

$(hostprogs-m)、$(hostlibs-y)、$(hostlibs-m)、$(hostcxxlibs-y)、$(hostcxxlibs-m) 未定义,所以24-65行展开为:

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	 :=

第94行中的 $(obj) 和 $(src) 在 scripts/Makefile.build 的第7-15行中定义,所以最终: $(obj) = $(src)
addprefix函数、sort函数、foreach函数

7  prefix := tpl
8  src := $(patsubst $(prefix)/%,%,$(obj))
9  ifeq ($(obj),$(src))
10 prefix := spl
11 src := $(patsubst $(prefix)/%,%,$(obj))
12 ifeq ($(obj),$(src))
13 prefix := .
14 endif
15 endif

但是从 1.3的96行 可知,这里只需要生成依赖 $(obj)/fixdep 即可,所以匹配第94-95行:

94 $(host-csingle): $(obj)/%: $(src)/%.c FORCE
95 	  $(call if_changed_dep,host-csingle)

$(host-csingle) 在上面的 56 行定义,第94-95行最终展开为:

94 $(obj)/fixdep: $(obj)/%: $(obj)/%.c FORCE
95 	  $(call if_changed_dep,host-csingle)

这里目标$(obj)/fixdep的生成,依赖$(src)/%.c,其目录下存在此类文件【fixdep.c】,经过 if_changed_dep函数 分析可知,打印和执行 cmd_host-csingle 函数,在执行的时候目标 $(obj)/fixdep 就已经生成完成, 并通过 $(obj)/fixdep 工具将实现目标 $(obj)/fixdep 所用的命令、源码、头文件等信息全部写入到 $(obj)/.fixdep.cmd文件中。

最终:打印和执行 cmd_host-csingle 函数【即生成 scripts/basic/fixdep 工具】,将实现目标 $(obj)/fixdep 所用的命令、源码、头文件等信息全部写入到 scripts/basic/.fixdep.cmd文件中。

92 cmd_host-csingle = cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11     -o scripts/basic/fixdep scripts/basic/fixdep.c   
94 scripts/basic/fixdep: scripts/basic/fixdep: scripts/basic/fixdep.c FORCE
95 	  $(cmd_host-csingle)

1.1 cmd_host-csingle函数分析:

91 quiet_cmd_host-csingle 	= HOSTCC  $@
92       cmd_host-csingle	= $(HOSTCC) $(hostc_flags) -o $@ $< \
93 	  	$(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))

第92行:$(HOSTCC) 在顶层 Makefile 的282行定义 HOSTCC = cc
第92行:$(hostc_flags) 在83行定义:

70 _hostc_flags   = $(KBUILD_HOSTCFLAGS)   $(HOST_EXTRACFLAGS)   \
71                 $(HOSTCFLAGS_$(basetarget).o)
72 _hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
73                 $(HOSTCXXFLAGS_$(basetarget).o)
74
75 ifeq ($(KBUILD_SRC),)
76 __hostc_flags	= $(_hostc_flags)
77 __hostcxx_flags	= $(_hostcxx_flags)
78 else
79 __hostc_flags	= -I$(obj) $(call flags,_hostc_flags)
80 __hostcxx_flags	= -I$(obj) $(call flags,_hostcxx_flags)
81 endif
82
83 hostc_flags    = -Wp,-MD,$(depfile) $(__hostc_flags)
84 hostcxx_flags  = -Wp,-MD,$(depfile) $(__hostcxx_flags)
......
83 hostc_flags    = -Wp,-MD,$(depfile) $(__hostc_flags)

第83行:$(depfile) 在scripts/Kbuild.include 【在顶层Makefile的396行引用】的20行定义:
最终: depfile = $(obj)/.$(notdir $@).cmd
dir函数、notdir 函数、subst 函数

5  comma   := ,
15 dot-target = $(dir $@).$(notdir $@)
20 depfile = $(subst $(comma),_,$(dot-target).d)

第83行:$(__hostc_flags),当输入make O=dir时,KBUILD_SRC=dir,由于这里没有O=,所以第75行条件成立,执行第76行,第76行中的 $(_hostc_flags) 在第70行中定义,其中的 $(HOST_EXTRACFLAGS) $(HOSTCFLAGS_$(basetarget).o) 未定义为空,$(KBUILD_HOSTCFLAGS)在顶层 Makefile 中定义为:-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11
最终: hostc_flags = -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11

第93行:@F介绍,$(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F) 未定义为空

最终:

cmd_host-csingle = cc -Wp,-MD,$(obj).$(notdir $@).cmd -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11     -o $@ $<

2. 目标 $(obj)/conf

  由于顶层 Makefile 的564行执行make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig<见实现%config>,又在 Makefile.build 的57行引用scripts/kconfig/Makefile<见2.1>,并且其中有如下定义:

170 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

$(hostprogs-m)、$(hostlibs-y)、$(hostlibs-m)、$(hostcxxlibs-y)、$(hostcxxlibs-m) 未定义,所以24-65行展开为:

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	 :=

$(obj) 和 $(src) 在 scripts/Makefile.build 的第7-15行中定义,所以最终: $(obj) = $(src)
addprefix函数、sort函数、foreach函数

7  prefix := tpl
8  src := $(patsubst $(prefix)/%,%,$(obj))
9  ifeq ($(obj),$(src))
10 prefix := spl
11 src := $(patsubst $(prefix)/%,%,$(obj))
12 ifeq ($(obj),$(src))
13 prefix := .
14 endif
15 endif

但是从 2.6的109行 可知,这里只需要生成依赖 $(obj)/conf 即可,所以这里只会匹配下列目标:

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)

$(host-cmulti) 在上面的 57 行定义,cmd_host-cmulti 的展开见 < 2.1 cmd_host-cmulti函数分析>,展开后为:

100 cmd_host-cmulti = cc -o $@  $(obj)/$($(@F)-objs)
103 $(obj)/conf: FORCE
104 	$(call if_changed,host-cmulti)

从上面可知 $(conf-objs) 在173行中定义conf-objs := conf.o zconf.tab.o,所以最终展开为:

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 存在,这两个文件的生成见下面的 <2.2> <2.3>

最终:if_changed函数

  1. <2.2>: 编译生成 $(obj)/conf.o文件。
    打印和执行 $(cmd_host-cobjs),并将实现 scripts/Kconfig/conf.o 所用的命令、源码、头文件等信息全部写入到 scripts/kconfig/.conf.o.cmd 文件中。
  2. <2.3>: 编译生成 $(obj)/zconf.tab.c $(obj)/flex.lex.c $(obj)/zconf.tab.o 文件。
    2.1打印和执行$(cmd_bison),并将cmd_scripts/kconfig/zconf.tab.c := $(cmd_bison)的内容输入到 scripts/kconfig/.zconf.tab.c.cmd 文件中。
    2.2. 打印和执行$(cmd_flex),并将cmd_scripts/kconfig/flex.lex.c := $(cmd_flex)的内容输入到 scripts/kconfig/.zconf.lex.c.cmd 文件中。
    2.3. 打印和执行 $(cmd_host-cobjs),并将实现目标 $(obj)/zconf.tab.o 所用的命令、源码、头文件等信息全部写入到 scripts/kconfig/.zconf.tab.o.cmd 文件中。
  3. 编译生成 $(obj)/conf 文件。
    打印和执行 $(cmd_host-cmulti),并将 cmd_scripts/Kconfig/conf := $(cmd_host-cmulti) 的内容输入到 scripts/Kconfig/.conf.cmd 文件中。


回显 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 cmd_host-cmulti函数分析:

100 cmd_host-cmulti	= $(HOSTCC) $(KBUILD_HOSTLDFLAGS) -o $@ \
101 	  $(addprefix $(obj)/,$($(@F)-objs)) \
102 	  $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))

addprefix、@F解释
第100行:$(HOSTCC) 在顶层 Makefile 的282行定义 HOSTCC = cc
第100行:$(KBUILD_HOSTLDFLAGS) 在顶层 Makefile 的定义 KBUILD_HOSTLDFLAGS=
第102行:$(KBUILD_HOSTLDLIBS) 在顶层 Makefile 的定义 KBUILD_HOSTLDLIBS=
第102行:$($(HOSTLDLIBS_$(@F)) 在顶层 Makefile 的定义 $(HOSTLDLIBS_$(@F)=

最终:

cmd_host-cmulti = cc -o $@  $(obj)/$($(@F)-objs)

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

因为要生成 $(obj)/conf.o 文件,会匹配 scripts/Makefile.host 中的下列目标:

100 cmd_host-cobjs	= $(HOSTCC) $(hostc_flags) -c -o $@ $<
101 $(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE
102	    $(call if_changed_dep,host-cobjs)

由上面的分析可知:

  1. $(host-cobjs) 在第58行定义,
  2. $(obj) = $(src)
  3. $(HOSTCC) = cc
  4. $(hostc_flags)的定义分析,见 <1.1 cmd_host-csingle函数分析>


最终:打印和执行 $(cmd_host-cobjs),并将实现目标 $(obj)/conf.o 所用的命令、源码、头文件等信息全部写入到 scripts/kconfig/.conf.o.cmd 文件中。【生成 conf.o 文件】

100 cmd_host-cobjs	= cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11     -c -o $@ $<
101 $(obj)/conf.o: $(obj)/%.o: $(src)/%.c FORCE
102	    $(call if_changed_dep,host-cobjs)

if_changed_dep函数 ,其中的$(src)/%.c在源码中存在(conf.c),

2.3 生成 $(obj)/zconf.tab.o 文件:

因为要生成 $(obj)/zconf.tab.o 文件,会匹配 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
......
101 $(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE
102	    $(call if_changed_dep,host-cobjs)

由上面的分析可知: $(host-cobjs) 在第58行定义,只需要生成目标 $(obj)/zconf.tab.o,所以展开后为:

101 $(obj)/zconf.tab.o: $(obj)/%.o: $(src)/%.c FORCE
102	    $(call if_changed_dep,host-cobjs)

由于在 scripts/Kconfig/Makefile 文件也定义了 $(obj)/zconf.tab.o 文件生成的依赖关系,如下:

230 $(obj)/zconf.tab.o: $(obj)/zconf.lex.c

所以需要生成2个C文件,分别为:$(obj)/zconf.lex.c$(obj)/zconf.tab.c,这两个文件不存在,需要优先生成这两个文件。

生成2个C文件:
由于顶层 Makefile 的564行执行make -f ./scripts/Makefile.build obj=XXX,在 ./scripts/Makefile.build 文件的71行引用了 scripts/Makefile.lib 文件,并且在此文件中有如下依赖关系:

211 cmd_flex = $(LEX) -o$@ -L $<
213 $(obj)/%.lex.c: $(src)/%.l FORCE
214 	$(call if_changed,flex)
......
219 cmd_bison = $(YACC) -o$@ -t -l $<
221 $(obj)/%.tab.c: $(src)/%.y FORCE
222 	$(call if_changed,bison)

$(LEX)$(YACC) 在顶层 Makefile 中的定义如下:

405 LEX		= flex
406 YACC	= bison

展开后为:

211 cmd_flex = flex -o$@ -L $<
213 $(obj)/%.lex.c: $(src)/%.l FORCE
214 	$(call if_changed,flex)
......
219 cmd_bison = bison  -o$@ -t -l $<
221 $(obj)/%.tab.c: $(src)/%.y FORCE
222 	$(call if_changed,bison)

经过 if_changed函数 分析可知:

  1. 打印和执行$(cmd_flex),并将cmd_scripts/kconfig/flex.lex.c := $(cmd_flex)的内容输入到 scripts/kconfig/.zconf.lex.c.cmd 文件中。
  2. 打印和执行$(cmd_bison),并将cmd_scripts/kconfig/zconf.tab.c := $(cmd_bison)的内容输入到 scripts/kconfig/.zconf.tab.c.cmd 文件中。


最终: flex & bison 基础概述

  1. 打印和执行$(cmd_flex),并将cmd_scripts/kconfig/flex.lex.c := $(cmd_flex)的内容输入到 scripts/kconfig/.zconf.lex.c.cmd 文件中。【生成 flex.lex.c 文件】
  2. 打印和执行$(cmd_bison),并将cmd_scripts/kconfig/zconf.tab.c := $(cmd_bison)的内容输入到 scripts/kconfig/.zconf.tab.c.cmd 文件中。【生成 zconf.tab.c 文件】
  3. 打印和执行 $(cmd_host-cobjs),并将实现目标 $(obj)/zconf.tab.o 所用的命令、源码、头文件等信息全部写入到 scripts/kconfig/.zconf.tab.o.cmd 文件中。【生成 zconf.tab.o 文件】
100 cmd_host-cobjs	= cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer   -std=gnu11     -c -o $@ $<
101 $(obj)/zconf.tab.o: $(obj)/%.o: $(src)/%.c FORCE
102	    $(call if_changed_dep,host-cobjs)

if_changed_dep函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/23485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++二级指针的指向与解引用

本文算是作者对于二级指针学习的一些总结或者说是刨根问底&#xff0c;如果有表述错误&#xff0c;还请各位大神指正。 我们首先定义一个整型a&#xff0c;令a 5&#xff0c;再分别定义指针p和二级指针ptr int a 5; int *p &a; int **ptr &p;我们不妨假设a的地址是…

云原生周刊:Gateway API v1.1 发布 | 2024.6.3

开源项目推荐 Grafana Tanka Tanka 是 Grafana 开发的一款用于 Kubernetes 的灵活、可重用和简洁的配置工具,是使用 YAML 进行 Kubernetes 配置的一种替代方案。 pv-migrate pv-migrate 是一个 CLI 工具/kubectl 插件&#xff0c;可以轻松地将一个 Kubernetes PersistentVo…

23中设计模式之一— — — —命令模式的详细介绍

命令模式 Command Pattern讲解 概念描述模式结构主要角色模式的UIM类图模式优点模式缺点应用场景实例演示类图代码演示运行结果 概念 命令模式&#xff08;别名&#xff1a;动作&#xff0c;事务&#xff09; 命令模式是一种行为设计模式&#xff0c;将一个请求封装为一个对象…

【qt】项目移植

项目移植 一.前言二.同名问题三.具体操作1.修改文件名2.修改类名3.修改一些不能自动改的名4.修改.ui文件5.删除原来自动生成的ui_xxx.h文件6.修改头文件 四.导入项目五.使用导入的项目六.项目建议 一.前言 终于概率论考完了,有时间了,接着上个项目,我们继续来完成我们的多窗口开…

【Leetcode Python】

偷某间房屋时&#xff0c;累积金额等于间隔前两间房的金额加上当前房的金额数&#xff1b;不偷时&#xff0c;累计金额就等于前一间房的金额数。 状态转移方程&#xff1a;dp[i] max(dp[i-2]nums[i], dp[i-1]) 并且注意错误点&#xff1a;dp[1]有两间房时&#xff0c;初始值为…

汽车soa架构介绍

SOA 架构的基本概念 面向服务的架构(Service-Oriented Architecture,简称 SOA)是一种软件设计和架构风格,近年来在软件开发领域得到了广泛的关注和应用。 SOA 的定义可以概括为:它是一种将应用程序分解为一组松散耦合的服务的架构模式。这些服务通过定义明确的接口进行通…

【Pycharm】功能介绍

1.Code Reformat Code 格式化代码&#xff0c;可以帮助我们去自动调整空格等&#xff0c;根据python语法规范自动调整 2.Settings 1.创建py文件默认填充模版 3.读写py文件编码格式一致性 顶部代码指定的编码方式作用&#xff1a; 可以保证python2/3解释器在读取文件的时候按…

jmeter并发测试

目录 常用的压测工具jmeter安装配置并执行新建测试计划 Test Plan添加线程组练习01&#xff1a;共10个线程&#xff0c;每秒钟启动一个线程&#xff08;需要10秒&#xff09;&#xff0c;每个线程发送两个请求练习02&#xff1a;共10个线程&#xff0c;1秒中内启动完毕&#xf…

03-3.2.2 队列的顺序存储实现

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

kali中安装、卸载程序教程

1、安装教程 ①、使用apt安装 apt update &#xff08;先更新apt&#xff09; apt-get install xxxx(xxx为需要安装的软件名)②、使用dpkg安装 dpkg –i deb的软件包名&#xff08;需要在软件包的目录下使用&#xff0c;不然就要把地址加上&#xff09;二、卸载教程 ①、使…

hudi开启了流读,read.streaming.enabled为true,还需要设置查询类型吗 如snapshot

在使用 Apache Hudi 时&#xff0c;尤其是开启了流式读取&#xff08;read.streaming.enabled 为 true&#xff09;&#xff0c;配置查询类型非常重要。查询类型决定了如何读取数据&#xff0c;尤其是在处理更新和删除操作时。 查询类型选项 在 Hudi 中&#xff0c;常见的查询…

ViewModel原理分析

认识 ViewModel ViewModel 是一种用来存储和管理UI相关数据的类。 ViewModel 的作用可以从两个方面去理解&#xff1a; UI界面控制器&#xff1a;在最初的MVC模式中&#xff0c;由于 Activity / Fragment 承担的职责过重&#xff0c;因此在后续的 MVP、MVVM 模式中&#xff…

基于JSP技术的人事管理系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;浏览器&#xff08;如360浏览器、谷歌浏览器、QQ浏览器等&#xff…

深度神经网络——什么是扩散模型?

1. 概述 在人工智能的浩瀚领域中&#xff0c;扩散模型正成为技术创新的先锋&#xff0c;它们彻底改变了我们处理复杂问题的方式&#xff0c;特别是在生成式人工智能方面。这些模型基于高斯过程、方差分析、微分方程和序列生成等坚实的数学理论构建。 业界巨头如Nvidia、Google…

【C语言】文件操作(下卷)

前言 在上一卷中&#xff0c;我们知道了文件指针、文件的打开和关闭&#xff08;打开其他位置的文件&#xff09;、文件的顺序读写&#xff08;其中的fputc()、fgetc()&#xff09;&#xff0c;这一卷中&#xff0c;将继续讲解文件操作未讲到的地方。 内容有点多&#xff0c;…

人大金仓数据库报sys_user表字段不存在的问题

目录 一.问题&#xff1a; 二.原因 三.解决方法&#xff1a; 一.问题&#xff1a; 公司的一个项目从oracle切换到人大金仓之后&#xff0c;突然报了一个sys_user里面的字段不存在。 二.原因 检查了很多次确信sys_user表没问题&#xff0c;查了相应的文档之后发现原来人大金…

企业自建邮件系统的优势,安全性更高,功能更灵活,维护更便捷

在当今企业信息管理的浪潮中&#xff0c;企业邮件系统显得尤为关键&#xff0c;它不仅加强了内部的沟通效率&#xff0c;还对外展示了企业的专业形象。然而&#xff0c;传统租用企业邮箱服务存在一些不足&#xff0c;如缺乏灵活性、数据管理混乱和难以实现个性化需求&#xff0…

Wireshark 如何查找包含特定数据的数据帧

1、查找包含特定 string 的数据帧 使用如下指令&#xff1a; 双引号中所要查找的字符串 frame contains "xxx" 查找字符串 “heartbeat” 示例&#xff1a; 2、查找包含特定16进制的数据帧 使用如下指令&#xff1a; TCP&#xff1a;在TCP流中查找 tcp contai…

HOW - 面试技巧系列 - 全英文面试

自我介绍 “can you tell me a little bit about yourself?” “please introduce yourself.” 工作经验 “can you describe your most recent job experience?” “how does your experience make you a good fit for this position?” 职业规划 “what are your l…

C语言---指针part2

指针操作 一维 字符数组 1. 字符型数组 --- 存放字符串的 char s[] "hello"; [h ] <---0x1000 [e ] [l ] [l ] [o ] [\0] //谁能这块空间的地址 --- 数组名 s --->怎么能保存s所代表的地址值 //s数组名 --- 数组首元素的地址 &s[0] --->地…