mes*_*ngr 9 linux makefile linux-device-driver linux-kernel
在学习Linux内核模块时,我可以看到(目前为止有两个来源)编写Makefile的两种方法.第一个是这样的:
ifneq ($(KERNELRELEASE),)
obj-m := module.o
else
default:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
endif
Run Code Online (Sandbox Code Playgroud)
后者不那么复杂:
obj-m := module.o
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
Run Code Online (Sandbox Code Playgroud)
makefile编译导致成功编译模块.我的学习附有LDD3书籍,到目前为止我读到的是下一本书:
此makefile在典型构建中读取两次.从命令行调用makefile时,它注意到尚未设置KERNELRELEASE变量.它通过利用已安装的modules目录中的符号链接构建指向内核构建树的事实来定位内核源目录.如果您实际上没有运行正在构建的内核,则可以在命令行上提供KERNELDIR =选项,设置KERNELDIR环境变量,或者重写在makefile中设置KERNELDIR的行.一旦找到内核源代码树,makefile将调用default:target,它运行第二个make命令(在makefile中参数化为$(MAKE))以调用内核构建系统,如前所述.在第二次阅读时,makefile设置obj-m,
如果makefile被读取两次,那么第二种方法应该导致递归,不是吗?
小智 4
当您第一次通过#make
在控制台上键入内容来调用 Makefile 时,您不会传递任何目标。all:
所以,它会默认调用makefile中的目标名称。
在目标内部,all:
您将目标作为模块传递。因此,这次它将构建模块而不是转到all:
目标。
所以它不会是无限递归。
归档时间: |
|
查看次数: |
7113 次 |
最近记录: |