理解Makefile中PWD=$(shell pwd):Linux驱动模块Makefile示例与内核源码树

需积分: 14 13 下载量 151 浏览量 更新于2024-09-17 1 收藏 278KB DOCX 举报
在IT领域,特别是驱动模块的Makefile编写中,理解pwd命令和Makefile中使用shell函数的重要性至关重要。`pwd`(Print Working Directory)是一个Linux命令,用于显示当前工作目录的绝对路径。在Makefile中,`PWD=$(shell pwd)`这样的语句被用来动态获取并设置变量`PWD`,确保在执行过程中得到正确的当前目录。这里的关键在于: 1. `$(pwd)`是一个变量引用,表示调用系统的pwd命令并获取其输出。然而,在Makefile中直接使用`$(pwd)`可能不会自动执行该命令,因为它不是预定义的Makefile命令。通过添加`shell`关键字,Makefile指示shell去执行该命令并将其结果赋值给变量。 2. Makefile中的shell函数与反引号`"`功能类似,允许在函数内部执行外部命令。例如,`contents:=$(shell cat foo)`或`files:=$(shell echo *.c)`,这些语句会创建一个新的Shell进程来执行指定的命令,然后将输出作为函数的结果。这在生成变量时非常有用,但需要注意性能问题,因为频繁的shell函数调用可能导致性能下降。 3. 当涉及到Linux设备驱动程序的构建时,针对2.6.x内核,特别是较新的版本,构建模块不再仅仅依赖于内核头文件。由于模块需要与内核源代码中的目标文件进行链接,这就意味着开发者需要在本地环境中配置和构建完整的内核源代码树。内核源代码树(通常称为`kernel source tree`)包含了所有必要的源代码文件,包括内核模块开发所需的组件。 4. 在实际操作中,编译驱动模块时,如在Fedora 14中,Makefile可能会引导你进入特定的内核源码目录,如`/usr/src/kernels/2.6.35.12-88.fc14.i686.PAE`,这是因为编译器需要找到内核源代码才能完成模块的编译和链接过程。 掌握Makefile中使用shell函数获取环境变量如`PWD`,理解shell函数的工作原理以及如何与内核源代码树配合,对于编写驱动模块的Makefile来说是必不可少的技能。同时,理解不同内核版本对驱动模块构建的要求变化也十分重要,确保开发者能正确配置并构建出符合规范的模块。