Kconfig基本語法(轉載)
Linux 核心在2.6版本以後將配置檔案由原來的config.in改為Kconfig。當執行make menuconfig時會出現核心的配置介面,所有配置工具都是通過讀取arch/$(ARCH)Kconfig檔案來生成配置介面,這個檔案就是所有配置的總入口,它會包含其他目錄的Kconfig。
Kconfig的作用是用來配置核心,它就是各種配置介面的原始檔,核心的配置工具讀取各個Kconfig檔案,生成配置介面供開發人員配置核心,最後生成配置檔案.config。
Kconfig的語法可以參考Documentation/kbuild/kconfig-language.txt,在這裡給出kconfig-language.txt的中文翻譯。
介紹
----
在配置資料庫的配置選項是以樹的形式組織的:
+- Code maturity level options
| +- Prompt for development and/or incomplete code/drivers
+- General setup
| +- Networking support
| +- System V IPC
| +- BSD Process Accounting
| +- Sysctl support
+- Loadable module support
| +- Enable loadable module support
| +- Set version information on all module symbols
| +- Kernel module loader
+- ...
每個選項都有其自己的依賴關係。這些依賴關係決定了選項是否是可見的。父選項可見,子選項才能可見。
選單選項
--------
大多數的選項都定義了一個配置選項,其它選項則有助於對它們進行組織。一個配置選項定義可以是下面的形式:
config MODVERSIONS
bool "Set version information on all module symbols"
depends MODULES
help
Usually, modules have to be recompiled whenever you switch to a new
kernel. ...
每行都是以config關鍵字開始,並可以接多個引數。"config" 為定義了一新的配置選項。下面的幾行定義了該配置選項的屬性。屬性可以是該配置選項的型別、輸入提示(input prompt)、依賴關係、幫助資訊和預設值。配置選項可以用相同的名字定義多次,但每個定義只能有一個輸入提示並且型別還不能衝突。
選單屬性
--------
選單選項可以有多個屬性。並不要求這些屬性可以用在任何地方(見語法)。
型別定義:"bool"/"tristate"/"string"/"hex"/"int"
每個配置選項都必須指定型別。有兩個基本型別:tristate 和 string,其他型別都是基於這兩個基本型別。型別定義可以用輸入提示,所以下面的兩個例子是等價的:
bool "Networking support"
和
bool
prompt "Networking support"
輸入提示: "prompt " <prompt> ["if" <expr>]
每個選單選項最多隻能有一個顯示給使用者的輸入提示。可以用 "if" 來表示該提示的依賴關係,當然這是可選的。
預設值:"default" <expr> ["if" <expr>]
一個配置選項可以有任意多個預設值。如果有多個預設值,那麼只有第一個被定義的值是可用的。預設值並不是只限於應用在定義他們的選單選項。這就意味著預設值可以定義在任何地方或被更早的定義覆蓋。如果使用者沒有設定(通過上面的輸入提示),配置選項的值就是預設值。如果可以顯示輸入提示的話,就會把預設值顯示給使用者,並可以讓使用者進行修改。預設值的依賴關係可以用 "if" 新增。(可選項)
依賴關係:"depends on"/"requires" <expr>
為一選單選項定義依賴關係。如果定義了多個依賴關係,它們之間用 '&&' 間隔。依賴關係也可以應用到該選單中所有的其它選項(同樣接受一if表示式),所以下面的兩個例子是等價的:
bool "foo" if BAR
default y if BAR
and
depends on BAR
bool "foo"
default y
反向依賴關係:"select" <symbol> ["if" <expr>]
儘管普通的依賴關係可以降低選項的上限,反向依賴能將這一限制降的更低。當前選單選項的值是symbol的最小值。如果symbol被選擇了多次,上限就是其中的最大值。反向依賴只能用在 boolean 或 tristate 選項上。
資料範圍:"range" <symbol> <symbol> ["if" <expr>]
為int和hex型別的選項設定可以接受輸入值範圍。使用者只能輸入大於等於第一個symbol,小於等於第二個symbol的值。
幫助資訊: "help" or "---help---"
定義一幫助資訊。幫助資訊的結束就由縮排的水平決定的,這也就意味著資訊是在第一個比幫助資訊開始行的縮排小的行結束。"---help---" 和 "help" 在實現的作用上沒有區別,"---help---" 有助於將檔案中的配置邏輯與給開發人員的提示分開。
選單依賴關係
------------
依賴關係決定了選單選項是否可見,也可以減少tristate的輸入範圍。tristate邏輯比boolean邏輯在表示式中用更多的狀態(state)來表示模組的狀態。依賴關係表示式的語法如下:
<expr> ::= <symbol> (1)
<symbol> '=' <symbol> (2)
<symbol> '!=' <symbol> (3)
'(' <expr> ')' (4)
'!' <expr> (5)
<expr> '&&' <expr> (6)
<expr> '||' <expr> (7)
表示式是以優先順序的降序列出的。
(1) 將symbol賦給表示式。boolean和tristate型別的symbol直接賦給表示式。所有其它型別的symbol都賦 'n'。
(2) 如果兩個symbol相等,返回'y',否則為'n'。
(3) 如果兩個symbol相等,返回'n',否則為'y'。
(4) 返回表示式的值。用於改變優先順序。
(5) 返回 !(/expr/) 的結果。
(6) 返回 min(/expr/,/expr/) 的結果。
(7) 返回 max(/expr/,/expr/) 的結果。
一個表示式的值可以是'n','m'或'y'(或者是計算的結果 0,1,2)。當表示式的值為'm'或'y'的時候,選單項才是可見的。
symbol有兩種型別:不可變的和可變的。不可變的symbol是最普通的,由'config'語句定義,完全由數字、字母和下劃線組成。不可變的symbol只是表示式的一部分。經常用單引號或雙引號括起來。在引號中,可以使用任何字元,使用引號要用轉義字元'/'。
選單結構
--------
選單在樹中的位置可由兩種方法決定。第一種可以是這樣:
menu "Network device support"
depends NET
config NETDEVICES
...
endmenu
所有的在"menu" ... "endmenu" 之間都是"Network device support"的子選單。所有的子選單選項都繼承了父選單的依賴關係,比如,"NET"的依賴關係就被加到了配置選項NETDEVICES的依賴列表中。
還有就是通過分析依賴關係生成選單的結構。如果選單選項在一定程度上依賴於前面的選項,它就能成為該選項的子選單。首先,前面的(父)選項必須是依賴列表中的一部分並且它們中必須有滿足下面兩個條件的選項:
如果父選項為'n',子選項必須不可見。
如果父選項可見,子選項才能可見。
config MODULES
bool "Enable loadable module support"
config MODVERSIONS
bool "Set version information on all module symbols"
depends MODULES
comment "module support disabled"
depends !MODULES
MODVERSIONS 直接依賴 MODULES,這就意味著如果MODULES不為'n',該選項才可見。換句話說,當MODULES可見時,選項才可見(MODULES的(空)依賴關係也是選項依賴關係的一部分)。
Kconfig 語法
------------
配置檔案描述了選單選項,每行都是以一關鍵字開頭(除了幫助資訊)。下面的關鍵字:
- config
- menuconfig
- choice/endchoice
- comment
- menu/endmenu
- if/endif
- source
前5個同樣可以用在選單選項定義的開始。
1、config:
"config" <symbol>
<config options>
config是關鍵字,表示一個配置選項的開始;緊跟著的<symbol>是配置選項的名稱,省略了字首"CONFIG_"。
例如:
config TMPFS_POSIX_ACL
bool "Tmpfs POSIX Access Control Lists"
depends on TMPFS
select GENERIC_ACL
help
POSIX Access Control Lists (ACLs) support permissions for users and
groups beyond the owner/group/world scheme.
To learn more about Access Control Lists, visit the POSIX ACLs for
Linux website <http://acl.bestbits.at/>.
If you don't know what Access Control Lists are, say N.
解析:config是關鍵字,表示一個配置選項的開始;緊跟著的TMPFS_POSIX_ACL是配置選項的名稱,省略了字首"CONFIG_"
bool表示變數型別,即"CONFIG_ TMPFS_POSIX_ACL "的型別,有5種類型:bool、tristate、string、hex和int,其中tristate和string是基本的型別
bool變數的值: y和n
tristate變數的值: y、n和m
string變數的值: 字串
bool之後的字串“Tmpfs POSIX Access Control Lists”是提示資訊,在配置介面中上下移動游標選中它時,就可以通過按空格或回車鍵來設定CONFIG_ TMPFS_POSIX_ACL的值。
depends on:表示依賴於XXX,“depends on TMPFS”表示只有當TMPFS配置選項被選中時,當前配置選項的提示資訊才會出現,才能設定當前配置選項。
2、menuconfig:
"menuconfig" <symbol>
<config options>
此關鍵字和前面的關鍵字很相似,但它在前面的基礎上要求所有的子選項作為獨立的行顯示。
3、choices:
"choice"
<choice options>
<choice block>
"endchoice"
該關鍵字定義了一組選擇項,並且選項可以是前面描述的任何屬性。儘管boolean只允許選擇一個配置選項,tristate可以抒多個配置選項設為'm',但選項只能是boolean或tristate型別。這可以在一個硬體有多個驅動的情況下使用,最終只有一個驅動被編譯進/載入到核心,但所有的驅動都可以編譯成模組。選項可以接受的另一個選項是"optional",這樣選項就被設定為'n',沒有被選中的。
例如:
choice條目將多個類似的配置選項組合在一起,供使用者單選或多選
choice
prompt "ARM system type"
default ARCH_VERSATILE
config ARCH_AAEC2000
.........
config ARCH_REALVIEW
.........
endchoice
prompt "ARM system type"給出提示資訊“ARM system type”,游標選中後回車進入就可以看到多個config條目定義的配置選項。choice條目中定義的變數只有bool和tristate。
4、comment:
"comment" <prompt>
<comment options>
這裡定義了在配置過程中顯示給使用者的註釋,該註釋還將寫進輸出檔案中。唯一可用的可選項是依賴關係。
例如:
comment條目用於定義一些幫助資訊,出現在介面的第一行,如在arch/arm/Kconifg中有如下程式碼:
menu "Floating point emulation"
comment "At least one emulation must be selected"
config FPE_NWFPE
.........
config FPE_NWFPE_XP
在介面中如下所示:
5、menu:
"menu" <prompt>
<menu options>
<menu block>
"endmenu"
這裡定義了一個選單,詳細資訊請看前面的"選單結構"。唯一可用的可選項是依賴關係。
例如:
menu條目用於生成選單,其格式如下:
menu "Floating poing emulation"
config FPE_NWFPE
..............
config FPE_NWFPE_XP
.............
endmenu
menu之後的Floating poing emulation是選單名,menu和endmenu間有很多config條目,在配置介面中如下所示:
Floating poing emulation--->
[] FPE_NWFPE
[] FPE_NWFPE_XP
6、if:
"if" <expr>
<if block>
"endif"
這裡定義了if結構。依賴關係<expr>被加到所有在if ... endif 中的選單選項中。
7、source:
source條目用於讀取另一個Kconfig檔案,如:
source "net/Kconifg"
轉載:https://www.cnblogs.com/AP0904225/p/5967979.html