分析一下在命令行输入了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
写到快吐了!!!!