Makefile编写记录
ifneq ($(KERNELRELEASE),)
obj-m := helloworld.o
else
KERNELDIR ?= /lib/modules/$(shell uname-r)/build
PWD := $(shell pwd)
default:
$(MAKE)-C $(KERNELDIR) M=$(PWD) modules
Endif
需要注意点:
1、 ifneq ()中间要有空格,否则提示遗漏分隔符;
2、 记住else,否则提示Notarget。
3、 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 前是TAB(一定要确保是TAB)
4、 Ifneq 和 endif 前无需#
Makefile文件解读:
$(KERNELRELEASE)变量定义在源码的顶层目录中,如果是通过编译内核的方式编译驱动模块时会进这个分支。
正常通过命令make编译编译时,这个Makefile文件要被读取两次,第一次是执行到
$(MAKE) -C $(KERNELDIR) (进入到源码路径执行make),这条命令执行后$(KERNELRELEASE)变量就不为NULL了,并且路径跳转到了当前模块所在的目录,重新读取一次Makefile,由于$(KERNELRELEASE)不为空,所以会执行obj-m := helloworld.o,之后就创建了.ko模块了。