概述
2.6 的makefile的寫法和應用相對於2.4有了一些變化,可能對於很多人來說,因為找不到相關的文件,都是模仿核心中已有的檔案來寫自己的 makefile。其實,在核心的documentation / kbuild目錄下面,還是有對核心makefile語法的詳細說明的。在這裡就2.6核心中makefile最常見的簡單應用情況做乙個翻譯和歸納介 紹。
2.6核心的makefile分為5個組成部分:
1. 最頂層的makefile
2. 核心的.config配置檔案
3. 在arch/$(arch) 目錄下的體系結構相關的makefile
4. 在s目錄下的 makefile.* 檔案,是一些makefile的通用規則
5. 各級目錄下的大概約500個kbuild makefile檔案
頂層的makefile檔案讀取 .config檔案的內容,並總體上負責build核心和模組。arch makefile則提供補充體系結構相關的資訊。 s目錄下的makefile檔案包含了所有用來根據kbuild makefile 構建核心所需的定義和規則。
kbuild makefile
對於makefiles的不同組成部分,有一些不同的語法規則。針對的物件也不同,對於大部分核心模組或裝置驅動的開發者和使用者來說,最常
接觸到的就是各層目錄下基於kbuild架構的kbuild makefile檔案。
kbuild makefile的語法結構非常簡單,核心內容主要包括:
目標定義
obj-y += foo.o
表示要由foo.c或者foo.s檔案編譯得到foo.o並鏈結進核心,而obj-m則表示該檔案要作為模組編譯。 除了y,m以外的obj-x形式的目標都不會被編譯。
而更常見的做法是根據.config檔案的config_ 變數來決定檔案的編譯方式,如:
obj-$(config_isdn) += isdn.o
obj-$(config_isdn_ppp_bsdcomp) += isdn_bsdcomp.o
除了obj-形式的目標以外,還有lib-y library庫,hostprogs-y 主機程式等目標,但是基本都應用在特定的目錄和場合下。
多檔案模組的定義
最簡單的kbuild makefile如上一節一句話的形式就夠了,如果乙個模組由多個檔案組成,那麼稍微複雜一些,採用模組名加 –objs字尾或者 –y字尾的形式來定義模組的組成檔案。如以下例子:
obj-$(config_ext2_fs) += ext2.o
ext2-y := balloc.o bitmap.o
ext2-$(config_ext2_fs_xattr) += xattr.o
模 塊的名字為ext2,由balloc.o和bitmap.o兩個目標檔案最終鏈結生成ext2.o 直至ext2.ko檔案,是否包括xattr.o取決於核心配置檔案的配置情況。如果config_ext2_fs的值是y也沒有關係,在此過程中生成的 ext2.o將被鏈結進built-in.o最終鏈結進核心。這裡需要注意的一點是,該kbuild makefile所在的目錄中不應該再包含和模組名相同的原始檔如ext2.c/ext2.s。
或者寫成如-objs的形式:
obj-$(config_isdn) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
目錄層次的迭代
如下例:
obj-$(config_ext2_fs) += ext2/
如果config_ext2_fs 的值為y或m,kbuild將會將ext2目錄列入向下迭代的目標中,但是其作用也僅限於此,具體ext2目錄下的檔案是要作為模組編譯還是鏈入核心,還是有ext2目錄下的makefile檔案的內容來決定的。
模組的編譯
編譯模組的時候,你可以將模組放在**樹中,用make modules的方式來編譯你的模組,你也可以將模組相關檔案目錄放在**樹以外的位置,用如下命令來編譯模組:
make -c path/to/kernel/src m=$pwd modules
『-c』指定**樹的位置,m=$pwd 或 m=`pwd` 告訴kbuild回到當前目錄來執行build操作。
模組的安裝
當你需要將模組安裝到非預設位置的時候,你可以用install_mod_path 指定乙個字首,如:
make install_mod_path=/foo modules_install
模組將被安裝到 /foo/lib/modules目錄下。
linux2 6核心Makefile簡單語法與應用
2.6的makefile的寫法和應用相對於2.4有了一些變化,可能對於很多人來說,因為找不到相關的文件,都是模仿核心中已有的檔案來寫自己的makefile。其實,在核心的documentation kbuild目錄下面,還是有對核心makefile語法的詳細說明的。在這裡就2.6核心中makefil...
makefile語法 Makefile的語法
假如乙個目標檔案所依賴的依賴檔案很多,我們豈不是要寫很多規則?這顯然不合乎常理。我們可以使用萬用字元解決這些問題。我們對上節程式進行修改 如下 test a.o b.o gcc o test o c gcc c o o 表示所用的.o檔案 c 表示所有的.c檔案 表示目標 表示所有依賴檔案 在該目錄...
linux核心Makefile的簡單分析
makefile 總結 1 配置檔案.config中定義了一系列的變數,makefile將結合它們來決定哪些檔案被編譯進核心。哪些檔案被編譯成模組。涉及哪些子目錄。2 頂層makefile和arch arch makefile決定更目錄下哪些子目錄,arch arch 目錄下哪些檔案和目錄被編譯進核...