在学习Linux内核模块时,我发现(迄今为止来自两个来源)有两种编写Makefile的方法。第一种方法大致如下:
ifneq ($(KERNELRELEASE),)
obj-m := module.o
else
default:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
endif
后者较为简单:
obj-m := module.o
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
无论是makefile编译还是成功编译的模块,在我的学习中都与LDD3书籍相伴。目前我所阅读的内容如下:
当从命令行调用makefile时,该makefile通常会被读取两次。它注意到KERNELRELEASE变量未设置,并利用已安装模块目录中构建的符号链接指回内核构建树,以定位内核源目录。如果您实际上没有运行正在构建的内核,则可以在命令行上提供KERNELDIR =选项、设置KERNELDIR环境变量或重写在makefile中设置KERNELDIR的那行。一旦找到内核源树,makefile将调用默认目标,运行第二个make命令(在makefile中参数化为$(MAKE)),如上述描述,调用内核构建系统。在第二次阅读中,makefile设置obj-m,内核makefile负责实际构建模块。
如果makefile被读取两次,第二种方法是否应导致递归呢?