本文共 7598 字,大约阅读时间需要 25 分钟。
先看一下打印(使用前需要make clean)
[root@cliffr linux-2.6.32]# lsarch COPYING crypto drivers fs init Kbuild lib Makefile Module.symvers README samples security tools virtblock CREDITS Documentation firmware include ipc kernel MAINTAINERS mm net REPORTING-BUGS scripts sound usr[root@cliffr linux-2.6.32]# make menuconfig V=1make -f scripts/Makefile.build obj=scripts/basic gcc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/basic/fixdep scripts/basic/fixdep.c gcc -Wp,-MD,scripts/basic/.docproc.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/basic/docproc scripts/basic/docproc.c gcc -Wp,-MD,scripts/basic/.hash.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/basic/hash scripts/basic/hash.c mkdir -p include/linux include/configmake -f scripts/Makefile.build obj=scripts/kconfig menuconfig gcc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -I/usr/include/ncurses -DCURSES_LOC="" -DLOCALE -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c gcc -Wp,-MD,scripts/kconfig/.kxgettext.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -I/usr/include/ncurses -DCURSES_LOC=" " -DLOCALE -c -o scripts/kconfig/kxgettext.o scripts/kconfig/kxgettext.c/bin/sh /usr/local/src/linux-2.6.32/scripts/kconfig/lxdialog/check-lxdialog.sh -check gcc -I/usr/include/ncurses -DCURSES_LOC=" " -DLOCALE -lncursesw gcc -Wp,-MD,scripts/kconfig/lxdialog/.checklist.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -I/usr/include/ncurses -DCURSES_LOC=" " -DLOCALE -c -o scripts/kconfig/lxdialog/checklist.o scripts/kconfig/lxdialog/checklist.c gcc -Wp,-MD,scripts/kconfig/lxdialog/.inputbox.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -I/usr/include/ncurses -DCURSES_LOC=" " -DLOCALE -c -o scripts/kconfig/lxdialog/inputbox.o scripts/kconfig/lxdialog/inputbox.c gcc -Wp,-MD,scripts/kconfig/lxdialog/.menubox.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -I/usr/include/ncurses -DCURSES_LOC=" " -DLOCALE -c -o scripts/kconfig/lxdialog/menubox.o scripts/kconfig/lxdialog/menubox.c gcc -Wp,-MD,scripts/kconfig/lxdialog/.textbox.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -I/usr/include/ncurses -DCURSES_LOC=" " -DLOCALE -c -o scripts/kconfig/lxdialog/textbox.o scripts/kconfig/lxdialog/textbox.c gcc -Wp,-MD,scripts/kconfig/lxdialog/.util.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -I/usr/include/ncurses -DCURSES_LOC=" " -DLOCALE -c -o scripts/kconfig/lxdialog/util.o scripts/kconfig/lxdialog/util.c gcc -Wp,-MD,scripts/kconfig/lxdialog/.yesno.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -I/usr/include/ncurses -DCURSES_LOC=" " -DLOCALE -c -o scripts/kconfig/lxdialog/yesno.o scripts/kconfig/lxdialog/yesno.c gcc -Wp,-MD,scripts/kconfig/.mconf.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -I/usr/include/ncurses -DCURSES_LOC=" " -DLOCALE -c -o scripts/kconfig/mconf.o scripts/kconfig/mconf.c gcc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -I/usr/include/ncurses -DCURSES_LOC=" " -DLOCALE -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c 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 -lncursesw scripts/kconfig/mconf arch/x86/Kconfig
先分析如下语句
feq ($(KBUILD_EXTMOD),) # $(KBUILD_EXTMOD为空 ifneq ($(filter config %config,$(MAKECMDGOALS)),) # $(MAKECMDGOALS)表示 menuconfig 所以满足if条件 config-targets := 1 ifneq ($(filter-out config %config,$(MAKECMDGOALS)),) # $(MAKECMDGOALS)只有一个 menuconfig 所以不满足if条件 mixed-targets := 1 endif endifendif
由于 config-targets 为1, 而 mixed-targets 为0, 所以进入如下分支
代码流程如下
%config: scripts_basic outputmakefile FORCE $(Q)mkdir -p include/linux include/config $(Q)$(MAKE) $(build)=scripts/kconfig $@ 依赖1 scripts_basic: $(Q)$(MAKE) $(build)=scripts/basic =>make -f scripts/Makefile.build obj=scripts/basic 其中 scripts/Kbuild.include:150:build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj =>build := -f scripts/Makefile.build obj Makefile.build 里面找第一个目标编译, 也就是 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \ $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \ $(subdir-ym) $(always) 其中 scripts/basic/Makefile:13:always := $(hostprogs-y) scripts/basic/Makefile:12:hostprogs-y := fixdep docproc hash 也就是说, __build 需要将 fixdep docproc hash 编译为目标文件。 Makefile.build 是怎么将 scripts/basic/Makefile 包含进来的呢 # The filename Kbuild has precedence over Makefile kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) =>kbuild-dir := $(if $(filter /%,$(obj)),$(obj),$(srctree)/$(obj)) =>kbuild-dir := $(if $(filter /%,scripts/basic),scripts/basic,$(srctree)/scripts/basic) =>kbuild-dir := scripts/basic kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) include $(kbuild-file) =>kbuild-file := $(if $(wildcard scripts/basic/Kbuild),scripts/basic/Kbuild,scripts/basic/Makefile) include $(kbuild-file) =>kbuild-file := scripts/basic/Makefile #scripts/basic/Kbuild不存在, 所以走else分支 include scripts/basic/Makefile # 由于 $(hostprogs-y) 存在, 所以在 Makefile.build 同时满足如下条件: # Do not include host rules unless needed ifneq ($(hostprogs-y)$(hostprogs-m),) include scripts/Makefile.host endif #所以如下条件成立 # C code # Executables compiled from a single .c file host-csingle := $(foreach m,$(__hostprogs),$(if $($(m)-objs),,$(m))) #进入如下流程, 告诉我们如何编译.c和生成.cmd $(host-csingle): $(obj)/%: $(src)/%.c FORCE $(call if_changed_dep,host-csingle) 行为2 $(MAKE) $(build)=scripts/kconfig $@ =>make -f scripts/Makefile.build obj=scripts/kconfig menuconfig 其中 scripts/kconfig/Makefile:20:menuconfig: $(obj)/mconf 进入文件里面查看 menuconfig: $(obj)/mconf $< $(Kconfig) =>menuconfig: scripts/kconfig/mconf scripts/kconfig arch/x86/Kconfig 其中 ./scripts/kconfig/Makefile:11:Kconfig := arch/$(SRCARCH)/Kconfig
mconf 的作用是根据 kconfig 生成 .config
main{ conf_parse(av[1]); //解析Kconfig conf_read(NULL); set_config_filename(conf_get_configname()); //生成.config }
Linux之Makefile(filter)
https://blog.csdn.net/zhoudengqing/article/details/41777957makefile的wildcard函数
https://blog.csdn.net/qq_32693119/article/details/84701554Makefile中wildcard的介绍
https://www.cnblogs.com/haoxing990/p/4629454.htmllinux内核Makefile中的build构建机制
https://blog.csdn.net/metersun/article/details/52212842配置Linux Kernel时make menuconfig执行流程分析
https://www.cnblogs.com/LoTGu/p/5968042.htmlLinux 内核 Makefile 体系简单分析
https://blog.csdn.net/chenliujiang1989/article/details/7539211linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
https://blog.csdn.net/xdw1985829/article/details/6833319make menuconfig过程讲解 OS总结的文档不错
https://blog.csdn.net/a746742897/article/details/52247292 https://blog.csdn.net/qingkongyeyue/article/details/52503313