在PC機上編譯適合本PC機kernel的單個模塊的Makefile很容易寫,在PC機上編譯android內核的某個模塊卻有些不同:主要是指定內核和交叉編譯工具的路徑。具體如下:
Makefile 內容
ifneq ($(KERNELRELEASE), )
mymodule-objs := helloworld.o
obj-m := helloworld.o
else
PWD:=$(shell pwd)
KERNEL_DIR ?=$(ANDROID_PRODUCT_OUT)/obj/KERNEL_OBJ/
CROSS_COMPILE=$(ARM_EABI_TOOLCHAIN)
PWD:=$(shell pwd)
all:
make ARCH=arm $(CROSS_COMPILE) -C $(KERNEL_DIR) M=$(PWD) modules
clean:
rm -rf *.o modules.order *.ko Module.symvers
endif
對應的helloworld.c 如下
helloworld.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
static int __init hellokernel_init(void)
{
printk(KERN_INFO "Hello, kernel!\n");
return 0;
}
static void __exit hellokernel_exit(void)
{
printk(KERN_INFO "Goodbye, kernel!\n");
}
module_init(hellokernel_init);
module_exit(hellokernel_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("XXX");
MODULE_DESCRIPTION("Test only");
運行時先在項目文件目錄下運行
$ source build/envsetup.sh
和
$ lunch
選擇編譯項目選項 導入一些符號定義,最後即可運行mak執行本Makefile
$ make
生成的helloworld.ko 即是適合android 內核的文件,即可用insmod rmmod 將模塊加入目標板的內核或從內去除。
另:如果將Makefile中的符號替換成對應的內容,即直接指定KERNEL_DIR和CROSS_COMPILE在android代碼中的路徑,則無需執行source 和lunch命令即可在任意標籤頁直接運行make 命令生成目標文件,對應的Makfile文件如下:
Makefile 內容:
mymodule-objs := helloworld.o
obj-m := helloworld.o
PWD:=$(shell pwd)
KERNEL_DIR=android_src_path/out/target/product/T37lchaudi/obj/KERNEL_OBJ/
CROSS_COMPILE=android_src_path/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin
PWD:=$(shell pwd)
all:
make ARCH=arm $(CROSS_COMPILE) -C $(KERNEL_DIR) M=$(PWD) modules
clean:
rm -rf *.o modules.order *.ko Module.symvers
其中android_src_path爲anroid項目所在的目錄。
PC OS verison:Ubuntu 12.04.2 LTS, kernel version:3.5.0-27-generic
目標板kernel version:3.0.50