7.2 Kconfig 语法简介
上一小节我们打开的图形化配置界面是如何生成的呢?图形化配置界面中的每一个界面都会对应一个Kconfig文件。所以图形化配置界面的每一级菜单是由Kconfig文件来决定的。
图形化配置界面有很多菜单。所以就会有很多Kconfig文件,这也就是为什么我们会在内核源码的每个子目录下,都会看到Kconfig文件的原因,那掌握Kconfig文件相关的知识是不是就非常重要呢。
所以这一小节我们来看下如何编写Kconfig文件来生成图形化配置界面,也就是Kconfig文件的语法是什么。
1.Mainmenu
mainmenu顾名思义就是主菜单,也就是我们输入完“make menuconfig”以后默认打开的界面,mainmenu用来设置主菜单的标题,如下所示:
mainmenu “Linux/$(ARCH) $(KERNELVERSION) Kernel Configuration”
此行代码是设置菜单的名字为“Linux/$(ARCH) $(KERNELVERSION) Kernel Configuration”。如下图(图7-4)所示,ARCH变量是通过“export ARCH=arm64”设置的,内核版本KERNELVERSION为4.19.232。
2.source
source用于读取另一个Kconfig文件,比如“source “init/Kconfig””就是读取init目录下的Kconfig文件。
3.menu/endmenu
menu/endmenu条目用于生成菜单,如下(图7-5)所示,生成了Watchdog Timer Support的菜单。
menu之后的字符串是菜单名,“menu”是菜单开始的标志,“endmenu”是菜单结束的标志,这俩个是成对出现的。“menu”和“endmenu”之间有很多config条目。在kernel目录下输入make menuconfig,如下图(图7-6)所示,可以看到上述代码描述的"Watchdog Timer Support"菜单。
进入“ Watchdog Timer Support —> ”可以看到很多config定义的条目,如下(图7-7)所示:
4.if/endif
if/endif 语句是一个条件判断,定义了一个 if 结构,Kconfig中代码如下(图7-8)所示:
图 7-8
当没有选中 “Enable CAN” 选项时,下面通过 if 判断的 Enable CAN1 选项并不会显示出来。当上一级菜单选中 “Enable CAN” 时,Enable CAN1 选项才会显示。
\5. choice/endchooice
choice条目将多个类似的配置选项组合到一起,供用户选择,用户选择是从“choice”开始,从“endchoice”结束,“choice”和“endchoice”之间有很多的config条目,这些config条目是提供用户选择的,如下(图7-9)所示:
我们在内核目录下输入make menuconfig可以看到,如下(图7-10)所示,“Parade TrueTouch Gen5 MultiTouch Protocol”是choice选项名称,“Protocol B”是Kconfig里面默认选择的。“–>”代表此菜单能进入,需要键盘操作进入。
进入“Parade TrueTouch Gen5 MultiTouch Protocol”后,可以看到多选项提供给用户进行选择,如下(图7-11)所示:
6.comment
comment 语句出现在界面的第一行,用于定义一些提示信息。
comment “Compiler: $(CC_VERSION_TEXT)”
以上代码的配置界面如下(图7-12)所示:
7.config
使用关键字config来定义一个新的选项,如下(图7-13)所示
如上所示,使用config关键字定义了一个“helloworld”选项,每个选项都必须指定类型,类型包括bool,tristate,string,hex,int。最常见的是bool,tristate,string这三个。
bool类型取值只有“y”和“n”
tristate类型的变量取值有3种:“y”,“n”,“m”
string类型取值为字符串
hex类型取值为十六进制的数据
int类型取值为十进制的数据
help表示帮助信息,当我们在图形化界面按下h按键,弹出来的就是help的内容。
8.depends on
Kconfig中depends on关键字用来指定依赖关系,当依赖的选项被选中时,当前的配置选项的信息才会在菜单中显示出来,才能操作该选项的内容。举例来说,如下所示,选项A依赖选项B,只有当选项B被选中时,选项A才可以被选中。
9.select
Kconfig中select关键字用来表示反向依赖关系,当指定当前选项被选中时,此时select后面的选项也会被自动选中。举个例子来说,如下所示,在选项A被选中的情况下,选项B自动被选中。
\10. menuconfig
menuconfig可以认为是config 中的升级版。menuconfig也是一个正常的配置项,通过自己的配置值来决定另外一组配置项是否作为子菜单的形式显示出来并供用户配置。代码如下(图7-14)所示。
以上代码中通过menuconfig配置了一个bool类型的配置项,在图形化配置界面中显示(图7-15)如下:
当我们选中"Network device support"配置项时,其子菜单被显示出来,如下图(图7-16)所示:
更多内容可以B站搜索北京迅为/CSDN搜索迅为RK3568开发板