别再满世界找源码了,Yocto 配置内核路径的三种姿势
点击↑深色口袋物联,选择关注公众号,获取更多内容,不迷路

做为BSP 的新人,十有八九被 Yocto 的源码管理绕晕过。
明明只想改个驱动,却发现编译用的内核源码不知藏身何处。好不容易在 tmp/work 目录下翻到了,改完一清理,代码没了。
或者更惨,厂商丢给一个几十 GB 的内核压缩包,让基于这个开发。折腾了半天,愣是不知道怎么让 Yocto 识别它,只能傻傻地每次手动解压、手动覆盖。
这就是典型的“路径焦虑”。
Yocto 其实是个很听话的管家,问题在于你得用它的语言告诉它:内核源码到底在哪。
今天就把平时工作中,配置内核源码路径的几种常用方法总结下。弄懂了这个,就掌握了 Yocto 开发的“钥匙”,以后就可以随时更换内核版本,对比测试!

方法一:标准流 —— 指定下载地址(SRC_URI)
这是最正规、最推荐的做法。适用于源码在远程 Git 仓库,或者已经打好 补丁patch 的标准包。
概述: 通过修改 Recipe 文件(.bb 或 .bbappend),直接告诉 Yocto 去哪里下载代码。Yocto 会自动管理下载、解压、打补丁的全过程。
关键步骤:
-
1. 找到 Recipe。 找到内核的配方文件,通常在 meta-xxx/recipes-kernel/linux/下。 -
2. 修改 SRC_URI。 如果是 Git 仓库: SRC_URI = "git://git.server.com/linux-kernel.git;protocol=git;branch=${KBRANCH}"如果是本地压缩包(厂商给的):SRC_URI = "file:///home/user/kernel-src.tar.gz" -
3. 设置版本号。 别忘了设置 SRCREV(针对 Git)或者PV(针对压缩包),否则 Yocto 不知道版本,编译会报错。

优缺点:
-
• 优点: 规范。源码来源清晰,团队成员拉取代码后,编译环境完全一致。适合最终发布。 -
• 缺点: 稍显繁琐。如果是 Git 仓库,每次改动代码都要 Commit 生成 Patch 才能被 Yocto 识别;如果是压缩包,每次更新都要重新打包。
方法二:开发流 —— 外部源码构建(externalsrc)
开发调试阶段,要的是快速。改一行代码提交 Commit 一次,谁受得了?
这时候,externalsrc 类就是救命稻草。
概述: 这种方法的本质是告诉 Yocto:“别下载了,也别解压了,编译的时候直接去指定的文件夹拿源码。”
关键步骤:
-
1. 创建 bbappend。 在sdk的 Layer 里,给内核创建一个 .bbappend文件。 -
2. 继承类并指定路径。 写入以下内容: inherit externalsrc
EXTERNALSRC = "/home/user/my-kernel-source"
EXTERNALSRC_BUILD = "/home/user/my-kernel-source"注意:
EXTERNALSRC是源码路径,EXTERNALSRC_BUILD是编译路径。为了方便,通常设成同一个。 -
3. 直接编译。
配置好后,执行 bitbake virtual/kernel,Yocto 就会直接编译指定的那个文件夹里的代码。

优缺点:
-
• 优点: 极速。改完代码直接编译,不需要 Commit,不需要打包。配合 IDE 阅读代码非常爽。 -
• 缺点: 破坏了构建的可复现性。如果别人的机器上没有这个路径,或者路径不一样,编译直接挂掉。切记:开发调试用,发版前切回去。
方法三:本地流 —— 指向本地 Git 仓库
有时候如果不想用 externalsrc,但又想用本地的 Git 目录。这有点折中。
概述: 利用 Yocto 的 Fetcher 机制,支持 file:// 协议指向本地的 Git 仓库。Yocto 会把它当成一个远程仓库来处理,但实际是在本地操作。
关键步骤:
-
1. 修改 SRC_URI。 在 .bbappend里配置:SRC_URI = "git:///home/user/my-local-kernel;protocol=file;branch=master"注意那个git://后面跟了三个斜杠,表示本地绝对路径。 -
2. 管理分支。 确保本地的分支(比如 master)是正确的,且 SRCREV指向的 Commit ID 存在。

优缺点:
-
• 优点: 兼顾了标准流程和本地开发。Yocto 会帮助管理 Patch 应用流程,比 externalsrc更符合构建逻辑。 -
• 缺点: 路径依赖重。需要在本地维护好这个 Git 仓库。而且每次源码变动,Yocto 可能会重新做解压拷贝动作,速度不如 externalsrc快。
最后想说
配置源码路径,本质上是解决“代码在哪”和“怎么拿”的问题。
新人最容易犯的错,就是在 tmp/work 的临时目录里改代码,那是 Yocto 的“地盘”,不是开发者的工作区,只属于Yocto的bitbake。
用 SRC_URI 管发布,用 externalsrc 搞开发,这才是 BSP 工程师的成熟标志。
下次拿到厂商的 SDK 包,别再一头雾水地乱改了,先想想该用哪种姿势把它接入 Yocto。

你最头疼的 Yocto 配置是哪个环节?是github网络下载太慢,还是 Patch 打不上?评论区聊聊。
夜雨聆风