Kconfig文档的作用

2.6 内核的源码树目录下一般都会有两个文文: Kconfig Makefile 。分布在各目录下的 Kconfig 构成了一个分布式的内核配置数据库,每个 Kconfig 分别描述了所属目录源文件相关的内核配置菜单。在内核配置 make menuconfig( xconfig ) 时,从 Kconfig 中读出配置菜单,用户配置完后保存到 .config( 在顶层目录下生成 ) 中。在内核编译时,主 Makefile 调用这个 .config ,就知道了用户对内核的配置情况。

上面的内容说明: Kconfig 就是对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,可以通过修改 Kconfig 来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的 Makefile

因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个)

*Kconfig
*Makefile

要想知道怎么修改这两种文件,就要知道两种文档的语法结构。

First:   Kconfig

 

每个菜单项都有一个关键字标识,最常见的就是 config

语法:
config symbol

options

symbol 就是新的菜单项, options 是在这个新的菜单项下的属性和选项

其中 options 部分有:

1
、类型定义:
每个 config 菜单项都要有类型定义, bool :布尔类型, tristate 三态:内建、模块、移除, string :字符串, hex :十六进制, integer :整型

例如 config HELLO_MODULE
bool "hello test module"

bool
类型的只能选中或不选中, tristate 类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在 .config 中生成一个 CONFIG_HELLO_MODULE=m 的配置,假如选择内建,就是直接编译成内核影响,就会在 .config 中生成一个 CONFIG_HELLO_MODULE=y 的配置 .

2
、依赖型定义 depends on requires
指此菜单的出现是否依赖于另一个定义

config HELLO_MODULE
bool "hello test module"
depends on ARCH_PXA
   
这个例子表明 HELLO_MODULE 这个菜单项只对 XScale 处理器有效,即只有在选择了 ARCH_PXA 该菜单才可见 ( 可配置 )

3
、帮助性定义
只是增加帮助用关键字 help ---help---

更多详细的 Kconfigconfig 语法可参考:


Second: 
内核的 Makefile

内核的 Makefile 分为 5 个组成部分:
Makefile     
最顶层的 Makefile
.config        
内核的当前配置文档,编译时成为顶层 Makefile 的一部分
arch/$(ARCH)/Makefile
和体系结构相关的 Makefile
s/ Makefile.*   
一些 Makefile 的通用规则
kbuild Makefile      
各级目录下的大概约 500 个文档,编译时根据上层 Makefile 传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。

顶层的 Makefile 文档读取 .config 文档的内容,并总体上负责 build 内核和模块。 Arch Makefile 则提供补充体系结构相关的信息。 s 目录下的 Makefile 文档包含了任何用来根据 kbuild Makefile 构建内核所需的定义和规则。

(其中 .config 的内容是在 make menuconfig 的时候,通过 Kconfig 文档配置的结果)


linux2.6.x/Documentation/kbuild 目录下有详细的介绍有关 kernel makefile 的知识。

最后举个例子:
假设想把自己写的一个 flash 的驱动程式加载到工程中,而且能够通过 menuconfig 配置内核时选择该驱动该怎么办呢?能够分三步:

第一:将您写的 flashtest.c 文档添加到 /driver/mtd/maps/ 目录下。

第二:修改 /driver/mtd/maps 目录下的 kconfig 文档:
config MTD_flashtest
tristate “ap71 flash"

这样当 make menuconfig ,将会出现 ap71 flash 选项。

第三:修改该目录下 makefile 文档。
添加如下内容: obj-$(CONFIG_MTD_flashtest)    += flashtest.o

这样,当您运行 make menucofnig 时,您将发现 ap71 flash 选项,假如您选择了此项。该选择就会保存在 .config 文档中。当您编译内核时,将会读取 .config 文档,当发现 ap71 flash 选项为 yes 时,系统在调用 /driver/mtd/maps/ 下的 makefile 时,将会把 flashtest.o 加入到内核中。即可达到您的目的。

猜你喜欢

转载自haohetao.iteye.com/blog/994640