Linux-Kconfig總結與分析
使用Kconfig時,需要注意的地方
- 1. 在 Kconfig 中定義的配置巨集,字首都沒有 "CONFIG_" ,只有編譯核心時,自動生成 autoconf.h 才會出現字首.
- 2. 如果 XX_defconfig 板卡配置檔案中定義新的巨集=y時,而在Kconfig並 沒有宣告它 ,則核心編譯出來的autoconf.h裡 也不會定義它 的.
- 3. 如果 XX_defconfig 板卡配置檔案中沒有設定 CONFIG_MODULES=y ,則編譯 make modules 時 將會失敗 ,而make menuconfig時, Kconfig中的tristate引數也會被讀寫為bool引數(也就是不能設定m)
CONFIG巨集變數引數
- bool: 表示該CONFIG巨集只能選擇y(編譯核心)或者n(不編譯),不能選擇m(編譯為模組)
- tristate: 表示該CONFIG巨集可以設定y/m/n三種模式(tristate)
- string: 表示該CONFIG巨集可以設為一串字元,比如 #define CONFIG_XXX "config test"
- hex: 表示該CONFIG巨集可以設為一個十六進位制,比如 #define CONFIG_XXX 0x1234
- int: 表示該CONFIG巨集可以設為一個整數,比如 #define CONFIG_XXX 1234
常用引數
- default y: 表示預設是勾上的,當然也可以寫為default m或者default n
- help: 幫助提示資訊
- depends on: 依賴項,比如depends on XXX 表示當前巨集需要CONFIG_ XXX巨集開啟的前提下,才能設定它 (注意依賴項的config引數只有bool或tristate才有效)
- select : 反依賴項,和depends on剛好相反,比如 selecton XXX表示當前巨集如果是y或者m,則會自動設定XXX=y或者m (注意引數只有bool或tristate才有效)
- choice: 會生成一個 單選框 ,裡面通過多選一方式選擇config,需要注意choice中的config引數只能bool或tristate
- prompt: 提示資訊,如果對於choice而言,則會用來當做一個單選框 入口點的標籤
- range : 設定使用者輸入的資料範圍,比如 range 0 100 表示資料只能位於0~100
- menuconfig: menuconfig XXX和config XXX類似,唯一不同的是該選項除了能設定y/m/n外,還可以實現選單效果 ( 能 回車進入該項內部 )
示例1-建立複選框(多選多)-探索巨集變數引數
接下來我們來試試如何給不同巨集設定不同引數,以 MY_SYMBOL1~ MY_SYMBOL5 為例
設定MY_SYMBOL3~ MY_SYMBOL5 依賴於 MY_SYMBOL2
修改核心頂層Kconfig檔案,新增內容:
menuconfig MY_SYMBOL_TEST#生成一個選單巨集項 bool "MY_SYMBOL_TEST" default y config MY_SYMBOL1 bool "my symbol is bool" default y depends on MY_SYMBOL_TEST config MY_SYMBOL2 tristate "my symbo2 is tristate" default m depends on MY_SYMBOL_TEST config MY_SYMBOL3 string "my symbo3 is string" default "test symbo3" depends on MY_SYMBOL2 && MY_SYMBOL_TEST config MY_SYMBOL4 hex "my symbo4 is hex" range 0 0x2000#設定hex區間 default 0x1234 depends on MY_SYMBOL2 && MY_SYMBOL_TEST config MY_SYMBOL5 int "my symbo5 is int" range 0 2000#設定int區間 default 1234 depends on MY_SYMBOL2 && MY_SYMBOL_TEST
效果如下所示:
如上圖所示,可以看到我們設定 my symbol5 超出區間 [0,2000] 時,直接資料報錯
編譯核心後,檢視自動生成的autoconf.h,定義如下:

其中上面的CONFIG_MY_SYMBOL2_MODULE巨集是因為我們在Kconfig設定它為default m ,所以 CONFIG_MY_SYMBOL2_MODULE 是個模組巨集.
示例2-通過choice建立單選框(多選一)
choice prompt "choice example"#作為該單選框入口點的標籤 default y default MY_SYMBOL3#預設選擇MY_SYMBOL3配置項 config MY_SYMBOL1 bool "my symbol1 is bool" help MY_SYMBOL1 example config MY_SYMBOL2 bool "my symbo2 is bool" help MY_SYMBOL2 example config MY_SYMBOL3 tristate "my symbo3 is tristate" help MY_SYMBOL3 example endchoice
編譯核心後,檢視autoconf.h,如下圖所示,可以看到對於choice單選框來說,tristate屬性其實並沒有module功能,只有y/n
未完,後續再遇到不懂的再總結~