linux2.6內(nèi)核Makefile簡(jiǎn)單語(yǔ)法與應(yīng)用來(lái)源: 作者: 時(shí)間:2008-10-06 Tag: 點(diǎn)擊: 401 1.1 概述
2.6的Makefile的寫法和應(yīng)用相對(duì)于2.4有了一些變化,,可能對(duì)于很多人來(lái)說(shuō),因?yàn)檎也坏较嚓P(guān)的文檔,,都是模仿內(nèi)核中已有的文件來(lái)寫自己的Makefile,。其實(shí),在內(nèi)核的Documentation / kbuild目錄下面,,還是有對(duì)內(nèi)核Makefile語(yǔ)法的詳細(xì)說(shuō)明的,。在這里就2.6內(nèi)核中Makefile最常見(jiàn)的簡(jiǎn)單應(yīng)用情況做一個(gè)翻譯和歸納介紹。 2.6內(nèi)核的Makefile分為5個(gè)組成部分:
l 最頂層的Makefile
l 內(nèi)核的.config配置文件 l 在arch/$(ARCH) 目錄下的體系結(jié)構(gòu)相關(guān)的Makefile l 在scripts/ 目錄下的 Makefile.* 文件,,是一些Makefile的通用規(guī)則 l 各級(jí)目錄下的大概約500個(gè)kbuild Makefile文件 頂層的Makefile文件讀取 .config文件的內(nèi)容,,并總體上負(fù)責(zé)build內(nèi)核和模塊。Arch Makefile則提供補(bǔ)充體系結(jié)構(gòu)相關(guān)的信息,。 Scripts目錄下的Makefile文件包含了所有用來(lái)根據(jù)kbuild Makefile 構(gòu)建內(nèi)核所需的定義和規(guī)則,。
1.2 Kbuild Makefile
對(duì)于Makefiles的不同組成部分,有一些不同的語(yǔ)法規(guī)則,。針對(duì)的對(duì)象也不同,,對(duì)于大部分內(nèi)核模塊或設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)者和使用者來(lái)說(shuō),最常接觸到的就是各層目錄下基于kbuild架構(gòu)的kbuild Makefile文件,。 Kbuild Makefile的語(yǔ)法結(jié)構(gòu)非常簡(jiǎn)單,,核心內(nèi)容主要包括 1.2.1 目標(biāo)定義
目標(biāo)定義就是用來(lái)定義哪些內(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ì)被編譯,。 而更常見(jiàn)的做法是根據(jù).config文件的CONFIG_ 變量來(lái)決定文件的編譯方式,如: obj-$(CONFIG_ISDN) += isdn.o obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o 除了obj-形式的目標(biāo)以外,,還有l(wèi)ib-y library庫(kù),,hostprogs-y 主機(jī)程序等目標(biāo),但是基本都應(yīng)用在特定的目錄和場(chǎng)合下,。
1.2.2 多文件模塊的定義
最簡(jiǎn)單的kbuild Makefile如上一節(jié)一句話的形式就夠了,,如果一個(gè)模塊由多個(gè)文件組成,那么稍微復(fù)雜一些,,采用模塊名加 –objs后綴或者 –y后綴的形式來(lái)定義模塊的組成文件,。如以下例子: obj-$(CONFIG_EXT2_FS) += ext2.o ext2-y := balloc.o bitmap.o ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o 模塊的名字為ext2,由balloc.o和bitmap.o兩個(gè)目標(biāo)文件最終鏈接生成ext2.o 直至ext2.ko文件,,是否包括xattr.o取決于內(nèi)核配置文件的配置情況,。如果CONFIG_EXT2_FS的值是y也沒(méi)有關(guān)系,在此過(guò)程中生成的 ext2.o將被鏈接進(jìn)built-in.o最終鏈接進(jìn)內(nèi)核,。這里需要注意的一點(diǎn)是,,該kbuild Makefile所在的目錄中不應(yīng)該再包含和模塊名相同的源文件如ext2.c/ext2.s。 或者寫成如-objs的形式:
obj-$(CONFIG_ISDN) += isdn.o isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o 1.2.3 目錄層次的迭代
如下例: obj-$(CONFIG_EXT2_FS) += ext2/ 如果CONFIG_EXT2_FS 的值為y或m,,kbuild將會(huì)將ext2目錄列入向下迭代的目標(biāo)中,,但是其作用也僅限于此,具體ext2目錄下的文件是要作為模塊編譯還是鏈入內(nèi)核,,還是有ext2目錄下的Makefile文件的內(nèi)容來(lái)決定的,。 1.2.4 模塊的編譯
編譯模塊的時(shí)候,你可以將模塊放在代碼樹中,,用Make modules的方式來(lái)編譯你的模塊,,你也可以將模塊相關(guān)文件目錄放在代碼樹以外的位置,用如下命令來(lái)編譯模塊: make -C path/to/kernel/src M=$PWD modules -C指定代碼樹的位置,,M=$PWD 或 M=`PWD` 告訴kbuild回到當(dāng)前目錄來(lái)執(zhí)行build操作,。 1.2.5 模塊的安裝
當(dāng)你需要將模塊安裝到非默認(rèn)位置的時(shí)候,你可以用INSTALL_MOD_PATH 指定一個(gè)前綴,,如: make INSTALL_MOD_PATH=/foo modules_install 模塊將被安裝到 /foo/lib/modules目錄下 本文來(lái)自: (www.) 詳細(xì)出處參考:http://www./html/article/kernel/20081006/13450.html |
|
來(lái)自: iceberg_horn > 《Driver》