-- 作者:wangxinxin
-- 發(fā)布時(shí)間:2010-11-15 9:23:26
-- linux2.6.x的配置文件kconfig語(yǔ)法
linux在2.6版本以后將配置文件由原來(lái)的config.in改為kconfig,對(duì)于kconfig的語(yǔ)法在/Documentation/kbuild/kconfig-language.txt中做了詳細(xì)的說(shuō)明,在這里給出kconfig-language.txt的中文版。 介紹 ----
在配置數(shù)據(jù)庫(kù)的配置選項(xiàng)是以樹(shù)的形式組織的:
+- 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 +- ...
每個(gè)選項(xiàng)都有其自己的依賴(lài)關(guān)系。這些依賴(lài)關(guān)系決定了選項(xiàng)是否是可見(jiàn)的。父選項(xiàng)可見(jiàn),子選項(xiàng)才能可見(jiàn)。
菜單選項(xiàng) --------
大多數(shù)的選項(xiàng)都定義了一個(gè)配置選項(xiàng),其它選項(xiàng)則有助于對(duì)它們進(jìn)行組織。(原文:Most entries define a config option, all other entries help to organize them.)一個(gè)配置選項(xiàng)定義可以是下面 的形式:
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. ...
每行都是以關(guān)鍵字開(kāi)始,并可以接多個(gè)參數(shù)。"config" 為定義了一新的配置選項(xiàng)。下面的幾行定義了該配置 選項(xiàng)的屬性。屬性可以是該配置選項(xiàng)的類(lèi)型,輸入提示(input prompt),依賴(lài)關(guān)系,幫助信息和默認(rèn)值。一 配置選項(xiàng)可以用相同的名字定義多次,但每個(gè)定義只能有一個(gè)輸入提示并且類(lèi)型還不能沖突。
菜單屬性 --------
一菜單選項(xiàng)可以有多個(gè)屬性。并不要求這些屬性可以用在任何地方(見(jiàn)語(yǔ)法)。
- 類(lèi)型定義:"bool"/"tristate"/"string"/"hex"/"int" 每個(gè)配置選項(xiàng)都必須指定類(lèi)型。有兩個(gè)基本類(lèi)型:tristate 和 string,其他類(lèi)型都是基于這兩個(gè)基本 類(lèi)型。類(lèi)型定義可以用輸入提示,所以下面的兩個(gè)例子是等價(jià)的:
bool "Networking support" 和 bool prompt "Networking support"
- 輸入提示: "prompt" <prompt> ["if" <expr>] 每個(gè)菜單選項(xiàng)最多只能有一個(gè)顯示給用戶(hù)的輸入提示。可以用 "if" 來(lái)表示該提示的依賴(lài)關(guān)系,當(dāng)然這是 可選的。
- 默認(rèn)值:"default" <expr> ["if" <expr>] 一個(gè)配置選項(xiàng)可以有任意多個(gè)默認(rèn)值。如果有多個(gè)默認(rèn)值,那么只有第一個(gè)被定義的值是可用的。默認(rèn)值并 不是只限于應(yīng)用在定義他們的菜單選項(xiàng)。這就意味著默認(rèn)值可以定義在任何地方或被更早的定義覆蓋。 如果用戶(hù)沒(méi)有設(shè)置(通過(guò)上面的輸入提示),配置選項(xiàng)的值就是默認(rèn)值。如果可以顯示輸入提示的話(huà),就會(huì)把 默認(rèn)值顯示給用戶(hù),并可以讓用戶(hù)進(jìn)行修改。 默認(rèn)值的依賴(lài)關(guān)系可以用 "if" 添加。(可選項(xiàng))
- 依賴(lài)關(guān)系:"depends on"/"requires" <expr> 為一菜單選項(xiàng)定義依賴(lài)關(guān)系。如果定義了多個(gè)依賴(lài)關(guān)系,它們之間用 \'&&\' 間隔。依賴(lài)關(guān)系也可以應(yīng)用到 該菜單中所有的其它選項(xiàng)(同樣接受一if表達(dá)式),所以下面的兩個(gè)例子是等價(jià)的:
bool "foo" if BAR default y if BAR and depends on BAR bool "foo" default y
- 反向依賴(lài)關(guān)系:"select" <symbol> ["if" <expr>] 盡管普通的依賴(lài)關(guān)系可以降低一選項(xiàng)的上限,反向依賴(lài)能將這一限制降的更低。當(dāng)前菜單選項(xiàng)的值是symbol 的最小值。如果symbol被選擇了多次,上限就是其中的最大值。 反向依賴(lài)只能用在 boolean 或 tristate 選項(xiàng)上。
- 數(shù)據(jù)范圍:"range" <symbol> <symbol> ["if" <expr>] 為int和hex類(lèi)型的選項(xiàng)設(shè)置可以接受輸入值范圍。用戶(hù)只能輸入大于等于第一個(gè)symbol,小于等于第二個(gè) symbol的值。
- 幫助信息: "help" or "---help---" 定義一幫助信息。幫助信息的結(jié)束就由縮進(jìn)的水平?jīng)Q定的,這也就意味著信息是在第一個(gè)比幫助信息開(kāi)始行 的縮進(jìn)小的行結(jié)束。 "---help---" 和 "help" 在實(shí)現(xiàn)的作用上沒(méi)有區(qū)別,"---help---" 有助于將文件中的配置邏輯與 給開(kāi)發(fā)人員的提示分開(kāi)。
菜單依賴(lài)關(guān)系 ------------
依賴(lài)關(guān)系決定了菜單選項(xiàng)是否可見(jiàn),也可以減少tristate的輸入范圍。tristate邏輯比boolean邏輯在表 達(dá)式中用更多的狀態(tài)(state)來(lái)表示模塊的狀態(tài)。依賴(lài)關(guān)系表達(dá)式的語(yǔ)法如下:
<expr> ::= <symbol> (1) <symbol> \'=\' <symbol> (2) <symbol> \'!=\' <symbol> (3) \'(\' <expr> \')\' (4) \'!\' <expr> (5) <expr> \'&&\' <expr> (6) <expr> \'||\' <expr> (7)
表達(dá)式是以?xún)?yōu)先級(jí)的降序列出的。
(1) 將symbol賦給表達(dá)式。boolean和tristate類(lèi)型的symbol直接賦給表達(dá)式。所有其它類(lèi)型的symbol 都賦 \'n\'。 (2) 如果兩個(gè)symbol相等,返回\'y\',否則為\'n\'。 (3) 如果兩個(gè)symbol相等,返回\'n\',否則為\'y\'。 (4) 返回表達(dá)式的值。用于改變優(yōu)先級(jí)。 (5) 返回 (2-/expr/) 的結(jié)果。 (6) 返回 min(/expr/,/expr/) 的結(jié)果。 (7) 返回 max(/expr/,/expr/) 的結(jié)果。
一個(gè)表達(dá)式的值可以是\'n\',\'m\'或\'y\'(或者是計(jì)算的結(jié)果 0,1,2)。當(dāng)表達(dá)式的值為\'m\'或\'y\'的時(shí)候,菜 單項(xiàng)才是可見(jiàn)的。
symbol有兩種類(lèi)型:不可變的和可變的。不可變的symbol是最普通的,由\'config\'語(yǔ)句定義,完全由數(shù)字 、字母和下劃線(xiàn)組成(alphanumeric characters or underscores)。 不可變的symbol只是表達(dá)式的一部分。經(jīng)常用單引號(hào)或雙引號(hào)括起來(lái)。在引號(hào)中,可以使用任何字符,使用引 號(hào)要用轉(zhuǎn)義字符\'\\\'。
菜單結(jié)構(gòu) --------
菜單在樹(shù)中的位置可由兩種方法決定。第一種可以是這樣:
menu "Network device support" depends NET
config NETDEVICES ...
endmenu
所有的在"menu" ... "endmenu" 之間都是"Network device support"的子菜單。所有的子菜單選項(xiàng) 都繼承了父菜單的依賴(lài)關(guān)系,比如,"NET"的依賴(lài)關(guān)系就被加到了配置選項(xiàng)NETDEVICES的依賴(lài)列表中。
還有就是通過(guò)分析依賴(lài)關(guān)系生成菜單的結(jié)構(gòu)。如果菜單選項(xiàng)在一定程度上依賴(lài)于前面的選項(xiàng),它就能成為該選 項(xiàng)的子菜單。首先,前面的(父)選項(xiàng)必須是依賴(lài)列表中的一部分并且它們中必須有滿(mǎn)足下面兩個(gè)條件的選項(xiàng): - 如果父選項(xiàng)為\'n\',子選項(xiàng)必須不可見(jiàn)。 - 如果父選項(xiàng)可見(jiàn),子選項(xiàng)才能可見(jià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 直接依賴(lài) MODULES,這就意味著如果MODULES不為\'n\',該選項(xiàng)才可見(jiàn)。換句話(huà)說(shuō),當(dāng) MODULES可見(jiàn)時(shí),選項(xiàng)才可見(jiàn)(MODULES的(空)依賴(lài)關(guān)系也是選項(xiàng)依賴(lài)關(guān)系的一部分)。
Kconfig 語(yǔ)法 ------------
配置文件描述了菜單選項(xiàng),每行都是以一關(guān)鍵字開(kāi)頭(除了幫助信息)。下面的關(guān)鍵字結(jié)束一菜單選項(xiàng): - config - menuconfig - choice/endchoice - comment - menu/endmenu - if/endif - source 前5個(gè)同樣可以用在菜單選項(xiàng)定義的開(kāi)始。
config:
"config" <symbol> <config options>
定義了一配置選項(xiàng) <symbol> 并且可以接受任何前面介紹的屬性。
menuconfig: "menuconfig" <symbol> <config options>
此關(guān)鍵字和前面的關(guān)鍵字很相似,但它在前面的基礎(chǔ)上要求所有的子選項(xiàng)作為獨(dú)立的行顯示。(This is similar to the simple config entry above, but it also gives a hint to front ends, that all suboptions should be displayed as a separate list of options.)
choices:
"choice" <choice options> <choice block> "endchoice"
該關(guān)鍵字定義了一組選擇項(xiàng),并且選項(xiàng)可以是前面描述的任何屬性。盡管boolean只允許選擇一個(gè)配置選項(xiàng), tristate可以抒多個(gè)配置選項(xiàng)設(shè)為\'m\',但選項(xiàng)只能是boolean或tristate類(lèi)型。這可以在一個(gè)硬件有多 個(gè)驅(qū)動(dòng)的情況下使用,最終只有一個(gè)驅(qū)動(dòng)被編譯進(jìn)/加載到內(nèi)核,,但所有的驅(qū)動(dòng)都可以編譯成模塊。 選項(xiàng)可以接受的另一個(gè)選項(xiàng)是"optional",這樣選項(xiàng)就被設(shè)置為\'n\',沒(méi)有被選中的。
comment:
"comment" <prompt> <comment options>
這里定義了在配置過(guò)程中顯示給用戶(hù)的注釋?zhuān)撟⑨屵將寫(xiě)進(jìn)輸出文件中。唯一可用的可選項(xiàng)是依賴(lài)關(guān)系。
menu:
"menu" <prompt> <menu options> <menu block> "endmenu"
這里定義了一個(gè)菜單,詳細(xì)信息請(qǐng)看前面的"菜單結(jié)構(gòu)"。唯一可用的可選項(xiàng)是依賴(lài)關(guān)系。
if:
"if" <expr> <if block> "endif"
這里定義了if結(jié)構(gòu)。依賴(lài)關(guān)系<expr>被加到所有在if ... endif 中的菜單選項(xiàng)中
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/jiaguang3010717/archive/2010/08/27/5844687.aspx
|