您的位置:首页 > 运维架构 > Linux

linux make menuconfig\Makefile\Kconfig 详解

2013-08-06 20:11 309 查看
如果您知道.config、Makefile、Kconfig,那么您就往下练吧!

在对linux进行编译的时候,经常会用到make menuconfig这样的图形化操作界面对系统进行剪裁。但是如果拿到一份代码就贸然的使用make menuconfig这样的命令来调用图形界面的话,可能会遇到一些小小的麻烦。比如我们有自己的defconfig文件存放在arch/arm/configs文件夹下,我们希望这次进行配置之后仅仅修改我们想要剪裁或者添加的部分,但是最终发现在这个过程中没有得到我们想要的结果。在这种情况下,正确的处理方法应该是,使用cp命令将需要的defconfig文件拷贝为.config文件,然后配置ARCH为我们需要使用的架构,然后再调用make
menuconfig进行配置,记得配置完成后要将.config文件回拷,从而保证修改被正确记录。因为在android等外部系统的编译过程中,仍然会使用arch/arm/configs文件下的文件进行编译。

    在采用图形化界面的情况下,通常会遇到需要在kernel文件夹之外的脚本文件中规定编译时所使用的*_defconfig文件。这样通常情况下,我们进行make menuconfig之后的文件会被arch/xxx/configs目录下的*_defconfig文件进行覆盖。而解决这个问题的办法就是在make menuconfig之后把文件中改动的部分merge到arch/xxx/configs目录下的*_defconfig文件中。这样我们的改动就会被永久的保存了。

了解了上面的机制之后,对平时进行正常的工作已经是足够了。但是如果还想继续探索更深的原理性的东西,可以继续往下看。

首先在kernel目录下进行make menuconfig操作的时候,在出现图形化操作界面之前可以看到这样一行信息

scripts/kconfig/mconf  Kconfig

这行信息告诉我们的内容足够让我们去研究半天了,首先看一下Kconfig吧,最简单的思维方式就是看一下当前目录下的Kconfig文件这个文件中告诉我们要

source "arch/$SRCARCH/Kconfig"

那现在又出现一个问题,到底宏SRCARCH是被定义为何值?

从Makefile文件中找到了这样的几行

export KBUILD_BUILDHOST := $(SUBARCH)

ARCH            ?= arm

ARCH            ?= $(SUBARCH)

CROSS_COMPILE   ?= arm-linux-androideabi-

#CROSS_COMPILE  ?= $(CONFIG_CROSS_COMPILE:"%"=%)

# Architecture as present in compile.h

UTS_MACHINE     := $(ARCH)

SRCARCH         := $(ARCH)

由此可以看出SRCARCH是指arm,那么现在就非常明确的知道了前面所讲述的

scripts/kconfig/mconf  Kconfig的后半部分,那前半部分现在就到相应的目录下去看一下,scripts/kconfig/目录中确实存在这样一个mconf文件,

此处大胆猜测,前面是一个可执行文件后面是它的参数,那么我们可以知道Kconfig文件就是整个配置的入口。此处正确与否后续再研究。

那去看一下这个Kconfig文件吧……

发现确实存在好多我们应该看到的信息,那就这样吧……

既然到了scripts/kconfig目录下,肯定要去看一下这里面很重要的文件,大家知道在看C语言代码时很重要的就是去看一下头文件,那在linux中很重要的文件就是Makefile文件和Kconfig文件。那不妨就来看一下kconfig文件,不看不知道一看真奇妙,居然木有。那好吧Makefile

xconfig: $(obj)/qconf

        $< $(Kconfig)

gconfig: $(obj)/gconf

        $< $(Kconfig)

menuconfig: $(obj)/mconf

        $< $(Kconfig)

config: $(obj)/conf

        $< --oldaskconfig $(Kconfig)

nconfig: $(obj)/nconf

        $< $(Kconfig)

oldconfig: $(obj)/conf

        $< --$@ $(Kconfig)

silentoldconfig: $(obj)/conf

        $(Q)mkdir -p include/generated

        $< --$@ $(Kconfig)

看到这,惊起一滩鸥鹭,原来你也在这里。平时用到的各种make XXconfig。

那就这样吧……

往下看,看到这里的时候我和我的小伙伴们都惊呆了

defconfig: $(obj)/conf

ifeq ($(KBUILD_DEFCONFIG),)

        $< --defconfig $(Kconfig)

else

        @echo "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"

        $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)

endif

%_defconfig: $(obj)/conf

        $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

难道跟前面提到的arch/arm/configs/下面的各种defconfig文件有千丝万缕的剪不断理还乱的关系?我们姑且这么认为吧……但是此处好像确实没多大关系,姑且不论吧,因为这些我也没看懂。不过事实上,还真没受它的影响。

所以此处暂且不表。

有时也会遇到想打开的config文件在make menuconfig的时候无法找到的情况,这时候我们可以搜索一下想要打开的文件的依赖的config是否已经打开,这个非常关键。如果config项不是自己写的,而是内核自带的一些程序文件很容易产生这样的情况。我们可以在Kconfig文件中进行读取,并且将这些依赖的文件依次进行打开相应的config文件就可以看到需要的config项出现在眼前了,为生活中的小惊喜而感动吧,亲~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: