zeerd's blog         Search     Categories     Tags     Feed

闲来生雅趣,无事乐逍遥。对窗相望雪,一盏茶香飘。

使用 Kconfiglib 实现 menuconfig

#menuconfig @Program


类似 Kernel 、 toybox 、 busybox 等软件的通过 GUI 界面选择性编译的系统。

一个通用性的选择是基于 Python 的 Kconfiglib 。 它的源码发布在 GitHub 上。

安装

对于 Ubuntu 系统,可以直接通过 pip install kconfiglib 来安装。

如果网络有问题,也可以手动安装:

$ git clone https://github.com/ulfalizer/Kconfiglib
$ cd Kconfiglib
$ python setup.py build
$ sudo python setup.py install

使用

基本的使用方法可以直接参考上面给出的网址。

关于 Kconfiglib 的作用,简单的说,就是将一系列由用户编写的的Kconfig文件转换成.config或者config.h。 前者可以直接被Makefile利用;后者可以作用于使用C/C++系统的软件。

当然,前者可以通过脚本解析的方式应用于更多的其他使用场景。

KConfig

编写

通过合理的组织Kconfig文件,可以实现多级目录。

例如:

menuconfig XXX_YYY
    bool "YYY of XXX"
    default n
if XXX_YYY
    menuconfig XXX_YYY_ZZZ
        bool "ZZZ of YYY"
        default y
endif # XXX_YYY

这样就能生成一个二级目录。当XXX_YYY为选中状态时,可以进入并操作二级目录中的XXX_YYY_ZZZ。 这种写法,会生成两个标识符,分别为CONFIG_XXX_YYYCONFIG_XXX_YYY_ZZZ

如果不需要一个名叫CONFIG_XXX_YYY的标识符,也可以直接写成:

menu "YYY of XXX"
    menuconfig XXX_YYY_ZZZ
        bool "ZZZ of YYY"
        default y
endmenu

这种写法,只会生成CONFIG_XXX_YYY_ZZZ

类型

Kconfig支持多种标识符类型。分别是:

  • “bool” : 布尔型
  • “tristate” : 三相
  • “string” : 字符串
  • “hex” : 16进制
  • “int” : 整数

如上面的例子中就使用了bool类型。

其他

更多使用方法可以参考Kernel的 Kconfig Language

CMake

我暂时没找到可以让CMake直接利用.config的方法。所以,写了个脚本来解析.config并生成用于运行cmake的命令行参数:

$ OPTs=$(awk 'BEGIN{
            FS="="
        }
        {
            if(NF==2){
                if($2=="y"){
                    v="ON"
                }
                else if($2=="n"){
                    v="OFF"
                }
                else{
                    v=$2
                }
                printf("-D%s=%s ",$1,v)
            }
        }' $KCONFIG_CONFIG)
$ cmake $SRC $OPTs

由于Kconfig的数据类型中不包含“浮点数”,因此,当需要通过命令行参数传入浮点数时,可以考虑传入字符串,然后使用string命令删除引号。

string(REPLACE "\"" "" CONFIG_XXX_PARAM_YYY ${CONFIG_XXX_PARAM_YYY})