我最近开始使用《Linux 内核模块编程指南》一书学习内核模块编程,但我不明白这是如何工作的
obj-m += hello-1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
请注意,我了解 makefile 的基础知识,但这似乎很复杂,至少不应该 make clean 是 rm hello-1.ko ?
答案1
以下是此 makefile 中发生的情况的详细说明:
某处有一个对象列表,将“hello-1.o”添加到列表中。
obj-m += hello-1.o
创建一个名为 all 的目标,没有任何要求。完成所有操作的方法是切换到根据系统运行的当前内核版本命名的目录中的构建目录(位于 /lib 下的模块目录中)。当我们保存一个变量时,该变量将包含我们称之为 make 的当前工作目录。现在在我们刚刚更改的目录中找到一个 make 文件并构建目标模块
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
这个几乎是一样的,留给读者作为练习:
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
clean 不仅仅是一个的原因rm
是因为内核有很多独立的部分,它们都一起工作。编写一个整体的 makefile 充其量是一件痛苦的事情,但实际上难以维护。因此,构建目录的每个逻辑部分都有自己的 makefile,可以从协调的 makefile 中调用该文件。 Makefile 可能会变得非常繁琐,因此最好保持它们的重点和可维护性。