KERNELDIR ?= /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)default:
#对下面一句Makefile的解释:-C $(KERNELDIR)表示读取Makefile之前进入KERNELDIR目录,M=$(PWD) #作为参数传给Makefile,在试图建立模块目标前, 回到你的模块源码目录,内核中的解释是:#make M=dir modules Make all modules in specified dir $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesendif
这样,通常在内核外编译模块(不是内核的makefile里面实现模块的编译),个 makefile 在一次典型的建立中要被读 2 次. 当从命令行中调用这个 makefile , 它注意到 KERNELRELEASE 变量没有设置(因为不是内核makefile里面编译),这样利用KERNELDIR 的那一行发现内核源码树.然后makefile 调用 default: 目标, 来运行第 2 个 make 命令( 在 makefile 里参数化成 $(MAKE))象前面描述过的一样来调用内核建立系统. 在 第 2 次读, KERNELRELEASE 已赋值, makefile 设置 obj-m := hello.o, 并且内核的 makefile 文件完成实际的建立模块工作.(内核建立系统处理了余下的工作)