當在內核根目錄執行 make menuconfig 時會出現內核配置界面,而配置界面中的選項、條目全都依賴於各個文件夾中的Kconfig配置文件。
可以說各個文件夾中的Kconfig配置文件是整個內核文件這張大網中的每一個節點。
這篇文章主要介紹Kconfig配置文件的語法。
一、關鍵字介紹
(1) config
配置項。可以定義一行配置選項。
用例:
config MENU_2_1_CONFIG_1 #二級菜單(1)的選項1
bool "MENU_2_1_CONFIG_1" #bool類型(y/n),跟着提示信息
select MENU_2_1_CONFIG_2 #本條件選中則選中條件 MENU_2_1_CONFIG_2
select MENU_2_1_CONFIG_4 #本條件選中則選中條件 MENU_2_1_CONFIG_4
default y #bool默認值爲y
(2)menuconfig
菜單配置項。可以定義一行配置選項,並且子選項會顯示在子頁面。
用例:
menuconfig Level_2-5_menu #二級菜單(5)開始
bool "Level 2-5 menuconfig"
default n
if Level_2-5_menu
config MENU_2_5_CONFIG_1 #選項1
bool "MENU_2_5_CONFIG_1"
default n #bool默認值爲n
config MENU_2_5_CONFIG_2 #選項2
bool "MENU_2_5_CONFIG_2"
default y #bool默認值爲n
endif
(3)choice endchoice
單選配置單。選項會在子頁面顯示。要以 choice 開頭, endchoice 結尾。
用例:
choice 選擇配置項,類似單選功能
prompt "choice name" #配置項的顯示名稱
default OPTION_2 #默認選擇的配置
config OPTION_1 #選項1
bool "OPTION_1"
config OPTION_2 #選項2
bool "OPTION_2"
config OPTION_3 #選項3
bool "OPTION_3"
config OPTION_4 #選項4
bool #沒帶提示信息的條件類型不會現實
endchoice 選擇配置項結束
(4)comment
註釋。會顯示一行註釋信息。
用例:
comment "you choose MENU_2_4_CONFIG_1 !!" #打印註釋信息
(5)menu endmenu
菜單。子內容會在子頁面顯示。要以 menu 開頭, endmenu 結尾。菜單標題內容跟在 menu 後。
用例:
menu "Level 2-4 menu" #二級菜單(4)開始
config MENU_2_4_CONFIG_1 #二級菜單(4)的選項1
bool "MENU_2_4_CONFIG_1" #bool類型(y/n),跟着提示信息
default n #bool默認值爲n
if MENU_2_4_CONFIG_1 #如果 選項(MENU_2_4_CONFIG_1)被選中
comment "you choose MENU_2_4_CONFIG_1 !!" #打印註釋信息
endif
endmenu #二級菜單(4)結束
(6)if endif
if 判斷。if 後面跟着選項名,就是當該選項被選中時成立。
用例:
if MENU_2_4_CONFIG_1 #如果 選項(MENU_2_4_CONFIG_1)被選中
comment "you choose MENU_2_4_CONFIG_1 !!" #打印註釋信息
endif
(7)source
讀取其他的配置文件。類似include。
用法:
source "drivers/test/Kconfig"
(8)select
選中指定選項。select 後面可以跟着已經定義了的配置選項,一般用作如果XXX選項被選中則選中YYY選項。
用法:
config MENU_2_1_CONFIG_1 #二級菜單(1)的選項1
bool "MENU_2_1_CONFIG_1" #bool類型(y/n),跟着提示信息
select MENU_2_1_CONFIG_2 #本條件選中則選中條件 MENU_2_1_CONFIG_2
select MENU_2_1_CONFIG_4 #本條件選中則選中條件 MENU_2_1_CONFIG_4
default y #bool默認值爲y
(9)depends on
依賴於XXX選項。如果依賴的選項被選中了,則當前的選項纔會顯示,是連帶關係。類似於子選項。
用法:
config MENU_2_1_CONFIG_2 #二級菜單(1)的選項2
bool "MENU_2_1_CONFIG_2" #bool類型(y/n),跟着提示信息
default n #bool默認值爲n
config MENU_2_1_CONFIG_3 #二級菜單(1)的選項3
bool "MENU_2_1_CONFIG_3" #bool類型(y/n),跟着提示信息
depends on MENU_2_1_CONFIG_2 #當條件 MENU_2_1_CONFIG_2 被選中時,本條件才顯示
default y #bool默認值爲y
如果 MENU_2_1_CONFIG_2 被選中,則 MENU_2_1_CONFIG_3 纔會顯示。
depand on 功能也可以使用 if 替代使用。
(10)選項類型
每個配置選項都有不同的選項類型。
- bool:布爾類型,可選參數(y/n)
- tristate三態:內建、模塊、移除,可選參數(y/m/n)
- string:字符串,可填任意字符串內容
- hex:十六進制,可填任意16進制數值
- int:整型,可填任意10進制數值
在選項類型後+空格+通過雙引號括起來的字符串可以讓該選項顯示並且顯示字符串的內容作爲提示信息。
假如選項類型後面不跟任何字符串,那麼選項仍然存在,但是不會顯示出來。
二、示例Kconfig代碼
寫了一個測試的Kconfig文件。可以加載出來看看,方便理解。
#
# Kconfig test file
#
menu "Level 1 menu" #一級菜單開始
menu "Level 2-1 menu" #二級菜單(1)開始
config MENU_2_1_CONFIG_1 #二級菜單(1)的選項1
bool "MENU_2_1_CONFIG_1" #bool類型(y/n),跟着提示信息
select MENU_2_1_CONFIG_2 #本條件選中則選中條件 MENU_2_1_CONFIG_2
select MENU_2_1_CONFIG_4 #本條件選中則選中條件 MENU_2_1_CONFIG_4
default y #bool默認值爲y
config MENU_2_1_CONFIG_2 #二級菜單(1)的選項2
bool "MENU_2_1_CONFIG_2" #bool類型(y/n),跟着提示信息
default n #bool默認值爲n
config MENU_2_1_CONFIG_3 #二級菜單(1)的選項3
bool "MENU_2_1_CONFIG_3" #bool類型(y/n),跟着提示信息
depends on MENU_2_1_CONFIG_2 #當條件 MENU_2_1_CONFIG_2 被選中時,本條件才顯示
default y #bool默認值爲y
config MENU_2_1_CONFIG_4 #二級菜單(1)的選項4
bool #bool類型(y/n),沒帶提示信息,本選項不會顯示,但是存在
default n #bool默認值爲y
endmenu #二級菜單(1)結束
menu "Level 2-2 menu" #二級菜單(2)開始
config MENU_2_2_CONFIG_1 #二級菜單(2)的選項1
bool "MENU_2_2_CONFIG_1" #bool類型(y/n),跟着提示信息
default n #bool默認值爲n
config MENU_2_2_CONFIG_2 #二級菜單(2)的選項2
tristate "MENU_2_2_CONFIG_2" #tristate類型(y/n/m),跟着提示信息
default m #tristate默認值爲m
config MENU_2_2_CONFIG_3 #二級菜單(2)的選項3
string "MENU_2_2_CONFIG_3" #string類型(任意字符串),跟着提示信息
default "this is MENU_2_2_CONFIG_3" #string默認值爲 this is MENU_2_2_CONFIG_3
config MENU_2_2_CONFIG_4 #二級菜單(2)的選項4
hex "MENU_2_2_CONFIG_4" #hex類型(十六進制的值),跟着提示信息
default 0x456789 #hex默認值爲 0x456789
config MENU_2_2_CONFIG_5 #二級菜單(2)的選項5
int "MENU_2_2_CONFIG_5" #int類型(十進制的值),跟着提示信息
default 666 #int默認值爲 666
endmenu #二級菜單(2)結束
menu "Level 2-3 menu" #二級菜單(3)開始
choice 選擇配置項,類似單選功能
prompt "choice name" #配置項的顯示名稱
default OPTION_2 #默認選擇的配置
config OPTION_1 #選項1
bool "OPTION_1"
config OPTION_2 #選項2
bool "OPTION_2"
config OPTION_3 #選項3
bool "OPTION_3"
config OPTION_4 #選項4
bool #沒帶提示信息的條件類型不會現實
endchoice 選擇配置項結束
endmenu #二級菜單(3)結束
menu "Level 2-4 menu" #二級菜單(4)開始
config MENU_2_4_CONFIG_1 #二級菜單(4)的選項1
bool "MENU_2_4_CONFIG_1" #bool類型(y/n),跟着提示信息
default n #bool默認值爲n
if MENU_2_4_CONFIG_1 #如果 選項(MENU_2_4_CONFIG_1)被選中
comment "you choose MENU_2_4_CONFIG_1 !!" #打印註釋信息
endif
endmenu #二級菜單(4)結束
menuconfig Level_2-5_menu #二級菜單(5)開始
bool "Level 2-5 menuconfig"
default n
if Level_2-5_menu
config MENU_2_5_CONFIG_1 #選項1
bool "MENU_2_5_CONFIG_1"
default n #bool默認值爲n
config MENU_2_5_CONFIG_2 #選項2
bool "MENU_2_5_CONFIG_2"
default y #bool默認值爲n
endif
endmenu #一級菜單結束
三、測試
我把這個 Kconfig 文件加在了 Device Drivers 菜單下,假裝這是一個設備驅動。
(1)添加 Kconfig 文件
在 kernel/drivers 目錄下創建 teset 文件夾,然後添加文件 Kconfig 並把上面的示例代碼拷貝進去。
(2)修改上級Kconfig 文件
上級的 Kconfig 文件在目錄 kernel/drivers 下。
打開 Kconfig 文件,在最後一行添加下面一行代碼,表示加載 test 文件夾下的 Kconfig 文件。
source "drivers/test/Kconfig"
(3)make menuconfig
在 kernal 目錄下執行 make menuconfig 進行測試。
- 進入Device Drivers —>
- 在最下面的菜單就是了。