Linux核心源碼樹的每個目錄下都有兩個文檔Kconfig和Makefile。分布到各目錄的Kconfig構成了一個分布式的核心設定資料庫,每個Kconfig分別描述了所屬目錄來源文件相關的核心配置菜單。在執行核心配置make menuconfig時,從Kconfig中讀出菜單,使用者選擇後儲存到.config的核心配置文檔中。在核心編譯時間,主Makefile調用這個.config,就知道了使用者的選擇。這個內容說明了,Kconfig就是對應著核心的每級配置菜單。
假如要想添加新的驅動到核心的源碼中,要修改Kconfig,這樣就能夠選擇這個驅動,假如想使這個驅動被編譯,則要修改Makefile。添加新的驅動時需要修改的文檔有兩種(如果添加的只是檔案,則只需修改當前層Kconfig和Makefile檔案;如果添加的是目錄,則需修改當前層和目錄下的共一對Kconfig和Makefile)Kconfig和Makefile。要想知道怎麼修改這兩種文檔,就要知道兩種文檔的文法結構。
Kconfig:每個菜單都有一個關鍵字標識,最常見的就是config。文法:config symbol,是個新的標記的功能表項目,options是在這個新的功能表項目下的屬性和選項。
1,每個config功能表項目都要有類型定義,bool布爾類型、 tristate三態:內建、模組、移除。bool類型的只能選中或不選中,tristate類型的功能表項目多了編譯成核心模組的選項,假如選擇編譯成核心模組,則會在.config中產生一個CONFIG_HELLO_MODULE=m的配置;假如選擇內建,就是直接編譯成核心映像,就會在.config中產生一個CONFIG_HELLO_MODULE=y的配置。
2,依賴型定義depends on或requires,指此菜單的出現和否依賴於另一個定義
config HELLO_MODULE
bool "hello test module"
depends on ARCH_PXA
這個例子表明HELLO_MODULE這個功能表項目只對XScale處理器有效。
3,協助性定義
只是增加協助用關鍵字help或---help---。
舉一個完整執行個體如下,例如添加一個I2C晶片:
config QL_VEE
tristate "QL Visual Enhancement Engine (VEE)"
default y
depends on I2C && EXPERIMENTAL
help
QL Visual Enhancement Engine (VEE) v1.0 with I2C-Compatible Interface and 24-Bit RGB Support Rev.
Makefile:核心的Makefile分為5個組成部分:
(1)Makefile 最頂層的Makefile
(2).config 核心的當前配置文檔,編譯時間成為頂層Makefile的一部分
(3)arch/$(ARCH)/Makefile 和體繫結構相關的Makefile
(4)Makefile.* 一些特定Makefile的規則
(5)kbuild層級Makefile 各級目錄下的大概約500個文檔,編譯時間根據上層Makefile傳下來的宏定義和其他編譯規則,將原始碼編譯成模組或編入核心。頂層的Makefile文檔讀取.config文檔的內容,並總體上負責build核心和模組。Arch Makefile則提供補充體繫結構相關的資訊。其中.config的內容是在make menuconfig的時候,通過Kconfig文檔配置的結果。
假設想把自己寫的一個flash的驅動程式載入到工程中,而且能夠通過menuconfig配置核心時選擇該驅動該怎麼辦呢?如下:
第一:將您寫的flashtest.c 文檔添加到/driver/mtd/maps/ 目錄下。
第二:修改/driver/mtd/maps目錄下的kconfig文檔:
config MTD_flashtest
tristate “ap71 flash"
這樣當make menuconfig時 ,將會出現 ap71 flash選項。
第三:修改該目錄下makefile文檔。添加如下內容:obj-$(CONFIG_MTD_flashtest) += flashtest.o
這樣,當您運行make menucofnig時,您將發現ap71 flash選項,假如您選擇了此項。該選擇就會儲存在.config文檔中。當您編譯核心時,將會讀取.config文檔,當發現ap71 flash 選項為yes,系統在調用/driver/mtd/maps/下的makefile 時,將會把 flashtest.o 加入到核心中。