Makefile之编译可装载模块 及 多源文件编译方法



编译可装载模块 - 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中。










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章