以LDD3
中Compiling and Loading
一节的编译模块的Makefile
为例:
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
当在命令行执行make
命令时(当前工作目录即模块源文件所在目录),因为当前模块所在目录里没有定义KERNELRELEASE
,所以执行else
部分,即把KERNELDIR
和PWD
变量赋值。
接下来执行“$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
”命令。-C
选项的含义是把目录切换到KERNELDIR
目录下,然后读取KERNELDIR
目录下的Makefile
。M
选项是在编译modules
再切换回模块所在目录。此时由于KERNELRELEASE
变量已经定义,即可以得知需要编译obj-m
。