內(nèi)核Makefile的框架
層Makefile所包含。 譯所需的文件列表,。
---------------------------------------------------------------------------------- .config .config文件可以被理解為一個(gè)Makefile的變量表,該文件記錄了內(nèi)核Makefile中與特定文件 編譯是否被編譯相關(guān)變量的值,。內(nèi)核配置程序根據(jù)每個(gè)目錄下的KCONFIG文件生成內(nèi)核配置程序 選項(xiàng)界面,,用戶通過該界面設(shè)定了需要編譯的功能,內(nèi)核配置程序再根據(jù)KCONFIG中的內(nèi)容生成 了不同的變量,,并把該變量導(dǎo)入到.config,,供內(nèi)核編譯時(shí)參照調(diào)用。
--------------------------------------------------------------------------------- 架構(gòu)Makfile
頂層Makefile為各子目錄下Makefile包含的公共部分,而頂層Makefile又首先包含了arch/ $(ARCH)/Makefile,。該架構(gòu)Makefile包含了針對(duì)特定架構(gòu)的配置信息,,相關(guān)變量及目標(biāo)等。 一具體架構(gòu)Makefile的具體目的就是,,將生成并壓縮 vmlinux 文件,,寫入啟動(dòng)代碼,并將其拷 貝到正確的位置,。這就包含了多種不同的安裝命令,。該具體目的也無(wú)法在各個(gè)平臺(tái)間進(jìn)行標(biāo) 準(zhǔn)化。一般,,附加的處理命令入在arch/$(ARCH)/下的boot目錄,。
---------------------------------------------------------------------------------- Kbuild文件
內(nèi)核使用Kbuild組織Kbuild Makefile。如果同一目錄中同時(shí)出現(xiàn)Makefile與Kbuild,, Kbuild將會(huì)被使用,。 編譯內(nèi)核文件的主要目標(biāo)有兩個(gè):分別是obj-y和obj-m。 Kbuild Makefile規(guī)定所有編譯進(jìn)內(nèi)核的目標(biāo)文件存在$(obj-y)列表中,,編譯成模塊的 目標(biāo)文件存在$(obj-m)列表中,。而這些列表依賴內(nèi)核的配置文件。 修改目標(biāo)內(nèi)容采用以下方式: obj-$(CONFIG_<obj_dir_name>) = filename.o 此語(yǔ)句告訴內(nèi)核,,當(dāng)前目錄下有一名為filename.o的目標(biāo),。此目標(biāo)將由filename.c或 filename.s文件編譯得到。 CONFIG_<obj_dir_name> Makefile只對(duì)當(dāng)前目錄對(duì)象負(fù)責(zé),,Kbuild通過辨別Kconfig中CONFIG_<obj_dir_name> 的值來(lái)判斷是否應(yīng)該遞歸操作,但是它指代的值只能夠是y(編譯進(jìn)內(nèi)核)或m(編譯成模塊),,其 余值一律不會(huì)被編譯鏈接, 如: #fs/Makefile obj-$(CONFIG_EXT2_FS) = ext2/ 如果,CONFIG_EXT2_FS的值有效,Kbuild就會(huì)遞歸訪問ext2目錄,,遞歸的原因是ext2/是一個(gè)目錄,, 再調(diào)用該目錄下的Makefile進(jìn)行編譯操作。
---------------------------------------------------------------------------------- Kbuild執(zhí)行的步驟
1) 根據(jù)內(nèi)核配置生成文件 .config 2) 將內(nèi)核的版本號(hào)存儲(chǔ)在 include/linux/version.h 3) 生成指向 include/asm-$(ARCH) 的符號(hào)鏈接 4) 更新所有編譯所需的文件: -附加的文件由 arch/$(ARCH)/Makefile 指定,。 5) 遞歸向下訪問所有在下列變量中列出的目錄: init-* core* drivers-* net-* libs-* 并編譯生成目標(biāo)文件,。 -這些變量的值可以在 arch/$(ARCH)/Makefile 中擴(kuò)充。 6) 鏈接所有的目標(biāo)文件,,在源代碼樹頂層目錄中生成 vmlinux,。 最先聯(lián)接是在 head-y中列出的文件,該變量由 arch/$(ARCH)/Makefile 賦值,。 7) 最后完成具體架構(gòu)的特殊要求,,并生成最終的啟動(dòng)鏡像。 -包含生成啟動(dòng)指令 -準(zhǔn)備 initrd 鏡像或類似文件
---------------------------------------------------------------------------------- 目標(biāo) obj-y 1). Kbuild編譯所有的$(obj-y)文件,,然后,,然后將它們鏈接為build-in.o文件,,最后 鏈接到vmlinux中。 2). 相同的目標(biāo)可以在obj-y列表中重復(fù)出現(xiàn),,已成功鏈接到built-in.o的目標(biāo)會(huì)被忽略,。 3). 目標(biāo)鏈接時(shí)是按順序的。如果鏈接順序出錯(cuò),,有可能造成硬盤數(shù)據(jù)出錯(cuò),。
---------------------------------------------------------------------------------- 目標(biāo) obj-m 1). 一個(gè)文件編譯一個(gè)模塊 obj-$(CONFIG_<obj_dir_name>) = <module_name>.o 2). 多個(gè)文件編譯一個(gè)模塊 obj-$(CONFIG_<obj_dir_name>) = <module_name>.o Kbuild能夠識(shí)別目標(biāo)文件的后綴為-objs和-y。kbuild通過CONFIG_符號(hào)來(lái)判斷對(duì)象是 否用于組合,。
---------------------------------------------------------------------------------- 編輯標(biāo)志 下面標(biāo)志僅在它們所被指定的Kbuild makefile有效。 ccflags-y 用于編譯C源代碼的編譯選項(xiàng),。源代碼樹擁有,。 asflags-y 用于編譯匯編源代碼的編譯選項(xiàng)。當(dāng)前目錄擁有,。 ldflags-y 用于鏈接目標(biāo)文件的選項(xiàng),。當(dāng)前目錄擁有。 CFLAGS_$(filename), AFLAGS_$(filenam) 編譯源代碼選項(xiàng),,單個(gè)文件擁有的,。 ---------------------------------------------------------------------------------- 依賴跟蹤 改變下面任意項(xiàng)內(nèi)容,所有受影響文件將會(huì)重新被編譯,。 1). 所有參與編譯的文件(*.o和*.h) 2). 所有參與使用的CONFIG_項(xiàng) 3). 用于編譯的命令行
---------------------------------------------------------------------------------- 相關(guān)變量列表 ---------------------------------------------------------------------------------- KERNELRELEASE $(KERNELRELEASE) 是一個(gè)字符串,,類似"2.4.0-pre4",用于安裝目錄的命名或顯示當(dāng)前的版本號(hào),。 一部分架構(gòu)Makefile使用該變量,。內(nèi)容通過cat include/config/kernel.release所得。
ARCH 該變量定義了目標(biāo)架構(gòu),,比如"i386","arm" 或"sparc",。有些Kbuild Makefile 根據(jù) $(ARCH) 決定編譯哪些文件。 默認(rèn)情況下,,頂層Makefile將其設(shè)置為本機(jī)架構(gòu),。如果是跨平臺(tái)編譯,用戶可以 用下面的命令覆蓋該值: make ARCH=m68k ...
INSTALL_PATH 該變量為架構(gòu)Makefile定義了安裝內(nèi)核鏡像與 System.map 文件的目錄,。 主要用來(lái)指明架構(gòu)特殊的安裝路徑,。
INSTALL_MOD_PATH,MODLIB $(INSTALL_MOD_PATH) 為了安裝模塊,給 $(MODLIB) 聲明了前綴,。該變量不能 在Makefile中定義,,但可以由用戶傳給Makefile。 $(MODLIB) 具體的模塊安裝的路徑,。頂層Makefile將$(MODLIB)定義為 $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE),。用戶可以通過命令行 參數(shù)的形式將其覆蓋,。 INSTALL_MOD_STRIP
如果該變量有定義,模塊在安裝之前,,會(huì)被剝出符號(hào)表,。如果 INSTALL_MOD_STRIP 為 "1",就使用默認(rèn)選項(xiàng) --strip-debug,。否則,, INSTALL_MOD_STRIP 將作為命令 strip 的選項(xiàng)使用。
--------------------------------------------------------------------------------------------- 與設(shè)備驅(qū)動(dòng)相關(guān)的瑣碎
. 編譯額外模塊 make M=dir modules 頂層Makefile會(huì)調(diào)用dir目錄下的Makefile去構(gòu)造額外模塊
|
|