Linux设备驱动程序 之 Makefile

典型的模块Makefile如下所示;

 1 ifneq ($(KERNELRELEASE),)
 2         obj-m := hello.o
 3 else
 4         KERNELDIR ?=/lib/modules/$(shell uname -r)/build
 5         PWD :=$(shell pwd)
 6 default:
 7         $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
 8 clean:
 9         @rm -rf *.o *.mod.c *.ko *.symvers *.order *.makers
10 endif

 

该Makefile在构造过程中会被读取两次;执行步骤如下:

1. 当Makefile从命令行调用时,它注意倒KERNELRELEASE尚未被设置,此时执行else的KERNELDIR和PWD设置;

2. 然后执行default目标,make首先切换到-C指定的目录KERNELDIR,执行那个目录下的Makefile,KERNELRELEASE定义在KERNELDIR中的Makefile中,执行完之后KERNELRELEASE已被设置;

3. 然后切换回M=指定的PWD目录,第二次读入执行PWD目录的Makefile,此时因为KERNELRELEASE已经被定义了,kbuild也被启动去解析kbuild语法的语句,make将读取else之前的内容,else之前的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名;

4. 根据上述规则开始真正的构建模块;

上一篇:make mrproper时make[1]:***Documentation/Kbuild:是一个目录;停止;


下一篇:Elasticsearch系列之Query DSL