[英]Linux kernel module programming: makefile
在学习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变量。 它通过利用已安装的modules目录中的符号链接构建指向内核构建树的事实来定位内核源目录。 如果您实际上没有运行正在构建的内核,则可以在命令行上提供KERNELDIR =选项,设置KERNELDIR环境变量,或者重写在makefile中设置KERNELDIR的行。 一旦找到内核源代码树,makefile将调用default:target,它运行第二个make命令(在makefile中参数化为$(MAKE))以调用内核构建系统,如前所述。 在第二次读取时,makefile设置obj-m,内核makefile负责实际构建模块。
如果makefile被读取两次,那么第二种方法应该导致递归,不是吗?
当你第一次通过在控制台上键入#make
来调用Makefile时,你没有传递任何目标。 因此,它将默认调用目标名称all:
在makefile中。
在all:
target中,你将目标作为模块传递。所以,这次它将构建模块而不是去all:
目标。
所以它不会是无限的递归。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.