Linux内核Makefile obj-y & obj-m

嘿,内核开发的朋友们,今天咱们来聊聊Linux内核构建过程中的那点事儿。
内核源代码里头,每个子目录里都有个Makefile,它们就像是一家人,通过主目录里的Rule.make文件紧密相连。
在这些Makefile里,有两个超级重要的概念:obj-y和obj-m。
简单说,obj-y是告诉内核哪些文件要被编译进内核本身,而obj-m则是用来把那些文件打造成模块的。

obj-y就像是一个大家庭,把所有需要编译进内核的文件聚在一起,通过O_TARGET和L_TARGET这两个变量,它们会被串联成一个个特定的目标文件,或者合并成一个库文件。
obj-m呢,它负责的是另一批文件,这些文件会被编译成模块。

除了这两个核心概念,Makefile里还有subdir-y和subdir-m,它们是用来处理子目录的特殊需求的。
比如,“obj-$(CONFIG_BINFMT_ELF)+=binfmt_elf.o”这样的语句,就能自动把文件名加入到集合里,还能通过条件语句来制定更复杂的编译策略。

Rule.make文件里,make命令会利用subdir-y和subdir-m来处理子目录的Makefile,生成子任务,并设置起始目录。
mod-subdirs变量则用来识别模块子目录,让构建过程变得更简单。

顶层的Makefile和Makefile.build是构建流程的大脑,顶层Makefile负责设置全局参数,比如工具链前缀和编译参数,而Makefile.build则负责把各个目录的文件编译成built-in.o文件。
子目录的Makefile会根据具体情况添加额外的编译选项。

构建流程大致分为六步:创建Makefile和Makefile.build,确定编译文件,设置编译和链接选项,指定工具链,命名最终程序,最后执行构建和清理命令。

这篇文章就是想让大家对Linux内核下的Makefile有个基本的了解。
下期我们会深入探讨obj-m的用法,特别是它和file_operations文件操作结构体的关系。
希望这篇文章能帮到你们,也期待大家继续分享关于内核的知识!

如何在linux下写makefile

Make这个工具啊,说白了就是靠makefile这个文件来搞清楚各个源文件之间怎么关联,然后自动搞定编译这些事儿。
makefile这玩意儿得按规矩写,里面得说清楚怎么编译每个源文件,怎么连起来生成可执行文件,还得定义好源文件之间的依赖。
make命令的选项和参数什么的也挺重要的。

makefile文件呢,基本上就是由一堆依赖关系和规则组成的。
每个依赖关系呢,就是一个目标(也就是要生成的文件),然后是一堆这个目标所依赖的源文件。
举个例子,比如目标a.out依赖于main.o,而main.o又依赖于main.c和main.h。
所以你看,如果main.c或者main.h改了,那整个程序就得重新编译。
如果你想一次性创建多个目标文件,可以直接把目标写成all,不过要注意,要是没指定all目标,make命令只会创建makefile文件里第一个目标。

规则嘛,就是定义怎么创建目标的。
记住啊,规则那一行必须用制表符tab开头。
下面就是一个简单的例子:make命令会自己判断文件的顺序,然后用规则创建相应的文件,并且显示在屏幕上。
如果你编译了好几次,make命令会读取makefile文件,然后确定重建目标的最少命令,不会重复编译。

makefile文件里的注释啊,都是以开头的,一直到底。
另外,makefile文件里也可以定义宏,或者在make命令的命令行里定义,不过要是用文件外部的定义,最好不要用空格。
大概就是这样吧。

Sublime怎么运行Makefile项目_配置make命令构建系统教程

亲爱的小伙伴们,想要在SublimeText里顺畅地运行Makefile项目吗?那就得自定义一下构建系统,调用make命令啦!下面我给大家详细讲解一下操作步骤:
首先,得确保你的系统里已经安装了make。
怎么检查呢?Linux和macOS用户,打开终端,敲下make --version,看到版本号就说明安装好了。
Windows用户,在命令提示符或PowerShell里运行make --version。
要是没装,推荐用MinGW或WSL来安装。

接下来,创建一个自定义构建系统。
在SublimeText里,点击“工具”菜单,找到“构建系统”,然后选择“新建构建系统…”。
把默认的JSON内容替换成这个配置:{ "cmd": ["make"], "working_dir": "$file_path", "selector": "source.makefile", "file_regex": "^(...?):([0-9 ]+):([0-9 ]+):s+(.)$" }。
这个配置里,“cmd”是运行make命令,“working_dir”是设置工作目录,“selector”是关联Makefile语法,“file_regex”是解析错误输出的(可选的)。
保存文件时,记得叫它Makefile.sublime-build,默认路径在Packages/User/。

然后,得指定工作目录。
系统会自动获取当前打开文件的目录,所以确保打开的是项目里的Makefile文件。
要是想手动指定,就把working_dir改成绝对路径。

选好构建系统后,就可以运行构建了。
打开Makefile文件,按Ctrl+B(Windows/Linux)或Cmd+B(macOS),结果就会在SublimeText底部的面板里显示出来。

要是Makefile里有很多目标(比如clean、debug),还可以通过修改配置来支持它们。
比如,创建一个独立的配置文件,复制Makefile.sublime-build,改名叫Makefile-Clean.sublime-build,然后把cmd字段修改成["make", "clean"],这样就可以运行清理操作了。
还可以更高级一点,用变量来动态传递目标。

遇到问题怎么办?比如make命令找不到,那就检查一下系统里有没有安装make,还有环境变量里有没有包含make的路径。
路径错误,就确保working_dir指向了Makefile所在的目录,或者手动指定绝对路径。
目标没执行,那得检查Makefile里有没有这个目标,并且语法要对。

总之,按照这些步骤来,SublimeText就能高效地运行你的Makefile项目了。
这招对大多数C/C++项目都适用,而且还能灵活扩展到其他编译场景哦!