Linux 内核脚本文件Kconfig
//Rocky@20110312
Android Kconfig 入门
万事开头难,希望可以说明白Linux内核脚本文件的语法。本文只讲基础简单入门型的。
内核脚本文件语法主要包含以下几个方面
一:菜单入口config
大多数的内核配置文件都对应Kconfig的一个菜单入口。也就是一项。最常见的如下所示:
#rocky@20110312 add
config DEC_TOUCH_A
bool "Touch A"
default n
depends on USE_TOUCH
help
Please add word here to help understand what it is
you can add just like this .
#rocky@20110312 end
分析以上语法如下:
以#开头表示此行后面都是注释。
"config" 关键字定义新的配置选项,之后的几行定义了这个配置选项的一些属性。这些属性包含类型,数据范围,输入提示,依赖关系,
帮助信息,以及默认值等。
每个配置选项都必须指定类型,类型包括 bool ,tristate,string,hex ,int 。其中string和tristate是两种最基础的类型。其他类型都是
基于这两种基本的类型。类型后面紧跟着提示,下面的两段脚本是等价的。
脚本1
bool "Touch A"
脚本2
bool
prompt "Touch A"
通过default关键词,可以设置默认值。如我们行面的示例所示一样,默认值是 n
依赖关系也是非常重要的一个概念,表示此项的存在和多个菜单选项是相连在一起的。
依赖关系的格式如下所示
depends on <expr>
例如例子中所示的一样。
只有当USE_TOUCH为Y的情况下,TOUCH_A可以为Y或者N,当USE_TOUCH为N的情况下,TOUCH_A只能为为N.
help关键词表示帮助信息,格式如下:
help (或 --help--)
开始
.......
结束
这样我们就可以完成最基本的config配置
二:菜单结构Menu
菜单入口在菜单树种的位置可以由两种方式来决定。第一种方式是如下所示:
menu "Network device support"
depends on NET
config DEVICE_A
....
endmenu
所有处于menu和endmenu之间的菜单入口会成为Network device support的子菜单想。所有的子菜单都会集成父菜单的依赖关系。例如
menu Network device support 对NET的依赖会传递到子菜单的所有项里面。
初次之外,Kconfig还可以使用comment,if endif ,choice endchoice这类的语法。简单介绍下
##choices endchoices 语法结构如下所示:
choices
<choice options>
<choice block>
endchoice
给个实例,menu中的config可以表示一项,当我们有单选题的时候,例如一个系统我们给内核定义版本。此时只能选一种,且必须选一种。
choice
prompt "select one item"
default ITEM_B
config ITEM_A
bool "ITEM_MODE_A"
default n
help
this is item_mode_a for ....
.......ITEM_B
.......ITEM_C
endchoice
这样就完成了一个单选题的设计。注意的是choice下的prompt必须存在,否则没有任何提示,看不见。
里瓦,可以设置choice的default,如果不设置,则第一个就是默认值。
comment 表示可见的注释的意思。例如Menu就会进入新一页,这个时候使用comment来注释一段话,做为抬头非常适合。
if ..endif if 后面跟着config值,这样表示一个选择判断关系。当为Y或者M时,才显示中间包含的内容。
另外一种情况就是给menu加一个选择。
另外还有一种是非常常用的,就是menuconfig,给menu当成一个config来配置,所以就有menuconfig这种语法。
menuconfig MENU_PROJECT_CBS
bool "提示信息"
default 默认值
depends on 依赖项
if MENU_PROJECT_CBS
endif
也给出一个示例,按照这个来做就肯定没有问题。
menuconfig CBS_PROJECT
bool "CBS_PROJECT"
if CBS_PROJECT
choice
prompt "select one porject"
config PROJECT_CBS7001
bool "CBS7001" #bool type
default n #default n
help
this is cbs7001
config PROJECT_CBS7002
bool "CBS7002"
default n
help
this is cbs7002
config PROJECT_CBS7003
bool "CBS7003"
default n
help
this is cbs7003
endchoice
endif
##注意这个menuconfig没有endmenu这个关键词,它就是相当于一个config。这个我觉得基本上就能满足大部分的内核脚本配置要求的了。