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/1QYG6ofwNp1OaOoE4vXJHQQ
  提取碼:j0a1

 

需要聲明的是,該方案使用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,後者用於程序代碼中。 

 

以上就是本方案的所有內容,更多知識技巧還請各位同學自行探索。

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章