在 make menuconfig 产生的菜单中会看到 [ ], { }, ( ),< >等符号,它们的意思如下:
[ ] :在方括号里,只能选择 * (built-in)和 不选择。
( ) : 在圆括号里,允许输入相关参数。 (对应于 Kconfig 中的 string, int hex)
{ } :在花括号里,只能选择 M (以模块方式) 和 * (built-in) 。
< > :在尖括号里,可以有 3 态选择 (tristate),即 M , * 和 不选。
另外,还会看到 -*- 这样形式的符号,比如:它表示该项只能以 built-in 的形式存在。
select 关键字后接的符号被称为反向依赖。
下面通过一个小实验来分析一下 Kconfig 中的 select 关键字,以便了解 ”反向依赖“ 的概念及其它所带来对菜单中相关符号的影响,。
1. 首先在 drivers 目录下创建两个子目录,一个是 beyes ,另一个是 l4nneret 。
2. 接着将下面两个 Kconfig 问及爱你分别放到这两个目录中:
下面文件放入 beyes 目录下
[Plain Text] 纯文本查看 复制代码 menuconfig BeyesDrivers
tristate "beyes drivers"
help
Just for test.
下面文件放入 l4nneret 目录下
[Plain Text] 纯文本查看 复制代码 menuconfig L4nneret
tristate "L4nneret test"
default y
select BeyesDrivers
help
Just for test
3. 在 drivers 目录下的 Kconfig 里在 menu 和 endmenu 之间添加:
[Plain Text] 纯文本查看 复制代码 source "drivers/beyes/Kconfig"
source "drivers/l4nneret/Kconfig"
4. 重新执行 make menuconfig ,此时我们看到:
![]()
从上图中看到,已经成功添加了上面两个菜单项。
观察这些菜单前面的符号逻辑:-*- beyes drivers --->
<*> L4nneret test (NEW) ---> 上面 ”L4nneret test“ 该项被设为 built-in ,而 ”beyes drivers“ 为其反向依赖,且因为 built-in 是最严格的一种存在形态,所以它的依赖也必须是 built-in 。
再用空格点选一下 ”L4nneret test“ 项,使其改变为 "M",此时两个菜单状态变为:{M} beyes drivers (NEW) --->
<M> L4nneret test ---> 注意 {M} 这个符号,你用空格键去点选它时,它只能在 "M" 和 "*" 之间变化,也就是说该项要么是以模块编译,要么是以 built-in 编译。
”L4nneret test“ 为 ”M“ 时,即表示它编译为模块,此时它的依赖 ”beyes drivers“ 可以为 bult-in 或者 "M" 了。 模块的依赖性不如 built-in 来的严格,所以它的反向依赖 ”beyes drivers“ 可以为模块,当然 built-in 看起来会更好。
再用空格再点选一下 ”L4nneret test“ 项,使其不选,此时两个菜单状态变为:这时要注意 "beyes drivers" 项前面的符号,它变成了普通的三态性(用 <> 括号表示),它可以不选,或为”M“,或为 "*" (built-in)
因为 ”L4nneret test“ 不需要进行编译,所以它就也无所谓依赖了,因此 "beyes drivers" 为啥状态都是不要紧的。
从上面实验可以看到,以 tristate 声明的反向依赖(beyes drivers),它会根据编译目标(如上面的 "L4nneret test" )的编译状态变化而变化。 |