1.頂層 頂層的Makefile文檔讀取內(nèi)核配置文件.config文檔的內(nèi)容.遞歸向下訪問子目錄的形式完成build內(nèi)核和模塊的工作,。 .config文件的內(nèi)容是在makemenuconfig的時(shí)候,通過Kconfig文檔配置的結(jié)果.arch/$(ARCH)/Makefile則提供補(bǔ)充體 系結(jié)構(gòu)相關(guān)的信息,; 2.內(nèi)核中的kconfig 每個(gè)Kconfig分別描述了所屬目錄源文件相關(guān)的內(nèi)核配置菜單,。 Kconfig 語法結(jié)構(gòu) 每個(gè)菜單項(xiàng)都有一個(gè)關(guān)鍵字標(biāo)識(shí),最常見的就是config,。 語法: config symbol options symbol就是新的菜單項(xiàng),,options是在這個(gè)新的菜單項(xiàng)下的屬性和選項(xiàng) 其中options部分有: (1)類型定義: 每個(gè)config菜單項(xiàng)都要有類型定義,bool:布爾類型,,tristate三態(tài):內(nèi)建,、模塊、移除,, string:字符串,,hex:十六進(jìn)制, integer:整型 例如 configHELLO_MODULE bool"hello testmodule" bool類型的只能選中或不選中,,tristate類型的菜單項(xiàng)多了編譯成內(nèi)核模塊的選項(xiàng),,假如選擇編譯成內(nèi)核模塊,則會(huì)在.config中生成一個(gè) CONFIG_HELLO_MODULE=m的配置,,假如選擇內(nèi)建,,就是直接編譯成內(nèi)核影響,就會(huì)在.config中生成一個(gè)CONFIG_HELLO_MODULE=y的配置. (2)依賴型定義dependson或requires 指此菜單的出現(xiàn)是否依賴于另一個(gè)定義 configHELLO_MODULE bool"hello testmodule" dependsonARCH_PXA 這個(gè)例子表明HELLO_MODULE這個(gè)菜單項(xiàng)只對(duì)XScale處理器有效,,即只有在選擇了ARCH_PXA,,該菜單才可見(可配置)。 (3)幫助性定義 只是增加幫助用關(guān)鍵字help或---help-- 3.makefile的內(nèi)容 (1)目標(biāo)定義 目標(biāo)定義就是用來定義哪些內(nèi)容要做為模塊編譯,,哪些要編譯鏈接進(jìn)內(nèi)核,。如: obj-y += foo.o 表示要由foo.c或者foo.s文件編譯得到foo.o并鏈接進(jìn)內(nèi)核,而obj-m則表示該文件要作為模塊編譯。 除了y,,m以外的obj-x形式的目標(biāo)都不會(huì)被編譯,。而更常見的做法是根據(jù).config文件的CONFIG_ 變量來決定文件的編譯方式(該變量如何起作用見文末另一篇文章的鏈接),如: obj-$(CONFIG_EXT2) += ext2.o 除了obj-形式的目標(biāo)以外,,還有l(wèi)ib-y library庫,,hostprogs-y 主機(jī)程序等目標(biāo),但是基本都應(yīng)用在特定的目錄和場(chǎng)合下,。 (2)多文件模塊的定義 最簡(jiǎn)單的kbuild Makefile如上一節(jié)一句話的形式就夠了,,如果一個(gè)模塊由多個(gè)文件組成,那么稍微復(fù)雜一些,,采用模塊名加 –objs后綴或者 –y后綴的形式來定義模塊的組成文件,。如以下例子: obj-$(CONFIG_EXT2) += ext2.o ext2-y := balloc.o bitmap.o 或者寫成如-objs的形式: obj-$(CONFIG_EXT2) += ext2.o ext2-objs := balloc.o bitmap.o 模塊的名字為ext2,如果CONFIG_EXT2的值是m,,由balloc.o和bitmap.o兩個(gè)目標(biāo)文件最終鏈接生成ext2.o 直至ext2.ko文件,,如果CONFIG_EXT2的值是y,生成的 ext2.o將被鏈接進(jìn)built-in.o最終鏈接進(jìn)內(nèi)核,。 (3)目錄層次的迭代 如下例: obj-$(CONFIG_EXT2) += ext2/ 如果CONFIG_EXT2 的值為y或m,,kbuild將會(huì)將ext2目錄列入向下迭代的目標(biāo)中。 4.多文件makefile和kconfig #CONFIG_ECAT_DRV為m時(shí)編譯為模塊,,為y時(shí)編進(jìn)內(nèi)核 ecat.o為最終鏈接的目標(biāo)文件 obj-$(CONFIG_ECAT_DRV) += ecat.o #-objs指定依賴的多個(gè).o文件 這些文件都對(duì)應(yīng)相應(yīng)的.c文件 ecat-objs := ecateoe.o eoeappl.o mcihw.o ecatslv.o mailbox.o ecatappl.o ecat2440.o 本地Kconfig #建立一個(gè)本地子目錄,。“”為顯示的目錄名字 menu "ecat driver here" depends on NET #依賴于上層的某個(gè)開關(guān) config ECAT_DRV #配置變量名,,必須和Makefile中的變量后半段一樣 bool "ecat driver" #bool量,, 顯示的名字 ---help--- #下面為要顯示的幫助文字 This is test for ecat. endmenu #本地子目錄結(jié)束 上層Makefile *#添加下面這一句 obj-$(CONFIG_ECAT_DRV) += ecat/ #打開下一級(jí)目錄編譯 上層Kconfig *#添加下面這一句 source "driver/xxx/ecat/Kconfig" #導(dǎo)入子文件夾中的Kconfig文件,可以為相對(duì)路徑 |
|