譯者注:這是我第一次翻譯英文文檔,對Kconfig更加的瞭解了,學到了很多東西。對英文的畏懼感也不那麼強了,以後還要翻譯更多的英文文檔。這中間還有一些地方翻譯的不清楚或者有錯誤。希望大家看到能夠給我指出來,我希望學到更多東西,謝謝!
轉載請註明出處,作者:luo3532869,鏈接:http://blog.csdn.net/luo3532869/article/details/7618147
介紹
------------
配置數據庫是組織在一個樹結構裏面的配置選項的集合。
+- 代碼成熟級別選項
| +- 對於開發和/或不完整的代碼/驅動 的提示
+-通用配置
| +- 網絡支持
| +- System V 進程通信機制
| +- BSD 程序計數器
| +- Sysctl支持
+-可裝載模塊支持
| +- 使能可裝載模塊支持
| +- 在所有模塊標記上設置版本信息
| +- 內核模塊裝載
+-...
每個入口都有它的依賴。這些依賴性用來決定入口的是否可見。只有當父入口是可見的,它的子入口才能是可見的。
菜單入口
------------
大多數入口在Kconfig文件中都定義了一個配置選項;所有其它的入口都用來組織這些配置選項。一個典型的配置選項是這樣定義的:
config MODVERSIONS
bool"Set version information on all module symbols"
dependson MODULES
help
Usually, modules have to be recompiledwhenever you switch to a new
kernel. ...
每一行都以一個關鍵字開頭,並且後面可以跟多個參數。一個新的配置入口是以“config”關鍵字開始的。接下來的數行是對這個配置選項的屬性定義。屬性可以是類型、輸入提示、依賴項、幫助文檔以及默認值。一個配置選項用相同的名字定義多次,但是每次定義的輸入提示和類型都必須不一樣。
菜單屬性
--------------
一個菜單入口可以有多個屬性。不是所有的屬性在任何地方都會有效。
- 類型定義:"bool"/"tristate"/"string"/"hex"/"int"
每個配置選項必須都有一個類型。在上面這幾個類型中其實只有兩個基本類型:tirstate和string;其它的類型都是基於這兩種屬性的。類型定義的時候可以接受一個輸入提示(也可以單獨使用一個提示屬性),所以下面的這兩個例子是等價的:
bool"Networking support"
和
bool
prompt"Networking support"
- 輸入提示:"prompt" <prompt> ["if" <expr>]
每個菜單入口最多隻能有一個展示給用戶看的輸入提示,可以使用“if”來表示輸入提示的依賴性,這個依賴性是可選的。
- 默認值: "default" <expr> ["if" <expr> ]
一個配置選項可以有任意多個默認值。如果存在多個默認值,只有第一個定義的默認值纔是有效的。默認值可以定義在菜單入口的任何位置。這就意味着默認值可以在配置選項的其它地方再定義或者被之前的默認值定義給覆蓋。
只有當用戶沒有給配置標記賦值的時候(通過上面的輸入提示),纔會使用這個默認值來進行賦值。如果一個用戶提示是可見的,那樣用戶就能看到默認值,並且可以輸入一個值將默認值覆蓋。
與輸入提示一樣,可以使用“if”來表示默認值的依賴性,這個依賴性是可選的。
- 類型定義+ 默認值:
"def_bool"/"def_tristate"<expr> ["if" <expr>]
這是一個類型定義加上一個默認值的速記符號。
如果使用依賴性,可以使用“if”來表示
- 依賴項: "depends on" <expr>
依賴項給菜單入口定義了一個依賴規則。如果有多個依賴項,它們將使用‘&&’符號進行連接。依賴性對菜單入口中的其它選項都有效(這個菜單如果也接受一個“if”表達式),所以下面這兩個例子是等價的:
bool"foo" if BAR
default y if BAR
和
depends on BAR
bool "foo"
default y
- 反向依賴項: "select" <symbol> ["if" <expr>]
一個正常的依賴項可以降低symbol的上限值,而反向依賴項則用來給一個symbol限定一個下限值。當前菜單symbol的值是當前可以設定的<symbol>最小值。如果<symbol>被選擇了多次,那麼它的值限定爲最大的那一個。
只有boolean和tristate類型的symbol可以使用反向依賴。
注意:
應該非常小心使用反向依賴。反向依賴會給symbol強制賦一個值而不受正常依賴項的限制。濫用反向依賴會導致一個symbolF00被選擇,即使F00的依賴項BAR沒有被選擇。
一般情況下只有不可訪問的symbol和沒有正向依賴項的symbol才使用反向依賴項。雖然這樣限制了反向依賴的用途,但是從另一方面來說,這樣阻止了大量的非法配置。
- 數值範圍: "range" <symbol> <symbol> ["if"<expr>]
這個屬性可以用來限定int和hex類型symbol的輸入值。用戶只能輸入一個大於等於第一個symbol的值,並且小於等於第二個symbol的值。
- 幫助文本: "help" or "---help---"
這個屬性定義了一個幫助文本。幫助文本的結尾是根據縮進級別來決定的,這就意味着如果幫助文本中某一行相對於第一行有更小的縮進,那麼這一行就是幫助文檔的最後一行。
"---help---"和“help”在使用功能上沒有區別,"---help---"是用來作爲對開發者的一種提示,它顯式區別於文檔中的配置選項“help”。
- 其它選項: "option" <symbol>[=<value>]
各種不常見的選項的通過這個選項來定義,比如修改菜單入口的行爲和配置symbol。下面這些配置當前是允許的:
-"defconfig_list"
這個選項定義了一系列默認入口,當使用默認配置時可以從這裏尋找(當主.config文件不存在時會使用默認配置)
-"modules"
這個選項聲明瞭一個symbol將被當做MODULES symbol,MODULES symbol是所有配置symbol的第三種模塊化狀態。
-"env"=<value>
這個選項導入了一個環境變量到Kconfig中。環境變量就像是Kconfig中的一個默認值,但是它是從外部環境中導入的。正因爲它從外部環境導入,所以賦值的這個時候它相對於正常的默認值來說是沒有定義的。這個symbol當前沒有導出到構建環境中(如果想要這樣的話,可以通過另一個symbol導出)
Menu dependencies
-----------------
依賴項定義了菜單入口的可見性,同時可以減小tristate symbol的輸入範圍。表達式中的tirstate邏輯比boolean邏輯多一個狀態,這個狀態用來表示模塊的狀態。依賴表達式具有如下的語法:
<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) 如果兩個symbo的值不相等,就返回‘n’,否則返回‘y’。
(4) 返回表達式的值。用來覆蓋之前的值
(5) 返回(2-/expr/)表達式的值
(6) 返回min(/expr/, /expr/)表達式的值
(7) 返回max(/expr/, /expr/)表達式的值
一個表達式的值可以是'n','m' or 'y'(或者相對於0,1,2)。當表達式的值是m或者y的時候,菜單入口就是可見的。
存在兩種類型的symbol:常數symbol和非常數symbol。非常數symbol是最常見的一類symbol,定義的時候使用‘config’來聲明。非常數symbol由字母和下劃線組成。
常數symbol只是表達式的一部分。常數symbol通常被單引號或者雙引號包圍着。在引號中,任何字母都是允許的,並且可以使用‘\’進行轉移。
菜單結構
--------------
菜單入口位置在結構樹中的定義有兩種方式。第一種方式是明確地進行指定:
menu "Network device support"
dependson NET
config NETDEVICES
...
endmenu
所有位於“menu”…和“endmenu”之間的入口都是"Network device support"的一個子菜單入口。所有的子入口都繼承了菜單入口的依賴項,例如,依賴項”NET”就會被加入到子菜單”NETDEVICES”的依賴項列表中。
另外一種生成菜單結構的方法是通過分析依賴項。如果一個菜單入口依賴依賴於前一個入口,那麼它就是前一個入口的一個子菜單。首先,之前的(父)symbol一定位於子入口的依賴列表中,其次,下面兩個條件中有一個必須是真的:
- 子入口必須是不可見的,當父symbol被設置成’n’
- 子入口必須是可見的,當父菜單是可見的
config MODULES
bool"Enable loadable module support"
config MODVERSIONS
bool"Set version information on all module symbols"
dependson MODULES
comment "module support disabled"
dependson !MODULES
MODVERSIONS 直接依賴於 MODULES,這意味着它只有當MODULES的值不是’n’的時候纔是可見的。如果MODULES是可見的,那麼comment也是可見的(MODULES的依賴關係也是comment依賴項的一部分)。
Kconfig 語法
--------------
這個配置文件描述了一系列的菜單入口,文件中的每一行都以一個關鍵字開頭(除了幫助文本)。下面的關鍵字用來結束一個菜單入口:
- config
- menuconfig
- choice/endchoice
- comment
- menu/endmenu
- if/endif
- source
前面5個也用來開始一個菜單入口的定義。
config:
"config"<symbol>
<configoptions>
這個用來定義一個配置symbol<symbol>,並且接受上面所說的任何屬性作爲選項。
menuconfig:
"menuconfig"<symbol>
<configoptions>
這個類似於上面所說的簡單配置入口,但是它給了前端一個提示:所有的子選項都應該作爲一個單獨的選項列表顯示出來。
choices:
"choice"
<choiceoptions>
<choiceblock>
"endchoice"
這個定義了一個選擇集合,並且接受任何上面所說的屬性作爲選項。選擇只能是bool類型或tristate類型,並且布爾選擇只允許一個單一的配置項被選中,三態選擇還允許任何配置項被設置爲“M”。這可以用在下面的情況:如果一個硬件存在多個驅動程序,並且只有一個驅動程序可以編譯/加載到內核中,但所有的驅動程序可以編譯成模塊。
一個choice接受另外一個選項“optional”,中允許將choice的值設爲’n’,並且沒有入口需要被選擇。
comment:
"comment"<prompt>
<commentoptions>
這定義了一條在用戶配置過程中顯示的註釋,同時會寫入導出文件。它的選項options只能是依賴項。
menu:
"menu"<prompt>
<menuoptions>
<menublock>
"endmenu"
這定義了一個菜單塊,具體情況請查看之前的“Menu structure”。它的選項options只能是依賴項。
if:
"if"<expr>
<ifblock>
"endif"
這定義了一個if塊。依賴表達式<expr>將會追加到所有封閉的菜單入口中。
source:
"source"<prompt>
This reads the specified configurationfile. This file is always parsed.
這個入口讀取具體的配置文件。配置文件經常會被解析。
mainmenu:
"mainmenu"<prompt>
如果配置程序選擇使用這個入口,那麼它將會設置配置程序的標題欄。
Kconfig提示
-------------
這是一個Kconfig提示的集合,大部分在初次看時都不是很明顯,但確實很多Kconfig文件中的常用提示。
加入通用功能,並且生成用法配置
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
這是一個常用提示用來完成一個與某些架構相關的特徵/功能。
建議使用配置變量HAVE_*來實現,這個變量被定義在一些常見的Kconfig文件中,並且被一些相關的架構文件選擇。
一個典型的例子是通用IOMAP功能的實現:
我們將會在lib/Kconfig文件中看到:
# Generic IOMAP is used to ...
config HAVE_GENERIC_IOMAP
config GENERIC_IOMAP
dependson HAVE_GENERIC_IOMAP && FOO
And in lib/Makefile we would see:
obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
在每一個使用通用IOMAP功能的架構文件中我們將會看到類似於下面的配置選項:
config X86
select...
selectHAVE_GENERIC_IOMAP
select...
注意:我們使用已經存在的配置選項並且避免創建一個新的配置變量來選擇HAVE_GENERIC_IOMAP。
注意:內部配置變量HAVE_GENERIC_IOMAP的使用是用來克服”select”的缺陷的,反向依賴會強制賦給配置選項’y’,而不管它的正常依賴項。
正常的依賴項被移動到GENERIC_IOMAP中,這就避免了配置選項被強制賦給’y’值。
只生成模塊
~~~~~~~~~~~~~~~~~~~~
爲了限制一個組件只生成模塊,限制它的配置選項爲"depends on m".比如:
config FOO
dependson BAR && m
限制 FOO 生成一個模塊 (=m) 或者不選擇 (=n)