您的位置:首页 > 其它

make menuconfig的执行详情

2015-10-14 11:10 405 查看
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个文件组成。

啊,不错,原来这就是个应用程序呢。那他究竟做了点什么呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kernel makefile