运行 make menuconfig 等时,配置工具首先分析与体系结构对应的/arch/xxx/Kconfig 文件(xxx即为传入的 ARCH 参数), /arch/xxx/Kconfig 文件中除本身包含一些与体系结构相关的配置项和配置菜单以外,还通过 source 语句引入了一系列 Kconfig 文件,而这些 Kconfig 又可能再次通过 source引入下一层的 Kconfig
(1)菜单入口-->config。
大多数的内核配置选项都对应 Kconfig 中的一个菜单入口
“config” 关键字定义新的配置选项,之后的几行定义了该配置选项的属性。配置选项的属性
包括类型、数据范围、输入提示、依赖关系、选择关系及帮助信息和默认值等。
例如:kconfig文件有这么一句
config ARM
.config文件里就是
CONFIG_ARM=y
每个配置选项都必须指定类型,类型包括 bool、 tristate、 string、 hex 和 int,其中 tristate 和
string 是两种基本的类型,其他类型都基于这两种基本类型。
- 输入提示
类型定义后可以紧跟输入提示,下面的两段脚本是等价的
bool "Networking support"
和
bool
prompt "Networking support"
- 默认值的格式为:
default <expr> [if <expr>]
一个配置选项可以存在任意多个默认值,这种情况下,只有第一个被定义的值是可用的。如
果用户不设置对应的选项,配置选项的值就是默认值
- 依赖关系的格式为:
depends on(或者 requires) <expr>
如果定义了多重依赖关系,它们之间用“&&” 间隔。依赖关系也可以应用到该菜单中所有
的其他选项(同样接受 if 表达式),下面的两段脚本是等价的
bool "foo" if BAR
default y if BAR
和
depends on BAR
bool "foo"
default y
- 选择关系(也称为反向依赖关系)的格式为:
select <symbol> [if <expr>]
A 如果选择了 B,则在 A 被选中的情况下, B 自动被选中。
(2)菜单结构。
菜单入口在菜单树结构中的位置可由两种方法决定。第一种方式为:
menu "Network device support"
depends on NET
config NETDEVICES
…
endmenu
所有处于“menu” 和“endmenu” 之间的菜单入口都会成为“Network device support” 的子菜单。
而且,所有子菜单选项都会继承父菜单的依赖关系,比如,“Network device support” 对“NET”
的依赖会被加到了配置选项 NETDEVICES 的依赖列表中。
注意 menu 后面跟的“Network device support”项目仅仅是 1 个菜单,没有对应真实的配置选
项,也不具备 3 种不同的状态。这是它和 config 的区别。
另一种方式是通过分析依赖关系生成菜单结构。如果菜单选项在一定程度上依赖于前面的选
项,它就能成为该选项的子菜单。如果父选项为“N”,子选项不可见;如果父选项可见,子选项才能可见。例如:
config MODULES
bool "Enable loadable module support"
config MODVERSIONS
bool "Set version information on all module symbols"
depends on MODULES
comment "module support disabled"
depends on !MODULES
MODVERSIONS 直接依赖 MODULES,只有 MODULES 不为“n”时,该选项才可见
- “choices … endchoice” 的结构为:
它定义一个选择群,其接受的选项(choice options)可以是前面描述的任何属性, 例如 LDD6410 的 VGA 输出分辨率可以是 1 024768 或者 800600,drivers/video/samsung/Kconfig 就定义了如下的 choice:
choice
depends on FB_S3C_VGA
prompt "Select VGA Resolution for S3C Framebuffer"
default FB_S3C_VGA_1024_768
config FB_S3C_VGA_1024_768
bool "1 024*768@60Hz"
---help---
TBA
config FB_S3C_VGA_640_480
bool "640*480@60Hz"
---help---
TBA
endchoice
kconfig的帮助文档
Kconfig 配置脚本和 Makefile 脚本编写的更详细信息,可以分别参看内核文档 Documentation目录的 kbuild 子目录下的 Kconfig-language.txt 和 Makefiles.txt 文件。
一个实际的例子
book@book-desktop:~/system/linux-2.6.22.6/drivers/sgy$ ls -al
total 16
drwx------ 3 book book 4096 2017-09-08 06:10 .
drwxrwxrwx 68 book book 4096 2017-09-08 05:43 ..
drwx------ 2 book book 4096 2017-09-08 06:10 cpu
-rw------- 1 book book 178 2017-09-08 06:11 Kconfig
-rw------- 1 book book 0 2017-09-08 06:11 test.c
-rw------- 1 book book 0 2017-09-08 06:11 test_client.c
-rw------- 1 book book 0 2017-09-08 06:11 test_ioctl.c
-rw------- 1 book book 0 2017-09-08 06:11 test_proc.c
-rw------- 1 book book 0 2017-09-08 06:11 test_queue.c
book@book-desktop:~/system/linux-2.6.22.6/drivers/sgy$ tree
.
|-- Kconfig
|-- cpu
| `-- cpu.c
|-- test.c
|-- test_client.c
|-- test_ioctl.c
|-- test_proc.c
`-- test_queue.c
我们需要在arch/arm/目录下使用source包含我们的新kconfig文件,之前尝试直接在drivers/目录下的Kconfig使用source不生效
menu "Device Drivers" 这一栏下面
source "drivers/sgy/Kconfig"
自己写的Kconfig文件内容如下,并没有什么实际的意义
menu "sgy"
comment "comment sgy"
config CONFIG_TEST
bool "TEST Driver"
choice
depends on CONFIG_TEST
prompt "Select VGA Resolution for S3C Framebuffer"
default sgy_VGA_1024_768
config sgy_VGA_1024_768
bool "1 024*768@60Hz"
config sgy_VGA_640_480
bool "640*480@60Hz"
endchoice
endmenu
可以看见Device Drivers下已经有一个sgy
不选中的TEST_DRIVER的情况
choice的效果