在《Linux设备驱动程序》一书中读到的内核模块编译Makefile,不是非常理解,在查询很多资料后,在这里做个总结。
书中Makefile代码:
1 ifneq ($(KERNELRELEASE),) 2 obj-m:=hello.o 3 else 4 KDIR := /lib/modules/$(shell uname -r)/build 5 PWD:=$(shell pwd) 6 all: 7 make -C $(KDIR) M=$(PWD) modules 8 clean: 9 rm -f *.ko *.o *.symvers *.cmd *.cmd.o 10 endif
代码解析:
1. 判断变量KERNELRELEASE是否设置,该变量在linux内核顶层Makefile中会被设置。当然第一次执行makefile时,KERNELRELEASE未被设置
2. 进入else分支,设置KDIR变量为linux内核源代码路径,PWD为makefile文件所在的路径
3. 执行目标all,命令先执行到make -C $(KDIR),此时,makefile跳转到内核源码顶层,执行所在目录的makefile
4. 命令执行到M=$(PWD),此时回到内核模块makefile所在的路径,第二次执行该makefile,此时KERNELRELEASE已经在执行内核顶层Makefile时被赋值,因此obj-m:=hello.o被执行
5. 内核将hello.o链接成hello.ko,得到我们需要的内核模块
编译多文件:
若内核模块由多个源文件,正确的写法为:
obj-m:=hello.o
hello-objs:=file1.o file2.o file3.o