make menuconfig跟踪

来源:互联网 发布:中国停止登月计划 知乎 编辑:程序博客网 时间:2024/06/07 10:02

谁唤醒了 menuconfig

在茫茫的编译的目标中,是谁唤醒了这个沉睡着的menuconfig? 那就让我来找一找吧。

首先我想到的就是搜这个关键字,总有个target叫这个名字吧。恩,终于皇天不负有心人,被我找到了。

在scripts/kconfig/Makefile,有这么个目标。


menuconfig: $(obj)/mconf                                                                                              

        $< $(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个文件组成。

啊,不错,原来这就是个应用程序呢。那他究竟做了点什么呢?



原创粉丝点击