Linux内核---6.make menuconfig 流程分析
2016-07-02 14:31
686 查看
分析一下在命令行输入了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
5.执行$(MAKE) $(build)=scripts/kconfig $@ (make -f scripts/Makefile.build obj=scripts/kconfig menuconfig) ,与scripts_basic传的obj路径不一样,这将导致执行Makefile的路径也不一样。
点击(此处)折叠或打开
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
写到快吐了!!!!
点击(此处)折叠或打开
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
5.执行$(MAKE) $(build)=scripts/kconfig $@ (make -f scripts/Makefile.build obj=scripts/kconfig menuconfig) ,与scripts_basic传的obj路径不一样,这将导致执行Makefile的路径也不一样。
点击(此处)折叠或打开
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
写到快吐了!!!!
相关文章推荐
- Linux内核---5.Makefile显示打印信息
- Linux内核---4.产生内核head.s反汇编文件
- Linux内核---3.linux 内核zImage生成过程
- Linux内核---2.TQ2440系统移植出现的问题总结
- Linux内核---1.TQ2440使用总结
- Linux netstat命令
- Linux(Ubuntu)下MySQL的安装与配置
- Linux 下五个顶级的开源命令行 Shell
- 交叉编译环境
- linux 学习 设置固定网Ip
- 31.每日一个Linux命令----wc
- windows下安装linux/ubantu
- linux 备份工具
- centos升级python
- 你应该丢弃 Windows,选择 Linux 的五大理由
- python之window编译脚本在Linux执行
- SecureCRT连接linux超时问题
- Linux性能测试命令系列(5)- strace
- Linux下设置最大文件打开数nofile及nr_open、file-max
- Linux学习之命令(一):命令大全网址及常用命令设置