Kconfig编译菜单说明文档
gedit Documentation/kbuild/Kconfig-language.txt
内核配置的目的是裁剪C代码,C代码编译一般由Makefile管理
一个菜单有三个相关内容:
1、 菜单;-----------Kconfig文件
2、 Makefile;------根据 .config抽取文件
3、 C代码。--------通过Makefile文件进行关联
一般一个Kconfig文件表示的就是一个菜单,一个菜单由多个菜单项组成,其格式如下
memu “菜单名”
菜单顶或菜单链接1
菜单顶或菜单链接2
菜单顶或菜单链接3
…………………………………
菜单顶或菜单链接n
endmenu
具体代码
menu "Device Drivers"
source "drivers/aamenutest/Kconfig"
source "drivers/base/Kconfig"
……..
source "drivers/memory/Kconfig"
source "drivers/iio/Kconfig"
source "drivers/vme/Kconfig"
endmenu
源(放在drivers目录下,关联到具体的Kconfig中)
在base文件夹下的Kconfig中
子项菜单命名
在配置菜单中的选项
菜单的结构为
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
为一符号,就好像代码中的局部变量x一样,可用于后边的表达式中. 每行都是以关键字开始。“config” 为定义了一新的配置选项。下面的几行定义了该配置选项的属性。属性可以是该配置选项的类型,输入提示(input prompt),依赖关系,帮助信息和默认值。
config UEVENT_HELPER_PATH
config开头配置后的宏名,会在配置后加前缀“CONFIG_”
如果同名会导致冲突,会有警告单不报错,执行内容以第一项定义为准,后面的项无效。
每个config菜单项都会产生一个配置选项CONFIG_XXX, XXX即为. 如上,则会产生一个配置项:CONFIG_ MODVERSIONS,此配置项的值记录在内核根目录下的隐藏文件.config内。
1、string:字符串,选择后会出现一个选项框,要求输入字符串
2、bool:两态选项,只能选中和不选中,选中为有,不选中为n。
3、tristate:三态选项(n、m、y)
4、hex:用户需要输入一个16进制数
5、int:用户需要输入一个整形(只能0~9数字组合其他非法);
6、注释comment:在菜单中加入适当的注释提示信息
代码
comment “Kconfig_test”
config STRING_TEST
string "string test"
default "hello linux"
help
string test default is "hello linux"
config BOOL_TEST
bool "bool test"
default "y"
help
bool test default is y
config SRISTATE_TEST
tristate "tristate test"
default m
help
tristate test default is M
config INT_TEST
int "int_test"
default 10
help
int_test default is 10
config HEX_TEST
hex "hex test"
default 0x3a
help
hex test default is 0x3a
每个菜单选项最多只能有一个显示给用户的输入提示。可以用 “if” 来表示该提示的依赖关系,这是可选的。
例如:TPO3依赖TPO2
代码
config OPT2
bool
prompt "prompt test"
default n
help
prompt test
config OPT3
bool
prompt "prompt depends on OPT2 test" if OPT2
default n
help
prompt test
一个配置选项可以有任意多个默认值。如果有多个默认值,那么只有第一个被定义的值是可用的。默认值显示给用户,并可以让用户进行修改。默认值的依赖关系可以用 “if” 添加。(可选项)。
default 20
help
Path to uevent………………
为int和hex类型的选项设置可以接受输入值范围。用户只能输入大于等于第一个symbol,小于等于第二个symbol的值。
range 1 10 //数值在1~10有效,其他无效
代码
config RANGE_TEST
int "range test 2~32"
default 4
range 2 32
help
range test 2~32
菜单效果
输入超出范围的值会提示出错
输入范围以内的值才有效
为一菜单选项定义依赖关系。如果定义了多个依赖关系,它们之间用 ‘&&’ 间隔。依赖关系也可以应用到该菜单中所有的其它选项(同样接受if表达式)。
1、依赖关系depends on XXX
出现这个选项的前提是选中XXX
2、depends on if XXX=3
出现选项的前提是XXX的值是3
下面的两个例子是等价的
代码
config DEPENDS_ON_CHOICE
bool "depends on choice"
default n
help
depends on choice default is n
config DEPENDS_ON_TEST
bool "depend on test if depends on choice"
depends on DEPENDS_ON_CHOICE
default n
help
depends on test
config IF_INT_TEST
int "if int test"
default 10
help
if int test default is 10
config IF_HEX_TEST
hex "if hex test"
default 0xca
help
if hex test default is 0xca
config NAME_IF_TEST
int "name if test if int=5 && hex=0x3a" if IF_INT_TEST=5
depends on IF_HEX_TEST=0x3a
default 3
help
name if test if int=5 && hex=0x3a
这个关键字表示了当本配置项选中后,其他的配置项也需要选中。
反向依赖只能用在 boolean 或 tristate 选项上。
代码
config SELECT_DEP
bool "select select depands"
default n
help
select test
config SELECT_ORG1
bool "select org1 to select test1"
default n
select SELECT_TEST1
help
select SELECT_TEST1 test
config SELECT_ORG2
tristate "select org2 to select test2"
default n
select SELECT_TEST2 if SELECT_DEP
help
select SELECT_TEST2 test
config SELECT_TEST1
bool
prompt "select test by select org1"
default n
help
select test 1
config SELECT_TEST2
bool
prompt "select test by select org2 and delect depends"
default n
help
select test 2
可以在Linux源码目录下的任意地方添加自定义菜单,只要是该目录下有内核关联的Kconfig文件就可以。本次添加菜单是以在drivers目录下添加自定义菜单为例。
在drivers目录中编辑Kconfig,加入自定义的文件夹
menu "Device Drivers"
source "drivers/aamenutest/Kconfig"
source "drivers/base/Kconfig"
………………………………………………..
source "drivers/iio/Kconfig"
source "drivers/vme/Kconfig"
endmenu
文件夹在drivers目录下,新建aamenutest文件夹
进入aamenutest中,建立Kconfig文件
编写Kconfig里的内容
自定义目录名为"Kconfig menu test"。
注意:编写代码的顺序决定了在make menuconfig中显示的顺序。
代码
menu "Kconfig menu test"
comment ”Kconfig_test“
config STRING_TEST
string "string test"
default "hello linux"
help
string test
config BOOL_TEST
bool "bool test"
default y
help
bool test default is y
config SRISTATE_TEST
tristate "tristate test"
default m
help
tristate test default is M
config INT_TEST
int "int_test"
default 10
help
int_test default is 10
config HEX_TEST
hex "hex test"
default 0x3a
help
hex test default is 0x3a
comment ”Keywords_test“
config DEPENDS_ON_CHOICE
bool "depends on choice"
default n
help
depends on choice default is n
config DEPENDS_ON_TEST
bool "depend on test if depends on choice"
depends on DEPENDS_ON_CHOICE
default n
help
depends on test
config IF_INT_TEST
int "if int test"
default 10
help
if int test default is 10
config IF_HEX_TEST
hex "if hex test"
default 0xca
help
if hex test default is 0xca
config NAME_IF_TEST
int "name if test if int=5 && hex=0x3a" if IF_INT_TEST=5
depends on IF_HEX_TEST=0x3a
default 3
help
name if test if int=5 && hex=0x3a
config RANGE_TEST
int "range test 2~32"
default 4
range 2 32
help
range test 2~32
config PROMPR_TEST
bool
prompt "prompt test"
default n
help
prompt test
config RANGE_IF_TEST
bool
prompt "fange if test depends on prompt test" if PROMPR_TEST
default n
help
fange if test
config RANG
int "range test if fange if rest the manber 1~10" if PROMPR_TEST
range 1 10 if RANGE_IF_TEST
default 2
help
range test:range 1 10 if fange if test
config OPT2
bool
prompt "prompt test"
default n
help
prompt test
config OPT3
bool
prompt "prompt depends on OPT2 test" if OPT2
default n
help
prompt test
source "drivers/aamenutest/selecttest/Kconfig"
config ZXLED
bool "zxled test"
default n
help
led.c test
endmenu
在根目录的.config中看到加载的选项
#
# Kconfig menu test
#
#
# Kconfig_test
#
CONFIG_STRING_TEST="hello linux"
CONFIG_BOOL_TEST=y
CONFIG_SRISTATE_TEST=m
CONFIG_INT_TEST=10
CONFIG_HEX_TEST=0x3a
#
# Keywords_test
#
# CONFIG_DEPENDS_ON_CHOICE is not set
CONFIG_IF_INT_TEST=10
CONFIG_IF_HEX_TEST=0xca
CONFIG_RANGE_TEST=4
# CONFIG_PROMPR_TEST is not set
# CONFIG_RANGE_IF_TEST is not set
CONFIG_RANG=2
# CONFIG_OPT2 is not set
# CONFIG_OPT3 is not set
#
# select test
#
# CONFIG_SELECT_DEP is not set
# CONFIG_SELECT_ORG1 is not set
# CONFIG_SELECT_ORG2 is not set
# CONFIG_ZXLED is not set
在刚才的代码可以看到,有一项包含的代码:
source “drivers/aamenutest/selecttest/Kconfig”
这就是aamenutest中包含的子目录。
进入aamenutest文件夹中,再建立子文件夹selecttest
在Kconfig中添加selecttest的Kconfig,要考虑位置顺序,也就是前面提到的包含子文件夹的代码
source “drivers/aamenutest/selecttest/Kconfig”
进入selecttest中,同样建立Kconfig文件,并编辑Kconfig文件
代码
menu "select test"
config SELECT_DEP
bool "select select depands"
default n
help
select test
config SELECT_ORG1
bool "select org1 to select test1"
default n
select SELECT_TEST1
help
select SELECT_TEST1 test
config SELECT_ORG2
tristate "select org2 to select test2"
default n
select SELECT_TEST2 if SELECT_DEP
help
select SELECT_TEST2 test
config SELECT_TEST1
bool
prompt "select test 1 by select org1"
default n
help
select test 1
config SELECT_TEST2
bool
prompt "select test 2 by select org2 and select depends"
default n
help
select test 2
endmenu