linux内核Kconfig语法
1 Kconfig格式
菜單入口 "菜單入口名"[依賴][反向依賴][引入其它Kconfig文件]... ...[幫助]配置項(xiàng) symbol值類型[輸入提示][默認(rèn)值][依賴][反向依賴]... ...[幫助]2 屬性
bool/tristate/int/hex/string值類型,只有配置選項(xiàng)有值類型。包括: bool——值為y或n、 tristate——值為y或m或n、string——值為字符串、int——值為十進(jìn)制整數(shù)、 hex——值為十六進(jìn)制整數(shù)
prompt "提示字符串" [if <expr>]輸入提示:每個菜單入口最多只能有一個展示給用戶看的輸入提示,可以使用“if”來表示輸入提示的依賴性,這個依賴性是可選的。
default <expr> [if <expr>]?默認(rèn)值:一個配置選項(xiàng)可以有任意多個默認(rèn)值,但只有第一個有效的。當(dāng)輸入提示是可見時,才能看到默認(rèn)值,并且可以輸入一個值將默認(rèn)值覆蓋。與輸入提示一樣,可以使用“if”來表示默認(rèn)值的依賴性,這個依賴性是可選的。
def_bool/def_tristate <expr> ["if" <expr>]?值類型+默認(rèn)值:說明值類型時同時說明默認(rèn)值。可以使用“if”來表示默認(rèn)值的依賴性,這個依賴性是可選的。
requires(或depends on)<expr>,?依賴: 依賴項(xiàng)給菜單入口或配置項(xiàng)定義了一個依賴規(guī)則,只有當(dāng)expr為真或被選中時,該菜單入口或配置項(xiàng)才有效,依賴對菜單入口或配置項(xiàng)中的其它屬性都有效。
select <symbol> ["if" <expr>]?反向依賴:當(dāng)前配置項(xiàng)被選中時,選中symbol,忽略依賴項(xiàng)和手動設(shè)置值。只有boolean和tristate類型的symbol可以使用反向依賴。
imply <symbol> [if <expr>]?弱反向依賴:當(dāng)前配置項(xiàng)被選中時,選中symbol,但是symbol仍然可由依賴或者手動配置為n。
range <value1> <value2> ["if"<expr>],?值范圍:限定int和hex類型symbol的輸入值。用戶只能輸入一個大于等于第一個symbol的值,并且小于等于第二個symbol的值。
visible if <expr>?只能用于menu/endmenu中,當(dāng)expr為真時菜單可見。
---help---/help?幫助:定義了一個幫助文本。幫助文本的結(jié)尾是根據(jù)縮進(jìn)級別來決定的,這就意味著如果幫助文本中某一行相對于第一行有更小的縮進(jìn),那么這一行就是幫助文檔的最后一行。”—help—”和“help”在使用功能上沒有區(qū)別,”—help—”是用來作為對開發(fā)者的一種提示,它顯式區(qū)別于文檔中的配置選項(xiàng)“help”。
option <symbol>[=<value>]?其它屬性:各種不常見的選項(xiàng)的通過這個選項(xiàng)來定義,比如修改菜單入口的行為和配置symbol。下面這些配置當(dāng)前是允許的:
? ? ? ? defconfig_list?
? ? ? ? 定義了一系列默認(rèn)入口,當(dāng)使用默認(rèn)配置時可以從這里尋找(當(dāng)主.config文件不存在時會使用默認(rèn)配置)
? ? ? ? modules?
? ? ? ? 聲明了一個symbol將被當(dāng)做MODULES symbol,MODULES symbol是所有配置symbol的第三種模塊化狀態(tài)。
? ? ? ?env=<value>,?
? ? ? ?導(dǎo)入了一個環(huán)境變量到Kconfig中。環(huán)境變量就像是Kconfig中的一個默認(rèn)值,但是它是從外部環(huán)境中導(dǎo)入的。正因?yàn)樗鼜耐? ? ? ? ? ?部環(huán)境導(dǎo)入,所以賦值的這個時候它相對于正常的默認(rèn)值來說是沒有定義的。這個symbol當(dāng)前沒有導(dǎo)出到構(gòu)建環(huán)境中(如果? ? ? ? ?想要這樣的話,可以通過另一個symbol導(dǎo)出)
? ? ? ?allnoconfig_y?
? ? ? ?聲明symol默認(rèn)值為y。
補(bǔ)充:
值類型后可以緊跟一個輸入提示(也可以單獨(dú)使用一個提示屬性),所以下面的這兩個例子是等價的:
bool "Networking support"#和bool prompt "Networking support"依賴對菜單入口中的其它屬性都有效,下面兩種寫法是等價的
bool"foo" if BAR default y if BAR#和depends on BAR bool "foo" default y并非每個菜單入口或者配置項(xiàng)都具有所有的屬性。
限制一個配置項(xiàng)只能編譯為模塊或不選擇。
config FOOdependson m限制一個配置項(xiàng)只能編譯或模塊化
config FOOtristate "foo"select FOO if mdefault m如果一個配置項(xiàng)只有值類型屬性,則它的選中只能通過其他配置項(xiàng)的select屬性
3 表達(dá)式expr
<expr> ::= <symbol> ? ? ? ? ? ? ? ? ? ? ? ? ? ? (1)<symbol> '=' <symbol> ? ? ? ? ? ? ? ?(2)<symbol> '!=' <symbol> ? ? ? ? ? ? ? (3)<symbol1> '<' <symbol2> ? ? ? ? ? ? ?(4)<symbol1> '>' <symbol2> ? ? ? ? ? ? ?(4)<symbol1> '<=' <symbol2> ? ? ? ? ? ? (4)<symbol1> '>=' <symbol2> ? ? ? ? ? ? (4)'(' <expr> ')' ? ? ? ? ? ? ? ? ? ? ? (5)'!' <expr> ? ? ? ? ? ? ? ? ? ? ? ? ? (6)<expr> '&&' <expr> ? ? ? ? ? ? ? ? ? (7)<expr> '||' <expr> ? ? ? ? ? ? ? ? ? (8)表達(dá)式以降序的順序排列在下面。
? ? ? ? 1.將一個symbol轉(zhuǎn)換成表達(dá)式。Bool和tristate symbol簡單地轉(zhuǎn)換成相應(yīng)的表達(dá)式值。其它類型的symbol就轉(zhuǎn)換成‘n’。
? ? ? ? 2.如果兩個symbol的值相等,就返回‘y’,否則返回‘n’。
? ? ? ? 3.如果兩個symbol的值不相等,就返回‘n’,否則返回‘y’。
? ? ? ? 4.如果symbol1的值小于、大于、小于等于、大于等于symbol2的值返回y,否則返回n。
? ? ? ? 5.返回表達(dá)式的值。用來覆蓋之前的值
? ? ? ? 6.返回(2-表達(dá)式的值)
? ? ? ? 7.返回min(expr,expr2)
? ? ? ? 8.返回max(expr,expr2)
一個表達(dá)式的值可以是’n’,’m’或’y’(或者相對于0,1,2)。當(dāng)表達(dá)式的值是m或者y的時候,菜單入口就是可見的。
存在兩種類型的symbol:常數(shù)symbol和非常數(shù)symbol。非常數(shù)symbol是最常見的一類symbol,定義的時候使用‘config’來聲明。非常數(shù)symbol由字母和下劃線組成。
常數(shù)symbol只是表達(dá)式的一部分。常數(shù)symbol通常被單引號或者雙引號包圍著。在引號中,任何字母都是允許的,并且可以使用‘\’進(jìn)行轉(zhuǎn)義。
4 菜單入口
主菜單——最頂層的菜單
mainmenu "主菜單名字"多選菜單——帶配置項(xiàng)但本身不可配置。它的屬性只能是依賴項(xiàng)和可見性。
menu "string"... ... endmenu?可選菜單——帶配置項(xiàng)且本身是配置項(xiàng)。配置關(guān)鍵字前面添加CONFIG_后就構(gòu)成了“.config”文件中的配置項(xiàng)名字。
menuconfig 配置關(guān)鍵字... ...config——配置項(xiàng),配置關(guān)鍵字前面添加CONFIG_后就構(gòu)成了“.config”文件中的配置項(xiàng)名字,但不是配置界面顯示的字符,配置界面顯示的是提示字符。
config 配置關(guān)鍵字... ...單選菜單,單選菜單只能是bool類型或tristate類型 ,并且布爾選擇只允許一個單一的配置項(xiàng)被選中,三態(tài)選擇還允許任何配置項(xiàng)被設(shè)置為“M”。這可以用在下面的情況:如果一個硬件存在多個驅(qū)動程序,并且只有一個驅(qū)動程序可以編譯/加載到內(nèi)核中,但所有的驅(qū)動程序可以編譯成模塊。
?choice... ...endchoice注釋,這定義了一條在用戶配置過程中顯示的注釋,同時會寫入導(dǎo)出文件。它的屬性只有依賴項(xiàng)。
?
條件——當(dāng)expr為真或選中時,中間的內(nèi)容才有效。
if <expr>... ... endif引入其他Kconfig文件,方便菜單嵌套。
source "...dir/Kconfig"5 菜單結(jié)構(gòu)
一種是使用了菜單入口明確指定,如下中所有位于“menu”…和“endmenu”之間的入口都是”Network device support”的一個子菜單入口。所有的子入口都繼承了菜單入口的依賴項(xiàng),例如,依賴項(xiàng)”NET”就會被加入到子菜單”NETDEVICESx”的依賴項(xiàng)列表中。
menu "Network device support"depends on NETconfig NETDEVICES1...config NETDEVICES2...?menuconfig NETDEVICES3...config NETDEVICES1...config NETDEVICES2...? endmenu另外一種生成菜單結(jié)構(gòu)的方法是通過分析依賴項(xiàng)。如果一個菜單入口依賴依賴于前一個入口,那么它就是前一個入口的一個子菜單。首先,之前的(父)symbol一定位于子入口的依賴列表中,其次,下面兩個條件中有一個必須是真的:?
子入口必須是不可見的,當(dāng)父symbol被設(shè)置成’n’
子入口必須是可見的,當(dāng)父菜單是可見的
?
總結(jié)
以上是生活随笔為你收集整理的linux内核Kconfig语法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李飞飞:在物体识别之后,计算机视觉还要多
- 下一篇: 储能元件