Linux kernel的Makefile和Kconfig以及Make menuconfig的關係

KevinBu 標籤: Linux

熟悉內核的Makefile對開發設備驅動、理解內核代碼結構都是非常重要的
linux2.6內核Makefile的許多特性和2.4內核差別很大,在內核目錄的documention/kbuild/makefiles.txt中有詳細的說明。

=== 1、內核Makefile概述
Linux內核的Makefile分爲5個部分:
    Makefile                         最頂層Makefile
    .config                            內核當前配置文件,編譯時成爲頂層Makefile的一部分
    arch/$(ARCH)/Makefile   和體系結構相關的具體架構的Makefile
    scripts/Makefile.*            一些Makefile的通用的規則,面向所有的Kbuild Makefiles。
    kbuildMakefiles               內核各級目錄源代碼中大約有500個這樣的文件,編譯時根據上層Makefile傳下來的宏定義和其他編譯規則,將源代碼編譯成模塊或編入內核。

  • 相互作用關係

   頂層的Makefile文檔讀取內核配置文件.config文檔的內容,確定內核配置情況,通過遞歸向下訪問子目錄的形式完成build內核和模塊的工作。.config文件的內容是在makemenuconfig的時候,通過Kconfig文檔配置的結果;arch/$(ARCH)/Makefile則提供補充體系結構相關的信息;每一個子目錄都有一個KbuildMakefile文件,用來執行從其上層目錄傳遞下來的命令。KbuildMakefile從.config文件中提取信息,生成Kbuild完成內核編譯所需的文件列表。scripts/Makefile.*文檔包含了任何用來根據kbuildMakefile 構建內核所需的定義和規則。

=== 2 、內核中Kconfig文檔的作用

    2.6內核的源碼樹目錄下一般都會有兩個文件:Kconfig和Makefile。分佈在各目錄下的Kconfig構成了一個分佈式的內核配置數據庫,每個Kconfig分別描述了所屬目錄源文件相關的內核配置菜單。在內核配置makemenuconfig(或xconfig等)時,從Kconfig中讀出配置菜單,用戶配置完後保存到.config(在頂層目錄下生成)中。在內核編譯時,主Makefile調用這個.config,就知道了用戶對內核的配置情況。

上面的內容說明:Kconfig就是對應着內核的配置菜單。假如要想添加新的驅動到內核的源碼中,可以通過修改Kconfig來增加對我們驅動的配置菜單,這樣就有途徑選擇我們的驅動,假如想使這個驅動被編譯,還要修改該驅動所在目錄下的Makefile。(見第3小節舉例)

因此,一般添加新的驅動時需要修改的文件有兩種(注意不只是兩個)

*Kconfig
*Makefile

要想知道怎麼修改這兩種文件,就要知道兩種文檔的語法結構。

  • Kconfig  語法結構

每個菜單項都有一個關鍵字標識,最常見的就是config。

語法:
config symbol

options
<!--[if!supportLineBreakNewLine]-->
<!--[endif]-->

symbol就是新的菜單項,options是在這個新的菜單項下的屬性和選項

======================================================

其中options部分有:

1、類型定義:
每個config菜單項都要有類型定義,bool:布爾類型,tristate三態:內建、模塊、移除, string:字符串,hex:十六進制, integer:整型

例如  configHELLO_MODULE
                bool"hello testmodule"

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

2、依賴型定義dependson或requires
指此菜單的出現是否依賴於另一個定義

     configHELLO_MODULE
             bool"hello testmodule"
             dependsonARCH_PXA
這個例子表明HELLO_MODULE這個菜單項只對XScale處理器有效,即只有在選擇了ARCH_PXA,該菜單纔可見(可配置)。

3、幫助性定義
只是增加幫助用關鍵字help---help---
<!--[if!supportLineBreakNewLine]-->
<!--[endif]-->

  • Kconfig文檔截圖示例 

image

  • makemenuconfig時配置界面示例

image

  • Kconfig與menuconfig對照圖示

image

  • Kconfig與Makefile對照圖示

image

=== 3 、應用舉例

最後舉個例子:
假設想把自己寫的一個flash的驅動程序加載到工程中,而且能夠通過menuconfig配置內核時選擇該驅動該怎麼辦呢?可以分三步:

第一:將您寫的flashtest.c 文檔添加到/driver/mtd/maps/目錄下。

第二:修改/driver/mtd/maps目錄下的kconfig文檔:
       configMTD_flashtest
                tristate“ap71flash"

這樣當make menuconfig時 ,將會出現 ap71 flash選項。

第三:修改該目錄下makefile文檔。
添加如下內容:obj-$(CONFIG_MTD_flashtest)  +=flashtest.o

這樣,當您運行make menucofnig時,您將發現ap71flash選項,假如您選擇了此項。該選擇就會保存在.config文檔中。當您編譯內核時,將會讀取.config文檔,當發現ap71flash 選項爲yes 時,系統在調用/driver/mtd/maps/下的makefile 時,將會把 flashtest.o加入到內核中。即可達到您的目的。


以上轉自:http://blog.sina.com.cn/s/blog_7219f14a0100m6qe.html

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