Kconfig和Makefile相關基本語法

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Kconfig基本語法規則

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Linux 在2.6版本以後將配置文件由原來的config.in改爲kconfig,對於kconfig的語法在/Documentation/kbuild /kconfig-language.txt中做了詳細的說明,在這裏給出kconfig-language.txt的中文版。
介紹
----

在配置數據庫的配置選項是以樹的形式組織的:
   +- 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
   +- ...

每個選項都有其自己的依賴關係。這些依賴關係決定了選項是否是可見的。父選項可見,子選項才能可見。
菜單選項
--------

大多數的選項都定義了一個配置選項,其它選項則有助於對它們進行組織。(原文:Most entries define a config option, all other entries help to organize them.)一個配置選項定義可以是下面的形式:
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. ...

每行都是以關鍵字開始,並可以接多個參數。"config" 爲定義了一新的配置選項。下面的幾行定義了該配置選項的屬性。屬性可以是該配置選項的類型,輸入提示(input prompt),依賴關係,幫助信息和默認值。一配置選項可以用相同的名字定義多次,但每個定義只能有一個輸入提示並且類型還不能衝突。

菜單屬性
--------

一菜單選項可以有多個屬性。並不要求這些屬性可以用在任何地方(見語法)。

- 類型定義:bool布爾類型、 tristate三態:內建、模塊、移除 string字符串、 hex十六進制、 integer整型
每個配置選項都必須指定類型。有兩個基本類型:tristate 和 string,其他類型都是基於這兩個基本類型。類型定義可以用輸入提示,所以下面的兩個例子是等價的:
   bool "Networking support"

   bool
   prompt "Networking support"

例如config HELLO_MODULE
  bool “hello test module”
  bool 類型的只能選中或不選中,tristate類型的菜單項多了編譯成內核模塊的選項,假如選擇編譯成內核模塊,則會在.config中生成一個 CONFIG_HELLO_MODULE=m的配置,假如選擇內建,就是直接編譯成內核影響,就會在.config中生成一個 CONFIG_HELLO_MODULE=y的配置.

- 輸入提示: "prompt" <prompt> ["if" <expr>]
每個菜單選項最多隻能有一個顯示給用戶的輸入提示。可以用 "if" 來表示該提示的依賴關係,當然這是可選的。

- 默認值:"default" <expr> ["if" <expr>]
一個配置選項可以有任意多個默認值。如果有多個默認值,那麼只有第一個被定義的值是可用的。默認值並不是只限於應用在定義他們的菜單選項。這就意味着默認值可以定義在任何地方或被更早的定義覆蓋。如果用戶沒有設置(通過上面的輸入提示),配置選項的值就是默認值。如果可以顯示輸入提示的話,就會把默認值顯示給用戶,並可以讓用戶進行修改。默認值的依賴關係可以用 "if" 添加。(可選項)

- 依賴關係:"depends on"/"requires" <expr>
爲一菜單選項定義依賴關係。如果定義了多個依賴關係,它們之間用 '&&' 間隔。依賴關係也可以應用到該菜單中所有的其它選項(同樣接受一if表達式),所以下面的兩個例子是等價的:
   bool "foo" if BAR
   default y if BAR

   depends on BAR
   bool "foo"
   default y

- 反向依賴關係:"select" <symbol> ["if" <expr>]
儘管普通的依賴關係可以降低一選項的上限,反向依賴能將這一限制降的更低。當前菜單選項的值是symbol的最小值。如果symbol被選擇了多次,上限就是其中的最大值。反向依賴只能用在 boolean 或 tristate 選項上。

- 數據範圍:"range" <symbol> <symbol> ["if" <expr>]
爲int和hex類型的選項設置可以接受輸入值範圍。用戶只能輸入大於等於第一個symbol,小於等於第二個symbol的值。

- 幫助信息: "help" or "---help---"
定義一幫助信息。幫助信息的結束就由縮進的水平決定的,這也就意味着信息是在第一個比幫助信息開始行的縮進小的行結束。"---help---" 和 "help" 在實現的作用上沒有區別,"---help---" 有助於將文件中的配置邏輯與給開發人員的提示分開。

菜單依賴關係
------------

