2011-06-01 驱动的makefile

《Linux设备驱动程序(第三版)》。里面有个关于Module编译的Makefile
# 如果已经定义了KERNELRELEASE,则说明是从内核整体编译的Make中调用。在我的2.6.31内核的
#Makefile中L357行有关于KERNELRELEASE定义:
# KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
#因此可以使用其内建语句
ifneq ($(KERNELRELEASE), )
obj-m := hello.o

#否则,是直接从命令行调用,
#这时需要调用内核构造系统
#对$(shell uname -r)会得到Linux系统版本相关信息:
# uname -r
#2.6.32-28-generic
else


KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(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) modules
endif

 

 

这样,通常在内核外编译模块(不是内核的makefile里面实现模块的编译),个 makefile 在一次典型的建立中要被读 2 次. 当从命令行中调用这个 makefile , 它注意到 KERNELRELEASE 变量没有设置(因为不是内核makefile里面编译),这样利用KERNELDIR 的那一行发现内核源码树.然后makefile 调用 default: 目标, 来运行第 2 个 make 命令( 在 makefile 里参数化成 $(MAKE))象前面描述过的一样来调用内核建立系统. 在 第 2 次读, KERNELRELEASE 已赋值, makefile 设置 obj-m := hello.o, 并且内核的 makefile 文件完成实际的建立模块工作.(内核建立系统处理了余下的工作)

你可能感兴趣的:(2011-06-01 驱动的makefile)