谁唤醒了 menuconfig
在茫茫的编译的目标中,是谁唤醒了这个沉睡着的menuconfig? 那就让我来找一找吧。
首先我想到的就是搜这个关键字,总有个target叫这个名字吧。恩,终于皇天不负有心人,被我找到了。
在scripts/kconfig/Makefile,有这么个目标。
$< $(Kconfig)
不过这个已经是很底层了,那这个怎么也得有上层调用到才好。然后又回到主Makefile,搜kconfig关键字。
怎么着,主Makefile也得include kconfig中的什么东东吧,或者间接include?
话说我还真运气好,还找到了。 主Makefile中有这么两个target。
include $(srctree)/arch/$(SRCARCH)/Makefile
export KBUILD_DEFCONFIG KBUILD_KCONFIG
config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
那这个 build 变量又是什么个东西?同文件中没有定义这个变量, 没办法,再找include的文件。
还好,这次第一个就找到了。 在scripts/Kbuild.include 中,有这么个。
###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
原来就是个缩写。。。 那我打出上面两个命令来看看究竟是怎么执行的吧。
mkdir -p include/linux include/config
make -f scripts/Makefile.build obj=scripts/kconfig menuconfig
哦,原来是这么调用的。 那就是要看 scripts/Makefile.build了。
恩,又是一顿狂找,最后发现,原来是在scripts/Makefile中有这个。。。
src := $(obj)
# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
include $(kbuild-file)
哈,是不是发现了什么。 obj是作为变量传入的,这个时候obj 等于 scripts/kconfig 。
然后确定kbuild-dir是哪个目录,再确定kbiuld-file是哪个文件,也就是很多文档中写的,
如果有Kbuild就用kbuild,如果没有就用Makefile。
在scripts/kconfig中,只有Makefile, 那就包含了进来。
这个时候真相就大白于天下了。 终于见到了我们最初遇见的 scripts/kconfig/Makefile。
你是不是也明白了呢?
揭开menuconfig 的面目
我们终于找到了那个深藏在地底的menuconfig,将它唤醒到了地面。那就让我们来看看他究竟长什么样子吧。
接着上面的顺序,menuconfig是在 scripts/kconfig/Makefile 中被唤醒的。
menuconfig: $(obj)/mconf
$< $(Kconfig)
将这句话展开,
menuconfig: scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
原来是个叫mconf的东东藏在了scripts/kconfig目录里。 在scripts/kconfig/Makefile中,略微这么一搜,发现了
好东西。
lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
mconf-objs := mconf.o zconf.tab.o $(lxdialog)
ifeq ($(MAKECMDGOALS),menuconfig)
hostprogs-y += mconf
endif
mconf是一个host目标,也就是一个用户空间的应用程序。 他由 上面一共8个文件组成。
啊,不错,原来这就是个应用程序呢。那他究竟做了点什么呢?