依賴關係決定了菜單選項是否可見,也可以減少tristate的輸入範圍。tristate邏輯比boolean邏輯在表達式中用更多的狀態(state)來表示模塊的狀態。依賴關係表達式的語法如下:
<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) 如果兩個symbol相等,返回'n',否則爲'y'。
(4) 返回表達式的值。用於改變優先級。
(5) 返回 (2-/expr/) 的結果。
(6) 返回 min(/expr/,/expr/) 的結果。
(7) 返回 max(/expr/,/expr/) 的結果。

一個表達式的值可以是'n','m'或'y'(或者是計算的結果 0,1,2)。當表達式的值爲'm'或'y'的時候,菜單項纔是可見的。

symbol有兩種類型:不可變的和可變的。不可變的symbol是最普通的,由'config'語句定義,完全由數字、字母和下劃線組成(alphanumeric characters or underscores)。不可變的symbol只是表達式的一部分。經常用單引號或雙引號括起來。在引號中,可以使用任何字符,使用引號要用轉義字符'/'。

菜單結構
--------

菜單在樹中的位置可由兩種方法決定。第一種可以是這樣:
menu "Network device support"
   depends NET

config NETDEVICES
   ...

endmenu

所有的在"menu" ... "endmenu" 之間都是"Network device support"的子菜單。所有的子菜單選項都繼承了父菜單的依賴關係,比如,"NET"的依賴關係就被加到了配置選項NETDEVICES的依賴列表中。

還有就是通過分析依賴關係生成菜單的結構。如果菜單選項在一定程度上依賴於前面的選項,它就能成爲該選項的子菜單。首先,前面的(父)選項必須是依賴列表中的一部分並且它們中必須有滿足下面兩個條件的選項:
- 如果父選項爲'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 直接依賴 MODULES,這就意味着如果MODULES不爲'n',該選項纔可見。換句話說,當MODULES可見時,選項纔可見(MODULES的(空)依賴關係也是選項依賴關係的一部分)。

Kconfig 語法
------------

配置文件描述了菜單選項,每行都是以一關鍵字開頭(除了幫助信息)。下面的關鍵字結束一菜單選項:
- config
- menuconfig
- choice/endchoice
- comment
- menu/endmenu
- if/endif
- source
前5個同樣可以用在菜單選項定義的開始。

config:
   "config" <symbol>
   <config options>

定義了一配置選項 <symbol> 並且可以接受任何前面介紹的屬性。

menuconfig:
   "menuconfig" <symbol>
   <config options>

此關鍵字和前面的關鍵字很相似,但它在前面的基礎上要求所有的子選項作爲獨立的行顯示。(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"

該關鍵字定義了一組選擇項,並且選項可以是前面描述的任何屬性。儘管boolean只允許選擇一個配置選項,tristate 可以抒多個配置選項設爲'm',但選項只能是boolean或tristate類型。這可以在一個硬件有多個驅動的情況下使用,最終只有一個驅動被編譯進/加載到內核,,但所有的驅動都可以編譯成模塊。選項可以接受的另一個選項是"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 中的菜單選項中。


令有其他鏈接:
http://www.lofter.com/tag/kconfig

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Makefile 語法規則

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

obj-m 意思是將後面跟的東東編譯成內核模塊
obj-y 編譯進內核
obj-n 不編譯


舉例分析:
ifneq ($(KERNELRELEASE), )     
//判斷KERNELRELEASE是否定義,KERNELRELEASE是在linux內核源碼中主 Makefile中定義的        
    obj-m := memdev.o //編譯生成目標文件
else //若KERNELRELEASE沒有否定義
    KDIR := /home/study/4-3-1/linux-2.6.29
    // KDIR是本Makefile 依賴的linux內核源碼路徑  ,如是交叉編譯時就取開發板上運行的源碼路徑
    make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
    M=$(PWD)      //取當前的路徑
    ARCH=arm       //編譯在ARM平臺上運行的程序
    CROSS_COMPILE=arm-linux-      //使用交叉編譯工具對其進行編譯  
//到linux源碼所在的目錄執行主Makefile 並當前路徑傳給主Makefile,告訴主Makefile執行完後返回到當前目錄,執行Makefile,
endif


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章