最早接觸到Kconfig是在u-boot的移植過程中。所今天來好好學習一下如何編寫一個符合Kconffigde 配置文件。Kbuild或者是Kconfig的中文翻譯意思是內核配置/構建系統。他最早出自哪里我不太清楚,但是Linux內核上的應用漸漸的增加了他的曝光度也讓我見識到了。他的基本思路就是編輯一些配置字段,其中處理了各個配置之間的依賴和互斥等邏輯從而為一個復雜龐大的軟件系統源碼移植裁剪提供了優秀的配置工具,主要分為無界面版本和有界面的。使用方式無界面的現在常常被用來使用提供好的配置文件生成符合源碼依賴關系的配置文件,而圖形配置界面才是常常使用來進行配置裁剪源碼系統的工具。圖形化界面是靠讀取指定的Kconfig文件進行顯示渲染和配置並最后生成對應的配置文件,所以這里來學習記錄一下Kconfig文件的編碼規則。
config
Kconfig用config 定義一個配置項編碼形式如下:
config XXX type select xxx depends on xxx || xxx default range prompt help
XXX為這個配置名稱,在整個配置系統中唯一,如果在多個地方定義這個配置項,實際上配置工具會自動統一不同地方的同名配置的值為同一個,所以最好避免這類使用方式。可以說config定義的配置項時整個kbuild的一個最小配置單元。這里配置項目地下的具體內容描述如下:
type
bool 只有y和n,其后可以跟輸入提示,如果沒有則圖形配置界面上將不會顯示出當前配置項。 int 整形數,輸入提示同上bool; hex 十六進制數,輸入提示同上bool;和int的區別就是輸入數字時生成的內容會自動添加0x在前面 string 字符串 ,輸入提示同上bool; tristate Linux源碼構建特有的配置類型,輸入提示同上bool;他的可取值比bool多了一個m,但是有時候不一定支持m值所以這個類型就和bool相同了。
select
表示選擇這個選項時會同時自動選擇另一個配置項,且當前配置項必須是具備bool類屬性的配置項,其次是被select的選項也必須是bool類屬性的配置選項。
這里的配置項選項類似於bool,tristate這種配置項。
default
表示這個配置項的默認值。需要根據具體的配置項類型決定。
depends on
表示這個配置選項的啟用依賴其他的選項。如果依賴項未啟用則界面上不顯示出來。
range
作為int和hex類型時配置還可以支持range 屬性增加輸入的范圍限制。輸入超出限制時軟件會給出提示。
prompt
使用prompt 單獨一行書寫輸入提示信息,也常常用字其他不能直接在配置類型后書寫提示字段的類型的配置中。
choice
Kconfig用choice 定義一個配置項包含同類配置項的多選一情況,編碼形式如下:
choice config choice1 bool "choice1" config choice2 bool "choice2" config choice3 bool "choice3" config choice4 bool "choice4" endchoice
他最后呈現到配置界面就是,羅列出choice下的配置項選擇一個使能。當前choice不會生成具體的配置項只會生成所選配置項的配置內容,他存在的意義更像是將多個選項的互斥關系體現出來,更加凸顯所配置特定功能的不同配置模式的意味。choice不能嵌套——choice禁止套娃。chioce可以使用上面的config的部分屬性關鍵字如prompt,default,help等,但是有一點choice的子配置項只能是bool或者tristate類型的選項,且選項下的每一個config都不再使用default屬性。
menu
Kconfig用menu定義一個子菜單配置項集合編碼形式如下:
menu menu_test comment "This is an memu " config TEST_HEX hex prompt "hex test config" range 0 20 help None config TEST_INT int "int test config" range 0 20 help None config TEST_BOOL bool "bool test config" select TEST_SELECT2 help None config TEST_STRING2 string "string test config" default 2 help None endmenu
menu是kconfig將一些配置項划分為一個子項功能相關的配置集合的子菜單目錄,他同choice一樣本身不描述具體的配置。類似UI界面的子菜單,子菜單中的設置也可以拿出來單獨配置但就是缺乏分類不方便人使用管理,menu允許嵌套,形成多級子菜單這和常見的系統設置的概念相同。
comment
常用來顯示大標題類似的注釋內容使用,常常在menu選項下用,最后會以***comment***的形式顯示。除了給指定的menu進行注釋可以使用comment,他還可以直接卸載配置文件的頂層即不屬於任何一個項,類似config一樣。
source
實際的工程源碼往往都會根據具體的功能或其他方面的考慮分為不同的目錄,而開發過程也習慣將對應的配置文件Kconfig也放到指定的源碼根目錄下。這樣只要頂級根目錄下的Kconfig使用source引用對應目錄下的文件就可以將對象目下的配置導入。注意的是Kconfig是支持遞歸導入的導入的內容就是類似C代碼中的include直接將指定文件的內容貼在source 調用的位置且在運行時就完成了導入內容的展開。
總結
Kbuild工具的出現大大的減輕了大型軟件如Linux和u-boot等的移植,因為他幫移植過程處理了一部分依賴和互斥邏輯,這在你對一個系統的軟件源碼之間依賴關系不是很清楚的時候是很有用的。最后在配合對相應的工具將生成的配置文件轉為C代碼的頭文件,在編譯時引用對應的頭文件就能對源碼進行條件編譯了進而完成率移植裁剪。對了Kconfig的源碼也是支持注釋的,注釋使用“#”后面的單行就是注釋的內容了。