PAYATHON 2026

如何在 Yocto devshell 中增量编译 Raspberry Pi 内核?

数据小许

结论

可以在 linux-raspberrypi 的 devshell 中调用内核构建命令。构建时应沿用配方设置的源码目录、构建目录和编译参数。Raspberry Pi OS 使用的 ARCH、CROSS_COMPILE 和默认输出路径可能与配方不同。沿用原构建目录后,make 仍可判断哪些目标需要重建。

在 devshell 中构建

先进入配方的开发 shell:

bitbake -c devshell linux-raspberrypi

在 shell 中查看配方使用的源码目录和构建目录:

printf 'S=%s\nB=%s\n' "$S" "$B"

Yocto 配方通常会使用独立的构建目录。请以配方实际执行的 do_compile 命令为准,确认是否传入了 O=${B}、ARCH、交叉编译器及其他参数。可以查看构建目录中的 BitBake 任务脚本,核对实际调用:

# 在构建目录中执行;路径按当前 Yocto 构建环境调整
sed -n '1,240p' tmp/work/*/linux-raspberrypi/*/temp/run.do_compile

然后在 devshell 中使用相同参数调用 oe_runmake。例如,若任务脚本确认源码目录为 $S、输出目录为 $B,且目标与配置相符,可以按实际参数执行:

oe_runmake -C "$S" O="$B" Image modules dtbs

如果任务脚本还传入了 ARCH、CROSS_COMPILE 或其他参数,也应一并补齐。不同 Yocto 分支、内核配方和机器配置使用的变量可能不同,因此不要默认该配方使用 aarch64-linux-gnu- 作为交叉编译器前缀。若 devshell 中的 make dtbs 已成功,也可以在相同环境下构建其他目标;先确认所用构建目录与配方任务一致。

让 BitBake 执行编译任务

如果改动已在配方源码目录中,可以退出 devshell,让 BitBake 重新运行编译任务:

bitbake -f -c compile linux-raspberrypi

强制执行任务不会清空构建目录。只要任务继续使用原来的构建目录,内核构建系统仍会根据依赖关系决定哪些目标需要重编。若后续任务需要使用新产物,可按项目的构建流程继续执行部署或镜像构建任务。

使用产物时注意

手动复制 Image、DTB 和 modules 时,应从实际的 $B 和配方部署目录确定文件路径。Raspberry Pi OS 源码树中的路径未必适用于这里。还要确认内核配置、模块版本,以及目标板所需的设备树和 overlays 相匹配。直接运行 make modules_install 时,应明确指定安装位置,避免模块被装到错误的 rootfs。

如果要稳定维护内核源码改动,可以考虑使用 devtool modify linux-raspberrypi 管理配方源码工作区,再通过 BitBake 构建。这样更容易保留改动,也能避免直接修改临时 workdir。

备注:内容仅供参考。