首页 理论教育 Linux内核驱动开发实例:内核Makefile

Linux内核驱动开发实例:内核Makefile

时间:2026-01-26 理论教育 小谭同学 版权反馈
【摘要】:Linux内核的Makefile分为4个组成部分:顶层Makefile:在内核代码最顶层。顶层的Makefile文件读取.config文件的内容,并总体上负责build内核和模块。arch目录的Makefile提供了硬件体系结构相关的编译信息。Scripts目录下的Makefile文件包含了所有用来根据kbuild Makefile构建内核所需的定义和规则。kbuild Makefile文件:在各级目录下面。kbuild Makefile的语法结构非常简单,主要包括以下几点核心内容:1)目标定义目标定义就是用来定义哪些内容要作为模块编译,哪些内容要编译链接进内核。

Linux内核的Makefile分为4个组成部分:

(1)顶层Makefile:在内核代码最顶层。顶层的Makefile文件读取.config文件的内容,并总体上负责build内核和模块。arch目录的Makefile提供了硬件体系结构相关的编译信息。Scripts目录下的Makefile文件包含了所有用来根据kbuild Makefile构建内核所需的定义和规则。

(2)config配置文件:内核的配置文件,一般在/arch/*/configs下面。

(3)Makefile的通用规则:在scripts/目录下的Makefile.*文件中。

(4)kbuild Makefile文件:在各级目录下面。

kbuild Makefile的语法结构非常简单,主要包括以下几点核心内容:

1)目标定义

目标定义就是用来定义哪些内容要作为模块编译,哪些内容要编译链接进内核。例如:

obj-y+=foo.o

它表示要由foo.c或者foo.s文件编译得到foo.o并链接进内核。如果使用$(obj-m)则表示对象文件编译成可加载的内核模块。kbuild Makefile文件中的目标通常是下面的形式:

obj-$(CONFIG_I2C_BOARDINFO)+=i2c-boardinfo.o(https://www.xing528.com)

obj-$(CONFIG_I2C)+=i2c-core.o

obj-$(CONFIG_I2C_CHARDEV)+=i2c-dev.o

上面的语句告诉编译器编译选项对应的目标文件。

2)多文件模块的定义

如果一个模块由多个文件组成,则采用模块名加-objs后缀或者-y后缀的形式来定义模块的组成文件。例如:

上例中目标模块名为fb,它依赖于fbmem.o、fbmon.o、fbcmap.o、fbsysfs.o、modedb.o、fbcvt.o等文件,这些文件最终链接生成fb.ko文件。上面的斜杠\表示换行。

3)目录迭代

目录迭代是将目标依赖的文件指向另一个目录。

obj-$(CONFIG_FB_OMAP)+=omap/

如果CONFIG_FB_OMAP的值为y或m,kbuild会将omap目录列入向下迭代的目标中,但是其作用也仅限于此,至于omap目录下的文件是要作为模块编译还是链接入内核,还要由omap目录下的Makefile文件的内容来决定。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