概述
menuconfig是Linux平台用于管理代码工程、模块及功能的实用工具。
menuconfig的使用方式通常是在编译系统之前在系统源代码根目录下执行make menuconfig命令从而打开一个图形化配置界面,再通过对各项的值按需配置从而达到影响系统编译结果的目的。
Nuttx的menuconfig配置界面如下图所示:
menuconfig配置后的结果将会保存在对应模块根目录下的 .config 文件中。在编译时会加载.config文件中的配置项来决定编译结果。
Kconfig严格来讲是一种编程语言,它拥有自己的语法及结构。正是这些语法和结构组成了menuconfig在用户眼前不同的表现形式。
总得来说,menuconfig是Linux平台基于Kconfig用于管控代码实用工具。
常用的Kconfig语法
Kconfig,其实就是一个位于要被控制的程序模块源码目录下的文件名为 Kconfig 的普通的文本文件而已。一般来讲,都是在各个程序或模块的根目录下创建一个Kconfig用于记录所有配置该程序/模块的配置项。
然后再在其父级目录的Kconfig中通过souce code/Kconfig的形式将其引入到menuconfig系统中去。
Kconfig常用的几个知识点有以下五个:
- config模块
- menuconfig模块
- menu模块
- choice模块
- if 与 depends on 模块
config模块
config 配置项名
配置项类型
配置项提示语
其它选项
配置项名表示最终保存在 .config 文件中的键值对项的键名,通常用全大写和单词之间以下划线隔开的形式书写。
配置项类型就是基础类型,可选的类型有:bool、tristate、string、hex、int。
- bool 表示布尔型在.config中以 y 和 n 表示。
- tristate是三态类型,通常用在内核驱动控制中。在.config中以 y 、n和m表示。y表示将驱动编译进内核镜像,n表示不编译,m表示将驱动编译为ko形式。
- string是普通字符串类型,直接将在menuconfig图形界面中用户输入的值原样保存在.config中。
- hex是十六进制形式,只能输入0~F的内容。
- int是十进制整数形式,只能输入数字。
配置项提示语以prompt开头,后跟一个空格字符,然后就是用双引号包围的文字提示语。
如下定义在Nuttx根目录下创建menu-config/Kconfig:
config KCONFIG_DEMO_ITEM1
bool
prompt "demonstate item1 for bool learning"
config KCONFIG_DEMO_ITEM2
string
prompt "demonstate item2 for string learning"
config KCONFIG_DEMO_ITEM3
hex
prompt "demonstate item3 for hex learning"
然后再其跟目录下的Kconfig中将此Kconfig文件加载进来:
# menu "Applications Settings"
source "menu-config/Kconfig"
然后执行make menuconfig
:
最后就多出来三行:
CONFIG_KCONFIG_DEMO_ITEM1=y
CONFIG_KCONFIG_DEMO_ITEM2="demo"
CONFIG_KCONFIG_DEMO_ITEM3=0xEF
menuconfig模块
menuconfig可以认为是上一节 config 中的升级版。首先它自己也是一个正常的配置项,通过自己的配置值来决定另外一组配置项是否作为子菜单的形式显示出来并供用户配置。
menuconfig KCONFIG_DEMO_MENUCONFIG1
bool
prompt "menuconfig learning"
if KCONFIG_DEMO_MENUCONFIG1
config MENUCONFIG_SUBITEM1
bool
prompt "menuconfig subitem1"
config MENUCONFIG_SUBITEM2
bool
prompt "menuconfig subitem2"
endif
-
第一行通过menuconfig配置了一个bool类型的配置项。
-
如果选中了menuconfig learning,就会出现下面第二张图的自选项,否则是没有的:
menu模块
如果说上一节的menuconfig是一个带了菜单功能的配置项,那么这个 menu 是一个纯粹的菜单项了。menu本身不可配置,只是用来标记其内部可能拥有子配置项。
语法:
menu "menu learning"
config MENU_SUBITEM1
bool
prompt "subitem1"
config MENU_SUBITEM2
bool
prompt "subitem2"
config MENU_SUBITEM3
bool
prompt "subitem3"
endmenu
同样添加这段代码到menu-config/Kconfig文件,执行menu config:
进入子选项:
menu项在.config中会将菜单提示语作为注释一并写入,前面几个部分在.config中的代码如下所示:
CONFIG_KCONFIG_DEMO_ITEM1=y
CONFIG_KCONFIG_DEMO_ITEM2="demo"
CONFIG_KCONFIG_DEMO_ITEM3=0xEF
CONFIG_KCONFIG_DEMO_MENUCONFIG1=y
# CONFIG_MENUCONFIG_SUBITEM1 is not set
# CONFIG_MENUCONFIG_SUBITEM2 is not set
#
# menu learning
#
CONFIG_MENU_SUBITEM1=y
CONFIG_MENU_SUBITEM2=y
# CONFIG_MENU_SUBITEM3 is not set
choice模块
choice是单选模块。具体语法如下所示:
choice
bool
prompt "choice learning"
config CHOICE_ITEM1
bool
prompt "choice1"
config CHOICE_ITEM2
bool
prompt "choice2"
config CHOICE_ITEM3
bool
prompt "choice3"
endchoice
make menuconfig如下:
if与depends on模块
if 与 depends on 模块都属于 config 配置项中的”其它选项“。它们的作用是等价的,都是根据指定的配置项是否被配置来决定本配置项的显示与否。
config MY_CONFIG1
bool
prompt "my config1"
config MY_CONFIG2
bool
prompt "my config2" if MY_CONFIG1
config MY_CONFIG3
bool
prompt "my config3"
depends on MY_CONFIG2
选中my config1后出现my config2,选中my config2后出现my config3:
最后,完整的Kconfig文件内容如下:
config KCONFIG_DEMO_ITEM1
bool
prompt "demonstate item1 for bool learning"
config KCONFIG_DEMO_ITEM2
string
prompt "demonstate item2 for string learning"
config KCONFIG_DEMO_ITEM3
hex
prompt "demonstate item3 for hex learning"
menuconfig KCONFIG_DEMO_MENUCONFIG1
bool
prompt "menuconfig learning"
if KCONFIG_DEMO_MENUCONFIG1
config MENUCONFIG_SUBITEM1
bool
prompt "menuconfig subitem1"
config MENUCONFIG_SUBITEM2
bool
prompt "menuconfig subitem2"
endif
menu "menu learning"
config MENU_SUBITEM1
bool
prompt "subitem1"
config MENU_SUBITEM2
bool
prompt "subitem2"
config MENU_SUBITEM3
bool
prompt "subitem3"
endmenu
choice
bool
prompt "choice learning"
config CHOICE_ITEM1
bool
prompt "choice1"
config CHOICE_ITEM2
bool
prompt "choice2"
config CHOICE_ITEM3
bool
prompt "choice3"
endchoice
config MY_CONFIG1
bool
prompt "my config1"
config MY_CONFIG2
bool
prompt "my config2" if MY_CONFIG1
config MY_CONFIG3
bool
prompt "my config3"
depends on MY_CONFIG2