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/ 询问语句: bool /prompt/ /symbol/ hex /prompt/ /symbol/ /word/ int /prompt/ /symbol/ /word/ string /prompt/ /symbol/ /word/ tristate /prompt/ /symbol/ 字义语句: define_bool /symbol/ /word/ define_hex /symbol/ /word/ define_int /symbol/ /word/ define_string /symbol/ /word/ define_tristate /symbol/ /word/ 相关语句: 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/ ... 未设置语句: unset /symbol/ ... 选项语句: choice /prompt/ /word/ /word/ nchoice /prompt/ /symbol/ /prompt/ /symbol/ ... If语句: if [ /expr/ ] ; then /statement/ ... fi if [ /expr/ ] ; then /statement/ ... else /statement/ ... fi 菜单块: mainmenu_option next_comment comment /prompt/ /statement/ ... endmenu Source语句: source /word/ 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 only built as modules.' l text /prompt/ 向用户显示提示信息。不向输出文件中写入提示信息。仅 mconfig 在它的帮助中使用此命令。 例如: # mconfig internal help text text 'Here are all the mconfig command line options.'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 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 l unset /symbol/ ... 此命令向/symbol/赋值"",,但是不把/symbol/输出到输出文件中。 例如: # arch/mips/config.in unset CONFIG_PCI unset CONFIG_MIPS_JAZZ unset CONFIG_VIDEO_G364 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的提示信息和符号。
|