linux内核make menuconfig生成.config时,会调用GUI配置工具,这个GUI配置工具具体调用的就是内核各目录下的Kconfig文件,Kconfig文件层次结构和各内核目录中层次相似,最终形成GUI的各级配置菜单。
make uImage时会使用.config文件,依据其中的变量值来编译内核。
下面首先介绍Kconfig文件规则:
Kconfig 文件的基本要素:
1.config 条目(entry)
config TMPFS_POSIX_ACL
bool "Tmpfs POSIX Access Control Lists"
depends on TMPFS
select GENERIC_ACL
default y
help
POSIX Access Control Lists (ACLs) support permissions for users and
groups beyond the owner/group/world scheme.
To learn more about Access Control Lists, visit the POSIX ACLs for
Linux website
If you don't know what Access Control Lists are, say N.
解析:
一个config条目就是配置菜单中的一个选项。
config是关键字,表示一个配置选项的开始;紧跟着的TMPFS_POSIX_ACL是配置选项的名称,省略了前缀"CONFIG_",这个选项会在.config生成一个CONFIG_TMPFS_POSIX_ACL变量并且给其赋相应的值,用来在makefile中使用。
bool表示变量类型,即"CONFIG_TMPFS_POSIX_ACL "的类型,有5种类型:bool、tristate、string、hex和int,其中tristate和string是基本的类型
bool变量的值: y和n
tristate变量的值:y、n和m
string变量的值: 字符串
bool之后的字符串“Tmpfs POSIX Access Control Lists”是提示信息,显示在配置界面中,在配置界面中上下移动光标选中它时,就可以通过按空格或回车键来设置CONFIG_ TMPFS_POSIX_ACL的值。
depends on:表示依赖于XXX,“depends on TMPFS”表示只有当TMPFS配置选项被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项。
defalut 标示配置选项的默认值。
select 反向依赖,这个关键字表示了当本配置项选中后,其他的配置项也就会选中CONFIG_ GENERIC_ACL=y。
help是帮助文档,在按?会显示该内容。
prompt:提示,显示在make menuconfig中的名称,一般省略。下面两种写法相同。
a. bool “Networking Support”
b. bool
prompt “Networking Support”
range:范围,用于hex和integer
range A B表示当前值不小于A,不大于B
comment:注释2.menu/endmenu 条目
menu条目用于生成菜单,其格式如下:
menu "Floating poing emulation"
config FPE_NWFPE
..............
config FPE_NWFPE_XP
.............
endmenu
menu之后的Floating poing emulation是菜单名,menu和end间有很多config条目,在配置界面中如下所示:
Floating poing emulation--->
[] FPE_NWFPE
[] FPE_NWFPE_XP
menu的作用,可以理解成一个目录,menu可以把其中一部分配置项包含到一个menu中,这样有利于配置的分类显示。menu与endmenu是一组指令,必须同时出现。menu和endmenu中包含的部分就是子目录中的配置项。
比如,在init/Kconfig中24行(可能不同)显示为:
menu "General setup"
这样,就会生成一个目录,特征就是右侧会出现一个箭头,如图1中第一行。当点击确认键时,会进入这个菜单项,如图2。
图1
图2
3、menuconfigmenuconfig有点类似menu,但区别就在于menu后面多了一个config,这个menu是可以配置的,如图2中的第二行,前面比menu类型多了一个方框,通过空格可以修改这个配置项的选中状态。而且从格式上来看,也是有区别的。格式如init/Kconfig中1131行:
menuconfig MODULES
bool "Enable loadable module support"config
if MODULES
xx
endif
也就是说,配置项是位于if和endif中。其中的部分就是MODULES子目录显示的内容。如果选中了MODULE,那么if和endif中的内容可以显示。如果没有定义,就只能进入一个空目录。
3.choice条目
choice条目将多个类似的配置选项组合在一起,供用户单选或多选,记住menuconfig就是给各种CONFIG_XXX的赋值,这是基本目标,choice只是一种组织方式。
choice
prompt "ARM system type"
default ARCH_VERSATILE
config ARCH_AAEC2000
.........
config ARCH_REALVIEW
.........
end
prompt "ARM system type"给出提示信息“ARM system type”,光标选中
后回车进入就可以看到多个config条目定义的配置选项
choice条目中定义的变量只有bool和tristate
4.comment条目
comment条目用于定义一些帮助信息,出现在界面的第一行,如在arch/arm/Kconifg中有如下代码:
menu "Floating point emulation"
comment "At least one emulation must be selected"
config FPE_NWFPE
.........
config FPE_NWFPE_XP
在界面中如下所示:
***后面为comment内容,用来说明条目内容的。
5.source条目
source条目用于读取另一个Kconfig文件,如:
source "net/Kconifg"
是KConfig构成层次结构的方法,将个目录下KConfig文件联系起来。
在make menuconfig时可以查看一个条目的help信息(条目下?或选择help按钮)知道其依赖、值类型、kconfig文件位置等信息。