Linux Kbuild文档 2
linux在2.6版本以后將配置文件由原來的config.in改為Kconfig,對于Kconfig的語法在內(nèi)核源代碼/Documentation/kbuild/kconfig-language.txt中做了詳細的說明。
2.1 Kconfig的樹狀關系Kconfig的配置選項是以樹的形式組織的,如下所示所示:
每個選項都有其自己的依賴關系。這些依賴關系決定了選項是否是可見的。父選項可見,子選項才能可見。
arch/$(ARCH)/Kconfig文件是主Kconfig文件,跟體系結構有關系。主Kconfig文件調用其他目錄的Kconfig文件,其他的Kconfig文件又調用各級子目錄的配置文件,成樹狀關系。
2.2菜單選項多數(shù)選項定義了一個配置選項,其它選項起輔助組織作用。一個配置選項定義可以是下面的形式:
每行都是以關鍵字開始,并可以接多個參數(shù)。"config"?為定義了一新的配置選項。下面的幾行定義了該配置選項的屬性。屬性可以是該配置選項的類型,輸入提示(input prompt),依賴關系,幫助信息和默認值。一個配置選項可以用相同的名字定義多次,但每個定義只能有一個輸入提示并且類型還不能沖突。
2.3菜單屬性一個菜單選項可以有多個屬性,這些屬性受到語法的限制。每個配置選項都必須指定類型。類型定義包括:"bool"、"tristate"、"string"、"hex"、"int"共五種。其中有兩個基本類型:tristate?和?string,其他類型都是基于這兩個基本類型。內(nèi)核菜單屬性說明表3所示。
表3?內(nèi)核菜單屬性說明
| 屬性 | 語法 | 說明 |
| 輸入提示 | "prompt" <prompt> ["if" <expr>] | 每個菜單選項最多只能有一個顯示給用戶的輸入提示。可以用"if"?來表示該提示的依賴關系,當然這是可選的。 |
| 默認值 | "default" <expr> ["if" <expr>] | 一個配置選項可以有任意多個默認值。如果有多個默認值,那么只有第一個被定義的值是可用的。默認值并不是只限于應用在定義他們的菜單選項。這就意味著默認值可以定義在任何地方或被更早的定義覆蓋。如果用戶沒有設置(通過上面的輸入提示),配置選項的值就是默認值。如果可以顯示輸入提示的話,就會把默認值顯示給用戶,并可以讓用戶進行修改。默認值的依賴關系可以用?"if"?添加。 |
| 依賴關系 | "depends on" /"requires" <expr> | 為一菜單選項定義依賴關系。如果定義了多個依賴關系,它們之間用?'&&'?間隔。依賴關系也可以應用到該菜單中所有的其它選項(同樣接受一if表達式)。 |
| 反向依賴關系 | "select" <symbol> ["if" <expr>] | 盡管普通的依賴關系可以降低一選項的上限,反向依賴能將這一限制降的更低。當前菜單選項的值是symbol的最小值。如果symbol被選擇了多次,上限就是其中的最大值。反向依賴只能用在?boolean?或?tristate?選項上。 |
| 數(shù)據(jù)范圍 | "range" <symbol> <symbol> ["if" <expr>] | 為int和hex類型的選項設置可以接受輸入值范圍。用戶只能輸入大于等于第一個symbol,小于等于第二個symbol的值。 |
| 幫助信息 | "help" or "---help---" | 定義一幫助信息。幫助信息的結束就由縮進的水平?jīng)Q定的,這也就意味著信息是在第一個比幫助信息開始行的縮進小的行結束。"---help---"?和?"help"?在實現(xiàn)的作用上沒有區(qū)別,"---help---"?有助于將文件中的配置邏輯與給開發(fā)人員的提示分開。 |
依賴關系決定了菜單選項是否可見,也可以減少tristate的輸入范圍。tristate邏輯比boolean邏輯在表達式中用更多的狀態(tài)(state)來表示模塊的狀態(tài)。依賴關系表達式的語法如表4所示,表達式是以優(yōu)先級的降序列出的。
表4?菜單依賴關系語法說明
| 表達式 | 結果說明 |
| <expr> ::= <symbol> | 將symbol賦給表達式。boolean和tristate類型的symbol直接賦給表達式。所有其它類型的symbol都賦?'n'。 |
| <symbol> '=' <symbol> | 如果兩個symbol相等,返回'y',否則為'n'。 |
| <symbol> '!=' <symbol> | 如果兩個symbol相等,返回'n',否則為'y'。 |
| '(' <expr> ')' | 返回表達式的值。用于改變優(yōu)先級。 |
| '!' <expr> | 返回?(2-/expr/)?的結果。 |
| <expr> '&&' <expr> | 返回?min(/expr/,/expr/)?的結果。 |
| <expr> '||' <expr> | 返回?max(/expr/,/expr/)?的結果。 |
一個表達式的值可以是'n','m'或'y'(或者是計算的結果?0,1,2)。當表達式的值為'm'或'y'的時候,菜單項才是可見的。
symbol有兩種類型:不可變的和可變的。不可變的symbol是最普通的,由'config'語句定義,完全由數(shù)字、字母和下劃線組成(alphanumeric characters or underscores)。
不可變的symbol只是表達式的一部分。經(jīng)常用單引號或雙引號括起來。在引號中,可以使用任何字符,使用引號要用轉義字符'\'。
2.5菜單結構菜單在樹中的位置可由兩種方法決定。
第一種可以是這樣:
所有的在"menu" ... "endmenu"?之間都是"Network device support"的子菜單。所有的子菜單選項都繼承了父菜單的依賴關系,比如,"NET"的依賴關系就被加到了配置選項NETDEVICES的依賴列表中。
第二種是通過分析依賴關系生成菜單的結構。如果菜單選項在一定程度上依賴于前面的選項,它就能成為該選項的子菜單。首先,前面的(父)選項必須是依賴列表中的一部分并且它們中必須有滿足下面兩個條件的選項:如果父選項為'n',子選項必須不可見;如果父選項可見,子選項才能可見。
MODVERSIONS?直接依賴?MODULES,這就意味著如果MODULES不為'n',該選項才可見。換句話說,當MODULES可見時,選項才可見(MODULES的(空)依賴關系也是選項依賴關系的一部分)。
2.6 Kconfig語法配置文件描述了菜單選項,每行都是以一關鍵字開頭(除了幫助信息)。菜單的關鍵字如表5所示。其中菜單開頭的關鍵字有:config、menuconfig、choice/endchoice、comment、menu/endmenu。它們也可以結束一個菜單選項,另外還有if/endif、source也可以結束菜單選項。
表5 Kconfig菜單關鍵字說明
| 關鍵字 | 語法 | 說明 |
| config | "config" <symbol> <config options> | 定義了一配置選項?<symbol>?并且可以接受任何前面介紹的屬性。 |
| menuconfig | "menuconfig" <symbol> <config options> | 此關鍵字和前面的關鍵字很相似,但它在前面的基礎上要求所有的子選項作為獨立的行顯示。 |
| choices | "choice" <choice options> <choice block> "endchoice" | 該關鍵字定義了一組選擇項,并且選項可以是前面描述的任何屬性。盡管boolean只允許選擇一個配置選項,tristate可以抒多個配置選項設為'm',但選項只能是boolean或tristate類型。這可以在一個硬件有多個驅動的情況下使用,最終只有一個驅動被編譯進/加載到內(nèi)核,,但所有的驅動都可以編譯成模塊。選項可以接受的另一個選項是"optional",這樣選項就被設置為'n',沒有被選中的。 |
| comment | "comment" <prompt> <comment options> | 這定義了在配置過程中顯示給用戶的注釋,該注釋還將寫進輸出文件中。唯一可用的可選項是依賴關系。 |
| menu | "menu" <prompt> <menu options> <menu block> "endmenu" | 這里定義了一個菜單,詳細信息請看前面的"菜單結構"。唯一可用的可選項是依賴關系。 |
| if | "if" <expr> <if block> "endif" | 這里定義了if結構。依賴關系<expr>被加到所有在if ... endif?中的菜單選項中。 |
| source | “source” <prompt> | 讀取指定的配置文件。讀取的文件也會解析生成菜單。 |
總結
以上是生活随笔為你收集整理的Linux Kbuild文档 2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何健康学习到150岁?养生还是程序员专
- 下一篇: 儿童穿和服过六一?官方回应:恶意剪辑 已