注:来自转载
原文链接:https://blog.csdn.net/jianwen_hi/article/details/53398141
何为Kconfig 它的作用是什么
内核源码编译过程
- 遍历每个源码目录(或配置指定的源码目录)Makefile
- 每个目录的Makefile 会根据Kconfig来定制要编译对象
- 回到顶层目录的Makeifle执行编译
那么我们就得出各个文件的作用:
Kconfig ---> (每个源码目录下)提供选项
.config ---> (源码顶层目录下)保存选择结果
Makefile---> (每个源码目录下)根据.config中的内容来告知编译系统如何编译
说到底,Kconfig就是配置哪些文件编译,那些文件不用编译。后期linux内核都做出了如下的图形界面,但由于要进行Linux内核驱动开发,需要向将驱动的代码添加到Makefile中一起编译,所以Kconfig的一些语法也该了解,于是有了这篇文章。
基本使用方法
我们以简单的单选项为案例来演示
例如,我们做好了一个驱动,需要将选项加入到内核的编译选项中,可以按以下步骤操作:
第一步 配置Kconfig
在driver目录下新建一个目录
mkdir driver/test
进入test目录,创建Kconfig文件
这里定义了一个TEST的句柄,Kconfig可以通过这个句柄来控制Makefile中是否编译,”Test driver”是显示在终端的名称。
具体的语法在Kconfig语法简介中介绍。
第二步 配置Makefile
在同样的目录中,新建一个Makefile
Obj-$(CONFIG_选项名) += xxx.o
/*当CONFIG_选项名=y时,表示对应目录下的xxx.c将被编译进内核
当CONFIG_选项名=m时对应目录下的xxx.c将被编译成模块*/
第三步 配置上层目录的Makefile与Kconfig
在上一层目录的Kconfig中
表示将test文件夹中的Kconfig加入搜寻目录
在上一层目录的Makefile中
结果,运行根目录的.config查看结果
Kconfig语法简介
单一选项
总体原则:每一个config就是一个选项,最上面跟着控制句柄,下面则是对这个选项的配置,如选项名是什么,依赖什么,选中这个后同时会选择什么。
1 config CPU_S5PC100 2 bool "选项名" 3 select S5P_EXT_INT 4 select SAMSUNG_DMADEV 5 help 6 Enable S5PC100 CPU support
config —> 选项
CPU_S5PC100 —>句柄,可用于控制Makefile 选择编译方式
bool —>选择可能:TRUE选中、FALSE不选 选中则编译,不选中则不编译。
如果后面没有字符串名称,则表示其不会出现在选择软件列表中
select —> 当前选项选中后则select后指定的选项自动被选择
1 depends on ARM || BLACKFIN || MIPS || COLDFIRE
depend on 依赖,后面的四个选择其中至少一个被选择,这个选项才能被选
1 config DM9000 2 tristate "DM9000 support"
tristate —> 选中并编译进内核、不选编译成模块
选项为数字
1 config ARM_DMA_IOMMU_ALIGNMENT 2 int "Maximum PAGE_SIZE order of alignment for DMA IOMMU buffers" ---->该选项是一个整型值 3 range 4 9 ---->该选项的范围值 4 default 8 ---->该选项的默认值 5 help 6 DMA mapping framework by default aligns all buffers to the smallest
4-8为这个数字的范围,运行结果
这里的defult其实也可以用在bool中
config STACKTRACE_SUPPORT bool --->该选项可以选中或不选,且不会出现在选择列表中 default y ---->表示缺省情况是选中
if..endif
1 if ARCH_S5PC100 --->如果ARCH_S5PC100选项选中了,则在endif范围内的选项才会被选 2 3 config CPU_S5PC100 4 bool "选项名" 5 select S5P_EXT_INT 6 select SAMSUNG_DMADEV 7 help 8 Enable S5PC100 CPU support 9 10 endif
举个例子,如果CPU没有选择使用多核CPU,则不会出现CPU个数的选项。
choice多个选项
1 choice --->表示选择列表 2 prompt "Default I/O scheduler" //主目录名字 3 default DEFAULT_CFQ //默认CFQ 4 help 5 Select the I/O scheduler which will be used by default for all 6 block devices. 7 8 config DEFAULT_DEADLINE 9 bool "Deadline" if IOSCHED_DEADLINE=y 10 11 config DEFAULT_CFQ 12 bool "CFQ" if IOSCHED_CFQ=y 13 14 config DEFAULT_NOOP 15 bool "No-op" 16 17 endchoice
menu与menuconfig
menu的用法
1 menu "Boot options" ----> menu表示该选项是不可选的菜单,其后是在选择列表的菜单名 2 3 config USE_OF 4 bool "Flattened Device Tree support" 5 select IRQ_DOMAIN 6 select OF 7 select OF_EARLY_FLATTREE 8 help 9 Include support for flattened device tree machine descriptions. 10 .... 11 12 endmenu ----> menu菜单结束
menu指的是不可编辑的menu,而menuconfig则是带选项的menu
menu和choice的区别
menu 可以多选 choice 是单项选择题
menuconfig的用法
1 menuconfig MODULES ---> menuconfig表示MODULE是一个可选菜单,其选中后是CONFIG_MODULES 2 bool "菜单名" 3 if MODULES 4 ... 5 endif # MODULES
说到底,menconfig 就是一个带选项的菜单,在下面需要用bool判断一下,选择成立后,进入if …endif 中间得空间。