天天看點

linux ./config 淺析

1.簡介

Config不是一種bash,config語言是linux核心的一種配置語言,config.in檔案是使用該語言編寫而成,在通常情況下,它看起很像一個SH語言的子集。config配置語言主要有21條基本語句,1條if語句,菜單塊和source。主要包括以下幾個方面:

(1)菜單入口

          例如:config  MODVERSION

                                       bool  "Module versioning suport"

                                       help

                                                  Usualy,you can have to use modules compiled with your kernel.......

"config"定義了新的配置選項,之後的幾行定義了該配置選項的屬性。配置選項的屬性包括:類型、資料範圍、輸入提示、依賴關系、選擇關系、幫助資訊和預設值等。

每個配置選項都必須指定類型,類型包括bool,tristate,string,hex和int,其中tristate和bool是兩種基本類型,其他的類型都是基于這兩種基本類型的,類型定義後可以緊跟輸入提示 ,下面兩段腳本是等價的。

            bool  "Networking support"等價于

            bool

            prompt "Networking support"

輸入提示格式:

                   prompt <prompt>   [if <expr>]  其中if可選項用來表示該提示的依賴關系。

預設值的格式:

                   default  <expr>    [if<expr>]

      一個配置選項可有任意多個預設值,在這種情況下,隻有第一個被定義的值是可用的,如果使用者不設定對應的選項,配置選項的值就是預設值。

依賴關系的格式:

                    depend on(或者requries)<expr>

       如果定義了多重依賴關系,中間用“&&”隔開,依賴關系也可以應用到該菜單中所有的其他選項(同樣接受if表達式),下面的兩端腳本是等價的:

                  bool "foo"   if  BAR

                  default  y   if   BAR

       等價于:

                  depend  on BAR

                  bool  "foo"

                  default   y 

選擇關系(反向依賴關系)格式:

                    select  <symbol>  [if<expr>] 

                     A如果選擇了B,則在A被選中的情況下,B自動被選中。

                      依賴關系和選擇關系有點像C++中,類繼承的關系。

上述提到的expr表達式,是在 Kbuild   Makefile中定義的,定義為:

                     <expr> :: = <symbol>

                                      <symbol> '=' <symbol>

                                       <symbol> '!=' <symbol>

                                       '(' <expr> ')'

                                        '!' <expr>

                                        '<expr>&&<expr>'

                                       '<expr>||<expr>‘

也就是說expr的值是由symbol、兩個symbol相等、兩個symbol不等,以及expr的指派、非、與、或運算構成。

其中symbol分為兩類:一類是由菜單入口定義的非常數symbol

                                         另一類是作為expr組成部分的常數symbol

資料範圍的格式:

                    range   <symbol>  <symbol>  [if<expr>]

        為int和hex的值可以接受使用者的輸入,值的大小大于等于第一個symbol,小于等于第二個symbol。

幫助資訊的格式:

                    help(--help--)

                     開始

                      .........

                     結束

(2)菜單結構

       菜單入口在菜單樹結構中的位置可由兩種方法決定。第一種方式為:

                      menu  "Network  device support "

                               depend on NET

                       config  NETDEVICE

                      ..........

                        endmenu

          所處于menu與endmenu之間的菜單入口都會成為"Network device support"的子菜單,而且所有的子菜單都會繼承父菜單的依賴關系,比如,"Network device support"對“NET”的一來會被加到配置選項NETDEVICE的依賴表中。

              需要注意的是,menu後面跟的“Network device support”項目僅僅是1個菜單,沒有對應真實的配置項,也不具備3種不同的狀态。這是它和config的差別。

另一種方式是通過依賴關系生成菜單結構。

                config MODULES

                       bool   "Enable loadable module support"

                  config MODULEVERSION

                         bool   "Set  version information on  all module symbols "  

                         depends on  MODULES

                   commont "module  support disabled"

                           depend  on  !MODULES

          MODULEVERSION直接依賴于MODULES,隻有當MODULES部位“n”時,該選項才可見。

除此之外,Kconfig中還使用了“choice......endchoice”、“comment”、"if.....endif "等文法結構。

繼續閱讀