Kconfig 語言
菜單入口
Kconifg 文件包含一系列以關鍵字開頭的菜單入口(菜單項)。
config
定義一個符號 symbol。它是構成 Kconfig 的絕大數菜單入口,其他菜單入口幫助組織此類型入口。 語法如下:
config <symbol>
<config options>
menuconfig
此入口和簡單 config 入口相似,定義一個符號 symbol,但是也暗示一個菜單塊,后接子入口。需保證所有子入口應該在此入口下方,且依賴於此入口符號。語法如下:
menuconfig <symbol>
<config options>
choice/endchoice
定義一個選擇組。選擇組類型僅僅可以設置為 bool 或 tristate,如果未指定類型,則取決於第一個選擇項的類型。bool 類型只允許單個 config 入口被選擇,tristate 類型允許多個 config 入口被設置為 m。 支持語法如下:
choice [<symbol>]
<choice options>
<choice block>
endchoice
comment
定義注釋語句。將在配置階段顯示給用戶,並且打印到輸出文件中。僅支持依賴屬性。語法如下:
comment <prompt>
<comment options>
menu/endmunu
定義一個菜單塊。菜單塊內的其他子入口繼承此項的依賴。僅支持依賴和可視屬性。語法如下:
menu <prompt>
<menu options>
<menu block>
endmenu
if/endif
定義一個條件塊。條件塊內的其他菜單入口追加此項的依賴表達式 expr。
if <expr>
<if block>
endif
source
讀取一個指定的配置文件,此文件總會被解析。
source <file>
mainmenu
定義配置程序的標題欄。應該被放在配置文件的開頭。
mainmunu <prompt>
菜單屬性
菜單項可以有一些屬性。但是並不是所有菜單項都支持任意屬性,詳看菜單項說明。
類型 - type
定義類型的語法如下:
<type>
有以下幾種類型:
| 類型 | 說明 |
|---|---|
| bool | 布爾類型 |
| tristate | 三態類型,可以設置為 y、m 或 n。 |
| string | 字符串類型 |
| hex | 十六進制整數類型 |
| int | 整數類型 |
輸入提示 - prompt
每個菜單項最多可以含有一個提示屬性,此屬性接收一個字符串,直接顯示給用戶提示輸出。語法如下:
prompt <prompt> [if <expr>]
也可以在類型后面直接跟輸入提示。
<type> <prompt>
默認值 - default
一個配置菜單項可以接收多個默認值,但是僅第一個默認值有效。未指定默認值的 config 入口默認未選定。語法如下:
default <value> [if <expr>]
也可以在類型后面直接跟默認值。
def_bool/def_tristate <value> [if <expr>]
依賴 - depends
菜單項的依賴屬性會應用到所有的其他屬性上。同時指定多個依賴屬性時,它必須同時滿足,即為邏輯與關系。語法如下:
depends on <expr>
反向依賴 - select
此屬性可以強制選定一個符號,無論此符號的依賴是否滿足。被選定的符號僅支持 bool 或 tristate 類型。語法如下:
select <symbol> [if <expr>]
弱反向依賴 - imply
此屬性和 select 相似,用於選定一個符號,但是被選定的符號仍有可能被直接依賴或用戶輸入設置為 n。語法如下:
imply <symbol> [if <expr>]
例子:
假設有如下定義:
config FOO tristate "foo" imply BAZ config BAZ tristate "baz" depends on BAR則它們可能的值如下:
FOO BAR BAZ 的默認值 BAZ 可選值 n y n y/m/n m y m y/m/n y y y y/m/n n m n m/n m m m m/n y m n m/n y n n n
可見性 - visible
此屬性僅用於菜單塊,根據條件來決定是否向用戶顯示菜單塊(但是包含的符號依然可以被其他符號選定),和應用於單個菜單項的 prompt 屬性相似。定義語法如下:
visible if <expr>
數字范圍 - range
此屬性用於限制 int 和 hex 類型符號的輸出值的范圍。定義語法如下:
range <symbol> <symbol> [if <expr>]
幫助文本 - help
此屬性定義一段幫助文本。可以為多行或空行,當行的縮進級別小於幫助文本的第一行時,表示結束。定義語法如下:
help
<help text>
表達式 expr
很多菜單屬性都可以使用表達式 expr,表達式含有以下幾種:
| 表達式 | 說明 |
|---|---|
| <symbol> | bool 和 tristate 符號簡單轉換為相應表達式的值。其他類型轉換為 n。 |
| <symbol> = <symbol> | 如果兩個符號相等,就返回 y,否則返回 n。 |
| <symbol> != <symbol> | 參考上述 |
| <symbol> < <symbol> | 參考上述 |
| <symbol> > <symbol> | 參考上述 |
| <symbol> <= <symbol> | 參考上述 |
| <symbol> >= <symbol> | 參考上述 |
| ( <expr> ) | 返回表達式的值,用於優先級。 |
| ! <expr> | 取反 |
| <expr> && <expr> | 邏輯與 |
| <expr> || <expr> | 邏輯或 |
宏定義
Kconfig 也支持宏定義,和 Makefile 語法非常相似。
變量
和 Makefile 相似,Kconfig 變量作為一個宏變量,被擴展為一個字符串。有兩種類型的變量
-
簡單擴展變量
使用
:=賦值符號定義的變量。當讀到該行時,它的右邊立刻擴展。 -
遞歸擴展變量
使用
=賦值符號定義的變量。它的右邊被簡單保存字面值(未擴展的值),當變量使用時才真正擴展。
可以使用 += 賦值符號向變量追加文本,不改變符號的類型。使用一個變量的語法如下:
$(var)
函數
Kconfig 提供和 Makefile 類似的定義使用宏函數的功能。調用函數的語法如下:
$(func,arg1,arg2...)
注意:
Kconfig 僅使用
,作為分隔符,但是 Makefile 的函數名和第一個參數用空白字符分隔。如下:$(func arg1,arg2...)Kconfig 調用用戶定義的函數和內建函數使用相同的方式,但是 Makefile 調用用戶定義的函數時,必須使用關鍵字
call觸發。如下:$(call my-func,arg1,arg2...)
Kconfig 目前支持以下內建函數:
#擴展為執行的子命令 command 的標准輸出。
$(shell,command)
# 發送一段文本 text 到標准輸出。
$(info,text)
# 如果條件為真,則發送文本 text 和當前 Kconfig 文件名以及行號到錯誤輸出。
$(warning-if,condition,text)
# 和 warning-if 相似,但是會立刻終止解析。
$(error-if,condition,text)
# 擴展為被解析的文件名。
$(filename)
# 擴展為被解析的行號。
$(lineno)
