繁体   English   中英

Linux内核模块编程:makefile

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM