文章目录
菜单
大多数的菜单定义了一个配置选项,其他的菜单是为了帮助他们进行组织,配置选项定义如下:
config MODVERSIONS
bool "Set version information on all module symbols"
depends on MODULES
help
Usually, modules have to be recompiled whenever you switch to a new
kernel. ...
每行由一个关键字开始,后面可以携带多个参数,一个新的配置项通常以"config" 开头,往后的每一行则定义了配置项的属性,属性可以为下面几种类型,配置项的类型,输入提示,依赖,帮助信息和默认值,一个配置选项可以以同样的名字定义多次,但是他的输入提示必须是唯一的,且类型没有冲突。
Kconfig语法
配置文件描述了一系列的菜单入口,每行都以一个关键字开头,除了help,以下关键字用于定义菜单,其中前五个用于定义一个菜单项。
- config
- menuconfig
- choice/endchoice
- comment
- menu/endmenu
- if/endif
- source
config
config <symbol>
<config options>
定义了一个配置项符号和若干属性。
menuconfig
menuconfig <symbol>
<config options>
它和配置选项定义有些相似,但它也给前端一个提示,所有子选项都应该显示为单独的选项列表。为了确保所有子选项都真正显示在 menuconfig 条目下而不是在它之,config options列表中的每个项目都必须依赖于 menuconfig 符号。
在实践中,这是通过使用以下两种结构之一来实现的:
(1):
menuconfig M
if M
config C1
config C2
endif
(2):
menuconfig M
config C1
depends on M
config C2
depends on M
在下面两个例子中,c1和c2始终依赖M,但是他们并不会出现在菜单中,因为c0没有依赖M。
(3):
menuconfig M
config C0
if M
config C1
config C2
endif
(4):
menuconfig M
config C0
config C1
depends on M
config C2
depends on M
choice / endchoice
choice [symbol]
<choice options>
<choice block>
endchoice
该关键字定义了一个选择组,它支持任意类型的属性作为选项,一个选项的类型只能是bool或者tristate,如果选项没有指定类型,它的类型由选择组的第一个选项的类型决定,如果选择组的所有选项都没有具体类型,那么它的类型仍是未知的。
bool 类型的选项只有一个配置入口,tristate可以有多个配置入口被设置为m,这用于描述以下情况,如果系统存在多个驱动却只有一个硬件,最终只能有一个驱动可以被编译到内核中,但是所有驱动都可以被编译成模块。
选择组中还可以增加一个选项"optional",它允许用户将其设置为n,这样就不需要选择任何选项了。
comment
comment <prompt>
<comment options>
注释会在配置时出现,并且会一起被输出到生成的输出文件中。
menu/endmenu
menu <prompt>
<menu options>
<menu block>
endmenu
定义一个菜单块,只允许使用可见属性和依赖属性。
if/endif
if <expr>
<if block>
endif
定义一个条件块,依赖表达式 会被添加到块中所有菜单入口的依赖中。
source
source <file>
读取一个指定的配置文件,将文件中的配置项作为当前项的子菜单或者选项。
菜单属性
一个菜单可以有多个属性,但是这些属性不是在任何地方都可以使用的,详细请参考语法。
类型定义
- bool
- trisate
- string
- hex
- int
每一个配置选项都有一个类型,其中字符和三态类型是基本类型,其余的类型则是基于这两种类型产生的,类型定义可以附带一个输入提示,因此下面两种写法都是等价的。
bool "Networking support"
bool
prompt "Networking support"
输入提示
prompt <prompt> ["if" <expr>]
每一个菜单都有一个输入提示,且最多只有一个,除此之外还可以选择使用“if”添加此默认值的依赖项。
默认值
default <expr> ["if" <expr>]
一个配置选项可以有任意多个默认值,如果多个默认值都是可见的,那么只有第一个默认值是有效的,默认值不会因菜单选项未被定义受到影响,这意味着默认值可以定义在任何地方,也可以被更早的定义所覆盖。
值由用户设置(通过上面的输入提示)。如果输入提示可见,则将默认值呈现给用户并且可以被用户输入覆盖,还可以选择使用“if”添加此默认值的依赖项。
类型定义 + 默认值
def_bool/def_tristate <expr> [if <expr>]
这是类型定义加值的简写符号,可以选择使用“if”添加此默认值的依赖项。
依赖
depends on <expr>
这是为菜单添加依赖,如果有多个依赖,用&&进行连接,依赖也可以用于此菜单中的其他选项中(同时也接受if表达式),下面两种写法是等价的。
bool "foo" if BAR
default y if BAR
depends on BAR
bool "foo"
default y
反向依赖
此属性可以强制选定一个符号,无论此符号的依赖是否满足。被选定的符号仅支持 bool 或 tristate 类型。语法如下:
select <symbol> [if <expr>]
弱反向依赖
此属性和 select 相似,用于选定一个符号,但是被选定的符号仍有可能被直接依赖或被用户输入设置为 n。语法如下:
imply <symbol> [if <expr>]
给定如下程序:
config FOO
tristate
imply BAZ
config BAZ
tristate
depends on BAR
下面是可能的结果:
FOO | BAR | BAZ’s default | choice for BAZ |
---|---|---|---|
n | y | n | N/m/y |
m | y | m | M/n/y |
y | y | y | Y//n |
y | n | * | N |
可见性
此属性仅用于菜单块,根据条件来决定是否向用户显示菜单块(但是包含的符号依然可以被其他符号选定),和应用于单个菜单项的 prompt 属性相似。语法如下:
visible if <expr>
数值范围
当数据类型为int和hex时,可以使用如下方法设置输出范围,用户可以输入begin到end的闭区间范围:
range <begin> <end> ["if" <expr>]
帮助信息
help or ---help---
这定义了一个帮助文本。帮助文本的结尾由缩进级别决定,这意味着它在第一行结束,该行的缩进小于帮助文本的第一行。
“—help—”和“help”在行为上没有区别,“—help—”用于帮助在视觉上将配置逻辑与文件中的帮助分开,以帮助开发人员。
菜单依赖
依赖关系定义了菜单项的可见性,还可以减少三态符号的输入范围。表达式中使用的三态逻辑使用比普通布尔逻辑多一种状态来表示模块状态。依赖表达式具有以下语法:
<expr> ::= <symbol> (1)
<symbol> '=' <symbol> (2)
<symbol> '!=' <symbol> (3)
<symbol1> '<' <symbol2> (4)
<symbol1> '>' <symbol2> (4)
<symbol1> '<=' <symbol2> (4)
<symbol1> '
'!' <expr> (6)
<expr> '&&' <expr> (7)
<expr> '||' <expr> (8)