A. Linux内核Makefile obj-y & obj-m
Linux内核下的Makefile是构建过程的关键组成部分,它位于内核源代码的各个子目录中,并通过嵌入主目录的Rule.make文件相互关联。在这些Makefile中,两个核心概念是obj-y和obj-m,分别用于指定需要编译进内核的.o文件和将这些文件编译为模块。
obj-y表示需要编译进内核的目标文件集合,通过定义变量O_TARGET将这些文件连接为一个特定名的目标文件,定义L_TARGET则将这些文件合并为库文件。同样,obj-m用于标识需要编译为模块的目标文件集合。
除了obj-y和obj-m,Makefile还提供了subdir-y和subdir-m来处理子目录的特定需求。例如,使用"obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o"和"subdir-$(CONFIG_EXT2_FS) += ext2"这样的语句自动为集合添加文件名,同时通过条件语句实现更复杂的编译策略。
在Rule.make文件中,make通过subdir-y和subdir-m处理子目录的Makefile,生成子make任务并设定起始目录参数。mod-subdirs变量用于识别模块子目录,进一步简化了构建过程。
顶层目录的Makefile和Makefile.build共同构建了构建流程的核心。顶层目录的Makefile负责定义全局构建参数,如工具链前缀、编译参数等。Makefile.build则负责将各个目录及其子目录中的文件编译为built-in.o文件。各级子目录的Makefile则根据特定需求定义额外的编译选项。
构建流程主要分为六个步骤:在顶层目录创建Makefile和Makefile.build,修改obj-y和相关变量以确定编译文件,调整CFLAGS和LDFLAGS以设置编译和链接选项,配置CROSS_COMPILE以指定工具链,设定TARGET以命名最终程序,最后执行make、make clean或make distclean进行构建和清理。
本文旨在介绍Linux内核下Makefile的使用和结构,下一期将更深入探讨obj-m的用法,特别是与file_operations文件操作结构体相关的内容。希望读者能够从本文中获得对内核构建流程的基本理解,并期待更多关于内核学习的分享。