編譯可裝載模塊 - obj-m
$(obj-m) 列舉出了哪些文件要編譯成可裝載模塊。
一個模塊可以由一個文件或多個文件編譯而成。如果是一個源文件,Kbuild Makefile只需簡單的將其加到$(obj-m)中去就可以了。
例子:
#drivers/isdn/i4l/Makefile
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
注意:此例中 $(CONFIG_ISDN_PPP_BSDCOMP) 的值爲'm'
如果內核模塊是由多個源文件編譯而成,那你就要採用上面那個例子一樣的方法去聲明你所要編譯的模塊。Kbuild需要知道你所編譯的模塊是基於哪些文件,所以你需要通過變量$(<module_name>-objs)來告訴它。看下的面子:
例子:
#drivers/isdn/i4l/Makefile
obj-$(CONFIG_ISDN) += isdn.o
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
在這個例子中,模塊名將是isdn.o, Kbuild將編譯在$(isdn-objs)中列出的所有文件,然後使用"$(LD) -r"生成isdn.o。
Kbuild能夠識別用於組成目標文件的後綴-objs和後綴-y。這就讓Kbuild Makefile可以通過使用 CONFIG_ 符號來判斷該對象是否是用來組合對象的。
例子:
#fs/ext2/ Makefile
obj-$(CONFIG_EXT2_FS) += ext2.o
ext2-y := balloc.o bitmap.o
ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o
在這個例子中,如果 $(CONFIG_EXT2_FS_XATTR) 是 'y', xattr.o將是複合對象 ext2.o的一部分。
注意:當然,當你要將其編譯進內核時,上面的語法同樣適用。所以,如果你的 CONFIG_EXT2_FS=y,那Kbuild會按你所期望的那樣,生成 ext2.o文件,然後將其聯接到 built-in.o中。