Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148229
  • 博文数量: 43
  • 博客积分: 3000
  • 博客等级: 中校
  • 技术积分: 601
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-22 17:24
文章分类
文章存档

2010年(43)

我的朋友

分类: LINUX

2010-12-06 21:16:01

首先说明,这是一种只有在vivi 中使用的配置语言,非常的简单,常用的总共也超不过10句话。
由于是直接从网上cp下来的,所以看的时候注意几点
1.tristate 在询问语句中不支持
2.在依赖语句中只支持bool
3.在choice 中也只支持bool
4.在if的条件中也只支持bool,但是有 或-o 与-a , = ,!= ,的差别
好了,看吧!!
其实最好的学习方法还是在 vivi源码的arch/config.in中去实际的体会,写一个make menuconfig的界面,同时结合这里去学!一个小时肯定能搞定。。 

1. 介绍
Config语言不是bash. Config语言是一种Linux内核配置语言. config.in and Config.in都是使用本语言编制而成. 尽管它看起来,通常工作时,很象一个SH语言的子集,CONFIG语言有更加严格的语法和不同的语义.
CONFIG语言编程的基本指南:仅使用在CONFIG.IN文件中出现的编程语句.


2. 说明
有四个配置程序可以解释和识别Config语言:
l        scripts/Configure        make config、make oldconfig、
l        scripts/Menuconfig      make menuconfig
l        scripts/tkparse          make xconfig
l        mconfig            (in development)
'Configure' 是一个bash脚本语言,它解释了Config.in文件;'Menuconfig'是另外一种bash脚本.


3. 语句
一个Config语言脚本是由一系列的语句构成的。共有21个简单的语句;一个'if'语句;菜单块和一个 'source'语句。
一行结尾处的'\' 表示续行。
'#'用于引入一个注释, 该注释一直保持到该行的结尾. 但是,如果是多行的形如'# ... is not set'的并不是注释,它们具有语义。
    不能用;(分号)来开始一个新行。 'if'语句中的处可以开始一个新行。


3.1基本的语法元素:
    /prompt/——一个位于单引号或双引号内的字符串. 如果字位于双引号内,它不需要任何$。
    /word/——一个未加引号的字, 位于单引号或双引号内的字符串。如果字未加引号或是位于双引号内的需要$号。
    /symbol/——一个没有引号的字. symbol必须以CONFIG_*的形式出现。
    /dep/ ——一个相关字. 运行时/dep/ 必须等于 "y", "m", "n",或 ""。
    /expr/——一类bash的表达式,使用以下运算符:'='、 '!='、 '-a'、 '-o'和'!'。


3.2 所有的语句:

文字语句:
        mainmenu_name          /prompt/
        comment              /prompt/
        text                    /prompt/

l        mainmenu_name /prompt/
用于指定本CONFIG语言文件顶层的名字。
例如:
    # arch/sparc/config.in
    mainmenu_name "Linux/SPARC Kernel Configuration"
l        comment /prompt/
此语句用于在用户配置过程中向用户显示提示信息,同时在输出期间也把它返回给输出文件。注意:此处的prompt,象所有的prompt一样,是一个没有$符号、位于引号内的字符串。
'comment'并不用于对一个CONFIG语言的注释。它用于用户接口显示文字,以及向输出文件中写入输出信息。
例如:
    # drivers/net/Config.in
    comment 'CCP compressors for PPP are on
ly built as modules.'
l        text /prompt/
向用户显示提示信息。不向输出文件中写入提示信息。仅 mconfig 在它的帮助中使用此命令。
例如:
    # mconfig internal help text
    text 'Here are all the mconfig command line options.'l       


询问语句:
        bool            /prompt/ /symbol/
        hex            /prompt/ /symbol/ /word/
        int              /prompt/ /symbol/ /word/
        string            /prompt/ /symbol/ /word/
        tristate            /prompt/ /symbol/

例如:

bool /prompt/ /symbol/
此命令用于向用户显示/prompt/提示信息,并从用户接收数据,并把该数据赋给/symbol/。合法的输入值为 "n" 和"y"。
注意:此命令没有默认值。
    # arch/i386/config.in
    bool ''Symmetric multi-processing support'' CONFIG_SMP
