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。这个我觉得基本上就能满足大部分的内核脚本配置要求的了。   

相关内容