(注:本文节选自正点原子嵌入式Linux开发指南)
本篇只是大概了解Kconfig原理,关于Kconfig的详细语法介绍,可以参考linux内核源码的文件Documentation/kbuild/kconfig-language.txt。
打开uboot根目录下的Kconfig,这个Kconfig文件就是顶层Kconfig,我们就以这个文件为例简单学习一下Kconfig语法。
1、mainmenu
顾名思义mainmenu就是主菜单,也就是输入“make menuconfig”以后打开的默认界面,在顶层Kconfig中有如下代码:
上述代码就是定义了一个名为“U-Boot $UBOOTVERSION Configuration”的主菜单,其中UBOOTVERSION = 2016.03,因此主菜单名为“U-Boot 2016.03 Configuration”,如图2所示:
2、调用其他目录下的Kconfig文件
和makefile一样,Kconfig也可以调用其他子目录中的Kconfig文件,调用方法如下:
source "xxx/Kconfig" //xxx为具体的目录名,相对路径
在顶层Kconfig中有如下代码:
从上述代码中可以看出,在顶层Kconfig文件调用了很多其他子目录下的Kconfig文件,这些子目录下的Kconfig文件在主菜单中生成各自的菜单项。
3、menu/endmenu条目
menu用于生成菜单,endmenu就是菜单结束标志,这两个一般是成对出现的。在顶层Kconfig中有如下代码:
图3图4展示了一个menu/endmenu代码块的一部分,这个代码块就是一个子菜单,图3中第14行的“menu "General setup"”表示子菜单“General setup”。体现在主菜单界面中就如图5:
在“General setup”菜单上面还有“Architecture select(ARM architecture)”和“ARM architecture”这两个子菜单,但是在顶层Kconfig中并没有看到这两个子菜单对应的menu/endmenu代码块,那这两个子菜单是怎么来的呢?这两个子菜单就是arch/Kconfig文件生成的。包括主界面中的“Boot timing”、“Console recording”等等这些子菜单,都是分别由顶层Kconfig所调用的common/Kconfig、cmd/Kconfig等这些子Kconfig文件来创建的。
4、config条目
顶层Kconfig中的“General setup”子菜单内容如下:
可以看出,在menu/endmenu代码块中有大量的“config xxxx”的代码块,也就是config条目。config条目就是“General setup”菜单的具体配置项,如图8所示:
“config LOCALVERSION”对应着第一个配置项,“config LOCALVERSION_AUTO”对应着第二个配置项,以此类推。我们以“config LOCALVERSION”和“config LOCALVERSION_AUTO”这两个为例来分析一下config配置项的语法:
第16行和26行,这两行都以config关键字开头,后面跟着LOCALVERSION和LOCALVERSION_AUTO,这两个就是配置项名字。假如我们使能了LOCALVERSION_AUTO这个功能,那么就会向.config文件中生成CONFIG_LOCALVERSION_AUTO。由此可知,.config文件中的“CONFIG_XXX”(XXX就是具体的配置项名字)就是Kconfig文件中config关键字后面的配置项名字加上"CONFIG_"前缀。
config关键字下面的这几行是配置项属性,17~24行是LOCALVERSION的属性,27~44行是LOCALVERSION_AUTO属性,属性里面描述了配置项的类型、输入提示、依赖关系、帮助信息和默认值等。
第17行的string是变量类型,也就是“CONFIG_LOCALVERSION”的变量类型。可以为:bool、tristate、string、hex和int,一共5中。最常用的是bool、tristate和string这三种,bool类型有两种值:y和n,当为y的时候表示使能这个配置项 ,当为n的时候就禁止这个配置项。tristate类型有三种值:y、m和n,其中y和n的含义与bool类型一样,m表示将这个配置项编译为模块。string为字符串类型,所以LOCALVERSION是一个字符串变量,用来存储本地版本号,选中以后即可输入用户定义的本地版本号,如下图:
string后面的“Local version - append to U-Boot release”就是这个配置项在图形界面上显示出来的标题。
第18行,help表示帮助信息,告诉我们配置项的含义,当我们按下“h”或“?”弹出来的帮助界面就是help的内容。
第27行,说明“CONFIG_LOCALVERSION_AUTO”是个bool类型,可以通过按下Y或N键来使能或者禁止CONFIG_LOCALVERSION_AUTO.
第28行,“default y”表示CONFIG_LOCALVERSION_AUTO的默认值就是y,所以这一行默认会被选中。
5、depends on 和select
打开arch/Kconfig文件,在里面有如下代码:
第9行,“depends on”说明“SYS_GENERIC_BOARD”项依赖于“HAVE_GENERIC_BOARD”,也就是说”“HAVE_GENERIC_BOARD”被选中以后“SYS_GENERIC_BOARD”才能被选中。
第17~20行,“select”表示方向依赖,当选中“ARC”以后,“HAVE_PRIVATE_LIBGCC”、“HAVE_GENERIC_BOARD”、“SYS_GENERIC_BOARD”和“SUPPORT_OF_CONTROL”这四个也会被选中。
6、choice/endchoice
在arch/Kconfig文件中有如下代码:
choice/endchoice代码段定义了一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选。图11就是选中处理器架构,可以从ARC、ARM、AVR32等这些架构中选择,这里是单选。在uboot图形配置界面上 选择“Architecture select”,进入以后如图12:
可以在图12中通过移动光标来选择所使用的CPU架构。第12行的prompt给出这个choice/endchoice段的提示信息为“Architecture select”。
7、menuconfig
menuconfig和menu很类似,但是menuconfig是个带选项的菜单,其一般用法为:
第1行,定义了一个可选的菜单MODULES,只有选中了MODULES第3~5行的if到endif之间的内容才会显示,在顶层Kconfig中有如下代码:
第74~99行使用menuconfig实现了一个菜单,路径如下:
General setup
->Configure standard U-Boot features(expert users) --->
如下图所示:
从图15可以看出,前面有“[]”说明这个菜单是可选的,当选中这个菜单以后就可以进入到子选项中,也就是图14中的第83~99行所描述的菜单,如图16所示:
如果不选择“Configure standard U-Boot features(expert users)”,那么图14所示的第83~99行所描述的菜单就不会显示出来,进去以后就是空白的。
8、comment
comment用于注释,也就是在图形话界面中显示一行注释,打开文件drivers/mtd/nand/Kconfig,有如下所示代码:
第81行使用comment标注了一行注释,注释内容为:“Generic NAND options”,这行注释在配置项NAND_ARASAN的下面。在图形化配置界面中按照如下路径打开:
->Device Drivers
->NAND Device Support
结果如图18所示:
从图18可以看出,在配置项“Configure Arasan Nand”下面有一行注释,注释内容为
“*** Generic NAND options***”。
9、source
source用于读取另一个Kconfig,比如:
source "arch/Kconfig"
这个前面已经讲过了。