Linux下menuconfig與Kconfig基礎知識概要
2021-06-30
一、簡介
menuconfig是Linux平臺用於管理程式碼工程、模組及功能的實用工具。上至決定某一程式模組是否編譯,下到某一行具體的程式碼是否需要編譯以及某個項的值在本次編譯時該是什麼都可由menuconfig來定義。
menuconfig的使用方式通常是在編譯系統之前在系統原始碼根目錄下執行 make menuconfig 命令從而開啟一個圖形化配置介面,再通過對各項的值按需配置從而達到影響系統編譯結果的目的。一個典型的 menuconfig 配置介面如下圖所示:
menuconfig 配置後的結果將會儲存在對應模組根目錄下的 .config 檔案中。如kernel原始碼根目錄或應用程式原始碼根目錄。Linux在編譯系統映象時會載入這些 .config 檔案中的配置項來決定編譯結果。
menuconfig 其實只能算是一個“前端”,用於支撐它、決定它擁有什麼配置項的“後端”則被稱為 Kconfig。
Kconfig 嚴格來講是一種程式語言,它擁有自己的語法及結構。正是這些語法和結構組成了menuconfig在使用者眼前不同的表現形式。
不過幸好,Kconfig這門“程式語言”的內容很少,通常只需花上半個小時就能掌握大半了。而這篇博文主要也是在介紹Kconfig的知識。
總得來說,menuconfig是Linux平臺基於Kconfig用於管控程式碼實用工具。
二、常用的Kconfig語法
Kconfig的語法及程式碼結構非常簡單。本博文只介紹Kconfig中常用的幾個知識點。更詳盡的內容可以參閱Linux官方提供的幫助文件。這份文件們於核心原始碼目錄下的 ./Document/kbuild/kconfig-language.txt
所謂 Kconfig,其實就是一個位於要被控制的程式模組原始碼目錄下的檔名為 Kconfig 的普通的文字檔案而已。
Kconfig檔案在Linux系統中的數量是不確定的。我們既可以將所有配置項寫在一個Kconfig檔案上,又可以分模組分功能將它們分別寫在不同的Kconfig檔案中。一般來講,都是在各個程式或模組的根目錄下建立一個Kconfig用於記錄所有配置該程式/模組的配置項。然後再在其父級目錄的Kconfig中通過 souce code_demo/Kconfig 的形式將其引入到menuconfig系統中去。
Kconfig常用的幾個知識點有以下五個:
1、config模組
2、menuconfig模組
3、menu模組
4、choice模組
5、if 與 depends on 模組
2.1、config模組
config模組是Kconfig最基礎最重要的知識點。一個config就表示一個配置項。其語法如下所示:
config 配置項名
配置項型別
配置項提示語
其它選項
配置項名表示最終儲存在 .config 檔案中的鍵值對項的鍵名,通常用全大寫和單詞之間以下劃線隔開的形式書寫。
配置項型別就是基礎型別,可選的型別有:bool、tristate、string、hex、int。
bool 表示布林型在.config中以 y 和 n 表示。
tristate是三態型別,通常用在核心驅動控制中。在.config中以 y 、n和m表示。y表示將驅動編譯進核心映象,n表示不編譯,m表示將驅動編譯為ko形式。
string是普通字串型別,直接將在menuconfig圖形介面中使用者輸入的值原樣儲存在.config中。
hex是十六進位制形式,只能輸入0~F的內容。
int是十進位制整數形式,只能輸入數字。
配置項提示語以prompt開頭,後跟一個空格字元,然後就是用雙引號包圍的文字提示語。作用就是在menuconfig圖形介面中作為配置項的提示語。如下圖所示:
其它選項這裡暫且不管。
下面我們嘗試編寫一個包含了 config 內容的Kconfig。
在目錄menu_demo下新建一個Kconfig檔案,內容如下所示:
config KCONFIG_DEMO_ITEM1 bool prompt "demonstate item1 for bool learning" config KCONFIG_DEMO_ITEM2 string prompt "demonstate item2 for string learning" config KCONFIG_DEMO_ITEM3 hex prompt "demonstate item3 for hex learning"
然後再其父目錄上的Kconfig中將此Kconfig檔案載入進來:
# # For a description of the syntax of this configuration file, # see scripts/kbuild/config-language.txt. # mainmenu "Users Configuration" # menu "Applications Settings" source "menu_demo/Kconfig"
然後在系統原始碼根目錄下執行 make menuconfig 後即可看到我們剛新增進去的幾個配置項了,如下圖所示:
如果配置項是 bool、tristate 型別,則通過空格鍵來切換它們的選項值。其它型別值則通過回車鍵開啟輸入框來鍵入對應的值完成配置。
這裡我們將第一項選上,第二項隨意輸入一個字串,第三項留空,然後一路退出menuconfig並儲存,可以看到.config檔案關於我們新增的配置項的內容如下所示:
root@ubuntu:~/workspace/rtl8197/rtl819x# head -n 20 users/.config # # Automatically generated make config: don't edit # RLX Linux builder # Wed Jun 30 21:20:58 2021 # CONFIG_KCONFIG_DEMO_ITEM1=y CONFIG_KCONFIG_DEMO_ITEM2="hello world" CONFIG_KCONFIG_DEMO_ITEM3=
此即為最基礎的配置方式。
2.2、menuconfig模組
menuconfig可以認為是上一節 config 中的升級版。
首先它自己也是一個正常的配置項,通過自己的配置值來決定另外一組配置項是否作為子選單的形式顯示出來並供使用者配置。具體語法如下所示:
1 menuconfig KCONFIG_DEMO_MENUCONFIG1 2 bool 3 prompt "menuconfig learning" 4 5 if KCONFIG_DEMO_MENUCONFIG1 6 7 config MENUCONFIG_SUBITEM1 8 bool 9 prompt "menuconfig subitem1" 10 11 config MENUCONFIG_SUBITEM2 12 bool 13 prompt "menuconfig subitem2" 14 15 endif
第一行通過menuconfig配置了一個bool型別的配置項。第五行的if語句暫且不深究,只需要知道它的作用是當第一行的配置項被選中時會將if/endif之內的配置項作為 KCONFIG_DEMO_MENUCONFIG1 項的子配置項顯示即可。
此配置項在menuconfig中的顯示效果及其選單內部的顯示效果如下面兩張圖所示:
此時我們選中menuconfig配置項,其子選單內部的效果如下圖所示:
2.3、menu模組
如果說上一節的menuconfig是一個帶了選單功能的配置項,那麼這個 menu 就是一個純粹的選單項了。menu本身不可配置,只是用來標記其內部可能擁有子配置項。
以下是示例語法:
menu "menu learning" config MENU_SUBITEM1 bool prompt "subitem1" config MENU_SUBITEM2 bool prompt "subitem2" config MENU_SUBITEM3 bool prompt "subitem3" endmenu
對應的menuconfig顯示效果如下圖所示:
menu項在.config中會將選單提示語作為註釋一併寫入,如下所示:
root@ubuntu:~/workspace/rtl8197/rtl819x# head -n 20 users/.config # # Automatically generated make config: don't edit # RLX Linux builder # Wed Jun 30 21:45:28 2021 # # # menu learning # CONFIG_MENU_SUBITEM1=y # CONFIG_MENU_SUBITEM2 is not set # CONFIG_MENU_SUBITEM3 is not set
2.4、choice模組
choice是單選模組。具體語法如下所示:
choice bool prompt "choice learning" config CHOICE_ITEM1 bool prompt "choice1" config CHOICE_ITEM2 bool prompt "choice2" config CHOICE_ITEM3 bool prompt "choice3" endchoice
在menuconfig中的顯示效果如下圖所示:
2.5、if與depends on模組
if 與 depends on 模組都屬於 config 配置項中的”其它選項“。
它們的作用是等價的,都是根據指定的配置項是否被配置來決定本配置項的顯示與否。
它們的語法如下所示:
config MY_CONFIG1 bool prompt "my config1" config MY_CONFIG2 bool prompt "my config2" if MY_CONFIG1 config MY_CONFIG3 bool prompt "my config3"
depends on MY_CONFIG2
此配置項表示當第一個配置項為y時,就可以配置第二個配置項,當第二個配置項為y時,才能夠配置第三個配置項。其效果如下圖所示:
選中第一項,效果如下圖所示:
選中第二項,效果如下圖所示:
2.6、其它知識點
1、
配置項提示語其實可以和型別合併在一起從而省略 prompt 關鍵字。以下示例中的兩個配置效果是等價的:
config KCONFIG_DEMO_ITEM1 bool prompt "demonstate item1" config KCONFIG_DEMO_ITEM2 bool "demonstate item2"
2、
配置項的其它選項中可以通過 default 關鍵字來配置選項的預設值,如:
config MY_CONFIG1 bool "my config1" default y
3、
Kconfig中還有一個模組被稱為 comment,其作用就是單純的為在其之後的配置項添加註釋說明。並且會將說明內容一併寫進 .config 檔案中。具體效果與上面 2.3 節menu模組的註釋一樣。其語法如下所示:
comment "I am a comment" config MY_CONFIG1 bool prompt "my config1" config MY_CONFIG2 bool prompt "my config2" if MY_CONFIG1 comment "I'm a comment2" config MY_CONFIG3 bool prompt "my config3" depends on MY_CONFIG2
在menuconfig中的效果如下圖所示:
在.config中的效果如下所示:
root@ubuntu:~/workspace/rtl8197/rtl819x# head -n20 users/.config # # Automatically generated make config: don't edit # RLX Linux builder # Wed Jun 30 22:03:01 2021 # # # I am a comment # CONFIG_MY_CONFIG1=y CONFIG_MY_CONFIG2=y # # I'm a comment2 # # CONFIG_MY_CONFIG3 is not set
4、
在配置項的其它選項中還有一個 help 關鍵字。它的作用是為配置項新增一個更詳細的說明文件。使用者在menuconfig圖形配置介面通過 ? 鍵來喚出詳細文件的展示。
其語法如下所示:
config MY_CONFIG1 bool prompt "my config1" help I am a help document. This document can be a long length
在menuconfig介面,將游標移動到my config1項上,然後通過 ? 鍵來喚出此幫助文件的展示視窗,如下圖所示:
以上即是menuconfig與Kconfig中最常用的知識點的簡要介紹了。更多完整詳盡的知識請參閱附件貼出的官方文件。
官方文件下載連結:https://files.cnblogs.com/files/chorm590/kconfig-language.zip