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项出现在眼前了,为生活中的小惊喜而感动吧,亲~
在对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项出现在眼前了,为生活中的小惊喜而感动吧,亲~
相关文章推荐
- make menuconfig makefile kconfig详解
- 【linux】 Makefile之make menuconfig /uImage
- /opt/linux/linux-3.5/scripts/kconfig/Makefile:21: recipe for target 'menuconfig' failed错误
- 【linux】 Makefile之make menuconfig /uImage
- make menuconfig , Kconfig , Makefile , .config,弄清楚这四者的关系
- Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- Linux/Unix环境下的Make和Makefile详解
- Linux驱动基础开发 Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- Linux/Unix环境下的make和makefile详解
- [ 转载] Linux/Unix环境下的make和makefile详解2
- make menuconfig/.config/Kconfig解析
- Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- Linux/Unix环境下的make和makefile详解
- Linux/Unix环境下的make和makefile详解(非常详细, 推荐!)
- Linux/Unix环境下的make和makefile详解
- Linux/Unix环境下的make和makefile详解
- Linux2.6.0内核下make menuconfig时出现的问题及解决方法
- Linux/Unix环境下的make和makefile详解(非常详细, 推荐!)
- linux内核编译中的各种问题:No rule to make target `menuconfig'&&Unable to find the Ncurses libraries