Makefile前的准备工作:
1、要有一个编译好的内核目录(里面已经配置好CPU架构、交叉工具链)
原因是:modules的Makefile包含一个编译好的内核的目录进来,是要将该modules的Makefile加入到编译好的内核的Makefile,这样modules的Makefile就可以得到编译好的内核一致的信息。
例子:
obj-m += helloworld.o (1)
KERN_DIR =/root/ARM/kernel/android-kernel-samsung-dev (2)
PWD := $(shell pwd) (3)
modules:
$(MAKE) -C $(KERN_DIR) M=$(PWD) modules (4)
clean:
$(MAKE) -C $(KERN_DIR) M=$(PWD) modules clean (5)
注释:
1、obj-m
表明将要从目标文件helloworld.o中建立内核模块,建立的模块名为helloworld.ko。
如果模块需要从两个以上目标文件建立,则如下表述:
obj-m += moduls_name.o
moduls_name-obj := file1.o file2.o
2、KERN_DIR
包含一个已经编译好的内核源码树目录,也就是说要编译的modules是基于这个内核的。这一点很重要,内核源码树目录顶层的Makefile会调用modules的Makefile来对modules进行编译。
3、通过shell命令,获取要编译的modules的工作目录。
4、这里的$(MAKE)就相当于make,-C 选项的作用是指将当前工作目录转移到你所指定的位置。“M=”选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,需要在make modules 命令中加入“M=dir”,程序会自动到你所指定的dir目录中查找模块源码,将其编译,生成KO文件。
5、清除编译产生的文件
相关的阅读材料可以查看内核源码树\Documentation\kbuild\modules.txt