您的位置:首页 > 移动开发 > Android开发

Android 内核 Makefile入门

2011-03-12 11:35 393 查看
//Rocky@20110312

Android 内核 Makefile入门

Makefile文件极其复杂,语法规则如同江水之多,但是我们本着实用解决问题的原则,只取一瓢,够用就可以。

内核模块或者设备驱动开发者经常接触的Makefile语法包含以下几个部分。

一:目标定义:

目标定义用来定义哪些内容要作为模块编译,哪些内容要编译进内核。



例如1:

obj-y +=foo.o

表示要由foo.c或者foo.s文件编译得到foo.o并连接到内核当中去。

obj-m +=foo.o

表示要由foo.c或者foo.s文件编译得到foo.o编译成模块。



除了obj-y,obj-m以外的obj-x都不会编译。



最常用的就是根据Kconfig得到的.config文件的CONFIG_变量来决定文件的编译方式。



例如2:

obj-$(CONFIG_ISDN)+=isdn.o



二:多文件模块的定义



如果一个模块由多个文件组成,这时候应该采用模块名加-objs后缀或者-y后缀的形式来定义模块的组成文件。



例如3:

obj-$(CONFIG_EXT3_FA) +=ext3.o



ext3-y:=balloc.o bitmap.o

ext3-$(CONFIG_EXT3_XTT)+=xttattor.o



简单说明上面的意思。

模块的名字是ext2,它至少由balloc.o 和 bitmap.o两个目标文件最长生产。是否再添加xttattor.要看CONFIG_EXT3_XTT是否为y或者m.



上面的这种模块方式也可以直接写成obj的形式。

obj-$(CONFIG_ISDN)+=isdn.o

isdn-objs :=isdn_net_lib.o isdn_v110.o isdn_common.o





三:目录层次的迭代



就是表示某一个目录是否编译。

例如4:

obj-$(CONFIG_CBS) += cbs/

当CONFIG_CBS为y或者m的时候,会去找cbs目录下的Makefile文件。但是cbs/makefile文件具体是编译成模块还是内核完全由它自己觉得。

CONFIG_CBS只是表示包含或者不包含进入编译,没有其他的很大的意义。



四:编译进内核和模块的区别

通过上面的说明,我们应该明白了y和m在大部分的情况下是有区别的。那他们的区别到底是什么呢?



例如:

obj-$(CONFIG_DEMO) +=cbs.o



如果CONFIG_DEMO

=y ,则会将生成内核中。

=m , 则会生成cbs.ko模块文件

=n , 则不会编译此文件





具体的关于内核模块和编译进入内核的区别是什么,比较复杂,我们将用一个Linux内核模块介绍来专门解释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: