分析一下在命令行输入了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
点击(此处)折叠或打开
- 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
写到快吐了!!!!