l        hex /prompt/ /symbol/ /word/
此命令显示/prompt/提示信息给用户,并从用户接收数据值,并赋给 /symbol/。合法输入值为十六进制数。  /word/ 是默认值。
例如:
    # drivers/sound/Config.in
    hex ''I/O base for SB Check from manual of the card'' CONFIG_SB_BASE 220
l        int /prompt/ /symbol/ /word/
此命令向用户显示/prompt/提示信息,接收用户输入值,并赋给/symbol/。 /word/是默认值。
合法输入值:十进制数。
例如:
    # drivers/char/Config.in
    int ''Maximum number of Unix98 PTYs in use (0-2048)'' \ CONFIG_UNIX98_PTY_COUNT 256
l        string /prompt/ /symbol/ /word/
此命令向用户显示/prompt/提示信息,接收用户输入值,并赋给/symbol/。 /word/是默认值。
合法输入值: ASCII字符串(''"'' and ''\\''除外). 
例如:
    # drivers/sound/Config.in
    string ''  Full pathname of DSPxxx.LD firmware file'' \ CONFIG_PSS_BOOT_FILE /etc/sound/dsp001.ld
l        tristate /prompt/ /symbol/
此命令向用户显示/prompt/提示信息,接收用户输入值,并赋给/symbol/。
合法输入值:"n", "m", or "y"。
"m"代表"module",它表示/symbol/应该被编译为内核module,仅当CONFIG_MODULES的当前值为Y时,m值合法。
无默认值。
例如:
    # fs/Config.in
    tristate ''NFS filesystem support'' CONFIG_NFS_FS

字义语句:
        define_bool        /symbol/ /word/
        define_hex        /symbol/ /word/
        define_int          /symbol/ /word/
        define_string        /symbol/ /word/
        define_tristate        /symbol/ /word/

l        define_bool /symbol/ /word/
此命令把/word/的值赋给/symbol/。合法值为"n" 或"y"。
例如:
    # arch/alpha/config.in
    if [ "$CONFIG_ALPHA_GENERIC" = "y" ]
    then define_bool CONFIG_PCI y
            define_bool CONFIG_ALPHA_NEED_ROUNDING_EMULATION y fi
l        define_hex /symbol/ /word/
此命令把/word/的值赋给/symbol/。合法值:十六进制数。
例如:
    # Not from the corpus
    bool ''Specify custom serial port'' CONFIG_SERIAL_PORT_CUSTOM
    if [ "$CONFIG_SERIAL_PORT_CUSTOM"
= "y" ]; then hex ''Serial port number'' CONFIG_SERIAL_PORT else
define_hex CONFIG_SERIAL_PORT 0x3F8 fi
l        define_int /symbol/ /word/
此命令把/word/的值赋给/symbol/。合法值:十进制数。
例如:
    # drivers/char/ftape/Config.in
    define_int CONFIG_FT_ALPHA_CLOCK 0
l        define_string /symbol/ /word/
此命令把/word/的值赋给/symbol/。合法输入值: ASCII字符串(''"'' and ''\\''除外). 
例如:
    # Not from the corpus
    define_string CONFIG_VERSION "2.2.0"
l        define_tristate /symbol/ /word/
此命令把/word/的值赋给/symbol/。合法输入值"n"、"m"、和"y"。

例如:
    # drivers/video/Config.in
    if [ "$CONFIG_FB_AMIGA" = "y" ]; then define_tristate CONFIG_FBCON_AFB y
      define_tristate CONFIG_FBCON_ILBM y else if [ "$CONFIG_FB_AMIGA" = "m" ]; then define_tristate CONFIG_FBCON_AFB m
          define_tristate CONFIG_FBCON_ILBM m fi fi


相关语句:
        dep_bool        /prompt/ /symbol/ /dep/ ...
        dep_mbool      /prompt/ /symbol/ /dep/ ...
        dep_hex        /prompt/ /symbol/ /word/ /dep/ ...
        dep_int          /prompt/ /symbol/ /word/ /dep/ ...
        dep_string        /prompt/ /symbol/ /word/ /dep/ ...
        dep_tristate        /prompt/ /symbol/ /dep/ ...

l        dep_bool /prompt/ /symbol/ /dep/ ...
此命令对所有在dependency list中的dependencies进行评估,任何一个值为"y"的dependency没有限制输入范围。任何一个值为空的dependency 被忽略,任何一个值为"n"或其他值(比如 "m")的dependency 限制输入为"n"。不允许对dependencies加引号。
如果输入范围被限制为单选"n",dep_bool把"n"赋给/symbol/。如果是多选,dep_bool向用户显示/prompt/提示信息,从用户接收数据,并赋值给/symbol/。
例如:
    # drivers/net/Config.in
    dep_bool  ''Aironet 4500/4800 PCI support ''  CONFIG_AIRONET4500_PCI  $CONFIG_PCI
l        dep_mbool /prompt/ /symbol/ /dep/ ...
此 命令对所有在dependency list中的dependencies进行评估,任何一个值为"y"或"m"的dependency没有限制输入范围。任何一个值为空的 dependency 被忽略,任何一个值为"n"或其他值(比如 "m")的dependency 限制输入为"n"。不允许对dependencies加引号。
如果输入范围被限制为单选"n",dep_bool把"n"赋给/symbol/。如果是多选,dep_bool向用户显示/prompt/提示信息,从用户接收数据,并赋值给/symbol/。
例如:
    # Not from the corpus
    dep_mbool ''Packet socket: mmapped IO'' CONFIG_PACKET_MMAP $CONFIG_PACKET
l        dep_hex /prompt/ /symbol/ /word/ /dep/ ...
l        dep_int /prompt/ /symbol/ /word/ /dep/ ... 
l        dep_string /prompt/ /symbol/ /word/ /dep/ ...
l        dep_tristate /prompt/ /symbol/ /dep/ ...
此 命令对所有在dependency list中的dependencies进行评估,任何一个值为"y"的dependency没有限制输入范围。任何一个值为"m"的dependency 限制输入为"m"或"n",任何一个值为空的dependency 被忽略,任何一个值为"n"或其他值(比如 "m")的dependency 限制输入为"n"。不允许对dependencies加引号。
如果输入范围被限制为单选"n",dep_bool把"n"赋给/symbol/。如果是多选,dep_bool向用户显示/prompt/提示信息,从用户接收数据,并赋值给/symbol/。
例如:
    # drivers/char/Config.in
    dep_tristate ''''Parallel printer support'''' CONFIG_PRINTER $CONFIG_PARPORT


未设置语句:
        unset                    /symbol/ ...

例如:

l        unset /symbol/ ...
此命令向/symbol/赋值"",,但是不把/symbol/输出到输出文件中
    # arch/mips/config.in
    unset CONFIG_PCI
    unset CONFIG_MIPS_JAZZ
    unset CONFIG_VIDEO_G364


 
选项语句:
        choice          /prompt/ /word/ /word/
        nchoice        /prompt/ /symbol/ /prompt/ /symbol/ ...

l        choice /prompt/ /word/ /word/
此命令实现一个选项列表或"radio button list"选项。向用户显示/prompt/和一组有着对应符号的子提示信息。
当用户选择了一个值时,choice命令设置相应的symbol值为"y",并把其他所有在此choice list中的项的值设置为 "n"。
第二个参数是用单引号或双引号内的字,用于描述一些子提示符或符号名。解释器根据空格把字分成一个子字列表。第一个子字就是第一个提示信息。第二个子字就是第一个符号。第三个子字是第二个提示信息。第四个子字是第二个符号....
第三个参数是一个缩写,它的值必须是这些提示信息之一的唯一缩写。对应于这个提示信息的符号就是默认的使能符号。
例如:
    # arch/i386/config.in
    choice          ''''PCI access mode'''' \ 
"BIOS    CONFIG_PCI_GOBIOS  \
  Direct  CONFIG_PCI_GODIRECT    \
  Any  CONFIG_PCI_GOANY"      Any
l        nchoice /prompt/ /symbol/ /prompt/ /symbol/ ...
此命令与choice命令有着相同的语义,但是有着更为敏感的语法。第一个/prompt/是整个choice list的主提示信息。
第一个/symbol/ 是使能的默认符号(注意:这仅是一个符号,并不是唯一的提示信息缩写)。接下来的/prompt/ 和/symbol/ 对是choice list的提示信息和符号。


If语句:
        if [ /expr/ ] ; then /statement/
        ... fi
        if [ /expr/ ] ; then /statement/
        ... else /statement/
        ... fi


菜单块:
        mainmenu_option next_comment
        comment /prompt/ /statement/ ... endmenu

 

Source语句:
        source /word/

 

下面是MMC/SD卡驱动的Config.in内容,做了一个简单的注释

#

# MMC subsystem configuration

# 注释项表明驱动设备的类型

mainmenu_option next_comment

comment 'MMC/SD Card support'

#引入新的菜单,comment后是新菜单的名称,所有归属与此菜单的配置都在comment和endmenu之间

#下面是询问语句先显示提示字符串/prompt/等待用户输入,并把输入结果赋给/symbol/

#tristate取值范围包括y,n,m三态,bool对应的是y,n两态

tristate 'MMC support' CONFIG_MMC

if [ "$CONFIG_MMC" = "y" -o "$CONFIG_MMC" = "m" ]; then

bool ' MMC debugging' CONFIG_MMC_DEBUG

if [ "$CONFIG_MMC_DEBUG" = "y" ]; then

#询问语句接受int型数据

    int ' MMC debugging verbosity (0=quiet, 3=noisy)' CONFIG_MMC_DEBUG_VERBOSE 0

fi

if [ "$CONFIG_MMC_S3C2410" = "y" -o "$CONFIG_ARCH_H5400" = "y" -o "$CONFIG_ARCH_H2200" = "y" ] ; then

    tristate ' Samsung MMC ASIC Support' CONFIG_MMC_SAMSUNG_ASIC

#下面是依赖语句只有/dep/中所有项都为y才显示/prompt/,同样是三态选择

    dep_tristate '    S3C2410 SD/MMC Support' CONFIG_MMC_S3C2410 $CONFIG_MMC_SAMSUNG_ASIC $CONFIG_ARCH_S3C2410

    dep_tristate '    H5400 SD/MMC Support' CONFIG_MMC_H5400 $CONFIG_MMC_SAMSUNG_ASIC $CONFIG_ARCH_H5400

    dep_tristate ' ASIC3 SD/MMC support' CONFIG_MMC_ASIC3 $CONFIG_IPAQ_HAS_ASIC3

fi

fi

endmenu



另一篇文档

l         bool /prompt/ /symbol/

此命令用于向用户显示/prompt/提示信息,并从用户接收数据,并把该数据赋给/symbol/。合法的输入值为 "n" "y"

注意:此命令没有默认值。

例如:

    # arch/i386/config.in

    bool ''Symmetric multi-processing support'' CONFIG_SMP

l         hex /prompt/ /symbol/ /word/

此命令显示/prompt/提示信息给用户,并从用户接收数据值,并赋给 /symbol/。合法输入值为十六进制数。  /word/ 是默认值。

例如:

    # drivers/sound/Config.in

    hex ''I/O base for SB Check from manual of the card'' CONFIG_SB_BASE 220

l         int /prompt/ /symbol/ /word/

此命令向用户显示/prompt/提示信息,接收用户输入值,并赋给/symbol/ /word/是默认值。

合法输入值:十进制数。

例如:

    # drivers/char/Config.in

    int ''Maximum number of Unix98 PTYs in use (0-2048)'' \ CONFIG_UNIX98_PTY_COUNT 256

l         string /prompt/ /symbol/ /word/

此命令向用户显示/prompt/提示信息,接收用户输入值,并赋给/symbol/ /word/是默认值。

合法输入值: ASCII字符串(''"'' and ''\\''除外).

例如:

    # drivers/sound/Config.in

    string ''  Full pathname of DSPxxx.LD firmware file'' \ CONFIG_PSS_BOOT_FILE /etc/sound/dsp001.ld

l         tristate /prompt/ /symbol/

此命令向用户显示/prompt/提示信息,接收用户输入值,并赋给/symbol/

合法输入值:"n", "m", or "y"

"m"代表"module",它表示/symbol/应该被编译为内核module,仅当CONFIG_MODULES的当前值为Y时,m值合法。

无默认值。

例如:

    # fs/Config.in

    tristate ''NFS filesystem support'' CONFIG_NFS_FS

l         define_bool /symbol/ /word/

此命令把/word/的值赋给/symbol/。合法值为"n" "y"

例如:

    # arch/alpha/config.in

    if [ "$CONFIG_ALPHA_GENERIC" = "y" ]

    then define_bool CONFIG_PCI y

            define_bool CONFIG_ALPHA_NEED_ROUNDING_EMULATION y fi

l         define_hex /symbol/ /word/

此命令把/word/的值赋给/symbol/。合法值:十六进制数。

例如:

    # Not from the corpus

    bool ''Specify custom serial port'' CONFIG_SERIAL_PORT_CUSTOM

    if [ "$CONFIG_SERIAL_PORT_CUSTOM" = "y" ]; then hex ''Serial port number'' CONFIG_SERIAL_PORT else define_hex CONFIG_SERIAL_PORT 0x3F8 fi

l         define_int /symbol/ /word/

此命令把/word/的值赋给/symbol/。合法值:十进制数。

例如:

    # drivers/char/ftape/Config.in

    define_int CONFIG_FT_ALPHA_CLOCK 0

l         define_string /symbol/ /word/

此命令把/word/的值赋给/symbol/。合法输入值: ASCII字符串(''"'' and ''\\''除外).

例如:

    # Not from the corpus

    define_string CONFIG_VERSION "2.2.0"

l         define_tristate /symbol/ /word/

此命令把/word/的值赋给/symbol/。合法输入值"n""m"、和"y"

例如:

    # drivers/video/Config.in

    if [ "$CONFIG_FB_AMIGA" = "y" ]; then define_tristate CONFIG_FBCON_AFB y

       define_tristate CONFIG_FBCON_ILBM y else if [ "$CONFIG_FB_AMIGA" = "m" ]; then define_tristate CONFIG_FBCON_AFB m

          define_tristate CONFIG_FBCON_ILBM m fi fi

l         dep_bool /prompt/ /symbol/ /dep/ ...

此命令对所有在dependency list中的dependencies进行评估,任何一个值为"y"dependency没有限制输入范围。任何一个值为空的dependency 被忽略,任何一个值为"n"或其他值(比如"m")dependency 限制输入为"n"。不允许对dependencies加引号。

如果输入范围被限制为单选"n",dep_bool"n"赋给/symbol/。如果是多选,dep_bool向用户显示/prompt/提示信息,从用户接收数据,并赋值给/symbol/

例如:

    # drivers/net/Config.in

    dep_bool  ''Aironet 4500/4800 PCI support ''  CONFIG_AIRONET4500_PCI  $CONFIG_PCI

l         dep_mbool /prompt/ /symbol/ /dep/ ...

此命令对所有在dependency list中的dependencies进行评估,任何一个值为"y""m"dependency没有限制输入范围。任何一个值为空的dependency 被忽略,任何一个值为"n"或其他值(比如 "m")dependency 限制输入为"n"。不允许对dependencies加引号。

如果输入范围被限制为单选"n",dep_bool"n"赋给/symbol/。如果是多选,dep_bool向用户显示/prompt/提示信息,从用户接收数据,并赋值给/symbol/

例如:

    # Not from the corpus

    dep_mbool ''Packet socket: mmapped IO'' CONFIG_PACKET_MMAP $CONFIG_PACKET

阅读(968) | 评论(0) | 转发(0) |
0

上一篇:vivi源码(一)

下一篇:kernel的移植(笔记)

给主人留下些什么吧!~~