linux编译配置过程,make menuconfig/.config/Kconfig的关系
Posted 丘木木
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux编译配置过程,make menuconfig/.config/Kconfig的关系相关的知识,希望对你有一定的参考价值。
首先要知道,内核配置跟三类文件有关,包括.config,Kconfig,Makefile,其中.config只有根目录下有,
Kconfig和Makefile在根目录和每个子目录都有,先说下他们的功能:
- Kconfig:定义配置项
- Makefile:说明配置项的编译方法
- .config:控制配置项编译进内核、编译成模块还是不编译
比如我要添加个wifi功能,那么首先要在网络的子目录下的Kconfig里面添加这个wifi功能的描述,添加下面内容:
config MY_TEST_WIFI
bool “My Test wifi”
然后再在这个目录下的Makefile文件中添加这个wifi功能的编译方法,比如依赖哪些c文件和h文件,添加如下内容:
obj-$(CONFIG_MY_TEST_WIFI) += mytestwifi.o
最后再在根目录下的.config文件中添加这个功能的开关,控制这个功能直接编译进内核源码,添加如下内容:
CONFIG_MY_TEST_WIFI = y
这样就完成了新功能的添加。
make menuconfig
生成的图形配置界面是根据Kconfig来的,具体的Kconfig语法看这里。当我们修改了驱动中的Kconfig文件
再次make menuconfig
,就可以看到我们添加的wifi设备了:
按“y”把它编译进内核,保存
就可以看到根目录下的.config文件中,有了:
因此配置内核,我们就可以得到下面结论了:
1、添加功能涉及到3类文件:.config,Kconfig,Makefile。在Kconfig中描述功能,在Makefile中描述功能编译方法,在.config中打开功能。
2、.config可以不修改,因为修改Kconfig后,make menuconfig
中就有对应条目了,在图形界面中修改对应条目实际上就是修改.config。
3、如果新的功能都添加完了,那么.config控制着每个功能的开关,因此是很重要的。make clean
会清除它,因此幸幸苦苦make menuconfig
裁剪完功能后,推荐它备份一下。
4、make %_defconfig命令会将arch/arm/configs/%_defconfig 文件复制为根目录下的.config 文件。因此作用和make menuconfig
相同。
这么一看要添加新功能好像很容,要添加新的驱动也很容易。再用一个例子巩固下。
给开发板添加RTL8723BU驱动。
去官方上下载RTL8723BU驱动源码,地址:http://github.com/lwfinger/rtl8723bu
把源码解压后放到\\drivers\\net\\wireless\\路径下
修改\\drivers\\net\\wireless\\这个目录下的Makefile和Kconfig文件
在Kconfig文件中添加以下部分
source "drivers/net/wireless/rtl8723BU/Kconfig"
这样我们就可以在make menuconfig
中配置这个驱动
在Makefile文件中添加以下部分
obj-$(CONFIG_RTL8723BU) += rtl8723BU/
接下来就make menuconfig
但是我们不仅要加载这个驱动,还需要配置内核使其支持wifi和usb,因为RTL8723是通过USB接在开发板上面的
1.支持USB设备
2.支持WIFI设备
3.支持无线网络IEEE 802.11
最后是我们的RTL8723
我们选择将其编译为模块
Device Drivers
Network device support
Wireless LAN
Realtek 8723B USB WiFi
然后我们编译内核
make XXXconfig(XXXconfig是你自己的配置文件)
make zImage
make modules就会生成8723bu.ko
那么当make的时候,发生了什么呢?为什么新的wifi功能就被编译进内核了呢?
我们make menuconfig
后
CONFIG_MY_TEST_WIFI = y
然后makefile中有:
obj-$(CONFIG_MY_TEST_WIFI) += mytestwifi.o
带入CONFIG_MY_TEST_WIFI = y
有:
obj-$y += mytestwifi.o
obj-$y就是所有要编译进内核的源码的集合。之后发生了什么,有兴趣可以去研究内核编译过程。
以上是关于linux编译配置过程,make menuconfig/.config/Kconfig的关系的主要内容,如果未能解决你的问题,请参考以下文章
为啥linux下要configure然后make make install
大型项目使用Automake/Autoconf完成编译配置(标准的编译过程已经变成了简单的三部曲:configure/make/make install,)
编译linux内核的时候,我在.config文件中修改了配置选项,然后执行make,为啥它又给我改回去了?