linux Makefile obj-m obj-y

目標定義是Kbuild Makefile的主要部分,也是核心部分。主要是定義了要編 譯的文件,全部的選項,以及到哪些子目錄去執行遞歸操做。 最簡單的Kbuild makefile 只包含一行: 例子: obj-y += foo.o 該例子告訴Kbuild在這目錄裏,有一個名爲foo.o的目標文件。foo.o將從foo.c 或foo.S文件編譯獲得。 若是foo.o要編譯成一模塊,那就要用obj-m了。所採用的形式以下: 例子: obj-$(CONFIG_FOO) += foo.o $(CONFIG_FOO)能夠爲y(編譯進內核) 或m(編譯成模塊)。若是CONFIG_FOO不是y 和m,那麼該文件就不會被編譯聯接了


Linux各級內核源代碼的子目錄下都有Makefile,大多數Makefile要嵌入主目錄下的Rule.make,Rule.make將識別各個Makefile中所定義的一些變量。變量obj-y表示須要編繹到內核中的目標文件名集合,定義O_TARGET表示將obj-y鏈接爲一個O_TARGET名稱的目標文件,定義L_TARGET表示將obj-y合併爲一個L_TARGET名稱的庫文件。一樣obj-m表示須要編繹成模塊的目標文件名集合。若是還需進行子目錄make,則須要定義subdir-y和subdir-m。在Makefile中,用"obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o"和"subdir-$(CONFIG_EXT2_FS) += ext2"這種形式自動爲obj-y、obj-m、subdir-y、subdir-m添加文件名。有時,狀況沒有這麼單純,還須要使用條件語句個別對待。Makefile中還有其它一些變量,如mod-subdirs定義了subdir-m之外的全部模塊子目錄。 


Rules.make是如何使make進入子目錄的呢? 先來看subdir-y是如何處理的,在Rules.make中,先對subdir-y中的每個文件名加上前綴"_subdir_"再進行排序生成subdir-list集合,再以它做爲目標集,對其中每個目標產生一個子make,同時將目標名的前綴去掉獲得子目錄名,做爲子make的起始目錄參數。subdir-m與subdir-y相似,但狀況稍微複雜一些。因爲subdir-y中可能有模塊定義,所以利用mod-subdirs變量將subdir-y中模塊目錄提取出來,再與subdir-m合成一個大的MOD_SUB_DIRS集合。subdir-m的目標所用的前綴是"_modsubdir_"。 


一點說明,子目錄中的Makefile與Rules.make都沒有嵌入.config文件,它是經過主Makefile向下傳遞MAKEFILES變量完成的。MAKEFILES是make自已識別的一個變量,在執行新的Makefile以前,make會首先加載MAKEFILES所指的文件。在主Makefile中它即指向.config。 ui

相關文章
相關標籤/搜索