Linux内核menuconfig在普通C/C++程序开发时的应用

2022-03-24

关键字:


在做Linux系统开发时经常会用到menuconfig来裁剪内核功能模块或控制应用功能,menuconfig的可视化配置大大降低了复杂程序功能配置的难度与出错几率。

 

在纯应用开发中,当其复杂到一定程度时,功能的可配置性也是必然会引入的功能之一。若单纯靠人工在Makefile或头文件中配置模块,随着程序规模的增大,配置效率与出错几率都会受到严重的挑战,这个时候我们就会念起menuconfig的好了。我们当然可以将这个应用工程的配置功能嵌进系统级menuconfig,然后通过工程目录下的Kconfig来配置,但这种将上层应用与系统耦合在一起的模式并不太妥。再说了,我们其实根本就不能假设这个应用的开发是在某个系统源码环境下进行的,也许人家根本就没有运行menuconfig的条件呢。

 

所以,我们需要一个完全独立的menuconfig。

 

但笔者在网上似乎没找到有类似的方案,于是简单了解了一下手里某个项目中的menuconfig执行流程。折腾了半天,终于是弄出了一个完全独立于系统源码环境的menuconfig出来。该模块的使用非常方便,直接以源码形式集成在应用工程目录下,然后敲make命令即可打开可视化的配置界面,更关键的是,这套方案占据的空间非常少,仅需100多kb的存储空间。以下是此方案的介绍及使用说明。

 

方案源码已上传至百度云,下载链接如下:

  链接:https://pan.baidu.com/s/15m81G51vxHwOB0ourW0-SA 
  提取码:ul0x

 

需要声明的是,该方案使用lxdialog绘制可视化界面。lxdialog的源码已打包进附件中,但它的运行需要依赖其它支援库,若您在运行过程中报相关依赖错误请自行解决。

 

接下来就是该方案的详细说明。

 

下载压缩包并解压,我们可以看到如下文件结构:

 

我们唯一需要关心并修改的文件就是根目录下的config.in。若您需要定制唤出方式,可能还需要关注根目录下的Makefile文件,因为在本例中是直接make或make all即可唤出可视化配置界面的。

 

随后可以尝试着运行一下,直接在根目录下敲make或make all命令,如果您看到了如下图所示画面,则表示它运行成功了。

 

config.in详解:

config.in文件是用于编写需要被展示在可视化界面的配置信息。本方案示例中的config.in中列出了几种常用的配置项,下面逐一讲解。

 

布尔型属性:

见文件第16行。

bool 'Simple boolean item'    CONFIG_SBI_ITEM1

此项即是上图中的第一个配置项。第一列为属性类型,固定为"bool"。第二列为配置摘要。第三列则为可应用于Makefile和代码文件的配置产物。

 

十六进制属性:

见第18行。

hex 'Simple HEX data config' CONFIG_SHEX_ITEM1  0xabcd

此项即上图中第二个配置项。第一列为属性类型,固定为"hex"。第二列为摘要信息。第三列为配置产物。第四列是可选的,为配置产物的默认值。

 

整型属性:

见第20行。

int 'Simple int data' CONFIG_SINT_ITEM1 98

共有四列,格式与上述“十六进制属性”类似。

 

字符串属性:

见文件第22行。

string 'Simple string data' CONFIG_STR_ITEM1 "This is the default string-data"

 

单选属性:

见文件第24行。

choice 'Simple choice' "ITEM1  CONFIG_SC_ITEM1 \
                        ITEM2  CONFIG_SC_ITEM2 \
                        ITEM3  CONFIG_SC_ITEM3 \
                        " ITEM1

第三列的ITEM1、ITEM2、ITEM3是所有的可选项,可选项后面的即是配置产物属性。最后一个引号后面的是可选部分,表示默认值。

 

布尔组合属性:

见第30行。

bool 'Bool expand item' CONFIG_BEX_ITEM1
if [ "$CONFIG_BEX_ITEM1" = "y" ]; then
    bool 'Boolean config with prerequisite' CONFIG_BEX_SUBITEM1
    if [ "$CONFIG_BEX_SUBITEM1" = "y" ]; then
        bool 'Boolean config with pre-prerequisite' CONFIG_BEX_SUB_SUBITEM1
    fi
    int 'Integer config with prerequisite' CONFIG_BEX_SUBITEM2 18
fi

此配置项是一个布尔型配置间接控制着若干个子配置项。此例中的含义为:当CONFIG_BEX_ITEM1被选中时,会在其下方会额外有两条配置项("Boolean config with prerequisite"和"Integer config with prerequisite")展示出来,然后"Boolean config with prerequisite"配置项又还控制着另一个布尔型配置。

 

布尔组合子菜单属性:

见第40行。

bool 'Bool expand item2' CONFIG_BEX_ITEM1_2
if [ "$CONFIG_BEX_ITEM1_2" = "y" ]; then
    comment 'you will enter a individual-menu-page'
    bool 'Boolean config with prerequisite2' CONFIG_BEX_SUBITEM1_2
endmenu
fi

此配置与上述“布尔组合属性”大体上一致,区别就是此配置项的子配置项不会直接展示在依赖配置项下方,当"CONFIG_BEX_ITEM1_2"项被选中时,其下方会展示一个提示语"you will enter a individual-menu-page",此提示语是可跳转的,当选中时会跳转到一个全新的页面,该全新的页面中才会展示出"Boolean config with prerequisite2"配置项。

 

复杂条件组合属性:

见文件第49行。

int 'Expanding choice with specified number' CONFIG_ECWSN_ITEM1
if [ "$CONFIG_ECWSN_ITEM1" = "37" ]; then
choice 'which one you want?' "T1 CONFIG_ECWSN_T1 \
                              T2 CONFIG_ECWSN_T2"
fi
if [ "$CONFIG_ECWSN_ITEM1" = "38" ]; then
bool 'ECWSN_ITEM1_SUB2' CONFIG_ECWSN_ITEM1_SUB2
fi

#The below is config in background by prerequisite config
if [ "$CONFIG_ECWSN_ITEM1" == "39" ] || [ "$CONFIG_ECWSN_ITEM1" == "49" ]; then
    define_bool  CONFIG_SILENT_ITEM y 
fi

此配置项是根据母项不同数值以选择性展示不同子配置项的示例。

 

以上就是几种常用配置属性类型,大家按需修改。此方案配置产物与传统menuconfig一样有两个:

  1、.config

  2、autoconf.h

前者用于Makefile,后者用于程序代码中。 

 

以上就是本方案的所有内容,更多知识技巧还请各位同学自行探索。

 


 

posted @ 2022-03-24 21:22  大窟窿  阅读(325)  评论(0编辑  收藏  举报