3、获取Yocto源码:下载Poky参考发行版、理解源码目录结构、选择稳定分支、首次构建前的检查清单

好,咱们正式开始动手了。这一章要解决一个最基础的问题——源码从哪来,怎么选,拿到手之后长什么样。很多新手一上来就 git clone,结果拉了个 master 分支,编译到一半发现依赖全对不上,心态直接崩了。我当年也干过这事,所以这一章咱们把话说清楚。

3.1 下载Poky参考发行版

Poky 是什么?说白了,它是 Yocto 官方提供的一个参考发行版。它不是产品级的系统,但包含了 Yocto 最核心的构建框架、BitBake 工具链、以及一堆常用元数据。你拿它来学习、做原型验证,完全够用。

下载方式很简单,用 git 就行:

git clone git://git.yoctoproject.org/poky
cd poky

嗯,这里要注意:不要直接 clone master 分支。master 是开发分支,天天在变,依赖的软件包版本可能还没稳定。我建议你 clone 完之后立刻切到一个稳定分支。

我的习惯:我会先看一眼 Yocto 官网的 Release 页面,确认当前最新的 LTS 版本号,然后再去 clone。这样能避免很多不必要的麻烦。

3.2 理解源码目录结构

Poky 拉下来之后,你会看到一堆目录。别慌,咱们挑几个核心的讲:

目录/文件 作用
bitbake/ BitBake 构建引擎的源码。Yocto 的灵魂就在这里。
meta/ 核心元数据层。包含 OE-Core 的基础配方、类和配置文件。
meta-poky/ Poky 发行版的特定配置。比如默认的 DISTRO 设置。
meta-yocto-bsp/ 官方支持的板级支持包(BSP)。比如 QEMU 模拟器、BeagleBone 等。
scripts/ 一些辅助脚本,比如 oe-init-build-env 就在这里面。
oe-init-build-env 环境初始化脚本。每次构建前都要 source 它。

你想想看,整个 Yocto 项目其实就是一堆 层(Layer) 的堆叠。Poky 本身包含了三个核心层:metameta-pokymeta-yocto-bsp。以后你加自己的东西,就是再加一层。

核心概念:Yocto 的构建系统是「层叠式」的。上层可以覆盖下层的配置和配方。这个设计非常灵活,但也容易搞乱——我曾经因为层顺序搞反,导致一个补丁死活打不上,查了两天才发现是层优先级的问题。

3.3 选择稳定分支

分支怎么选?我直接给结论:

  • 学习用:选最新的 LTS 分支。比如 kirkstone(4.0)、dunfell(3.1)。LTS 分支维护周期长,社区支持好。
  • 产品开发:选一个你确认能用的 LTS 分支,不要追新。我见过有人用 master 做产品,结果三个月后某个关键包升级了 API,整个构建链全断。
  • 尝鲜:可以试试 styhead 这类非 LTS 分支,但别指望它稳定。

切换分支的命令:

git checkout -b kirkstone origin/kirkstone

嗯,这里有个小坑:分支名要写全。比如 kirkstone 不是 kirkstone-4.0,也不是 kirkstone-lts。直接看 git branch -a 列出来的名字,复制粘贴最保险。

避坑指南:我曾经在切换分支后忘了更新子模块,结果编译时提示找不到某个 .bb 文件。记得跑一下 git submodule update --init --recursive,把子模块也切到对应版本。

3.4 首次构建前的检查清单

好,源码有了,分支切好了。别急着敲 bitbake core-image-minimal,先过一遍检查清单。我每次搭建新环境都会走一遍这个流程,省得后面出幺蛾子。

  1. 检查系统依赖:Yocto 需要一堆宿主机的包。Ubuntu 上跑 sudo apt-get install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev。不同发行版略有差异,但核心就是这些。
  2. 检查磁盘空间:至少留 50GB 空闲。我第一次构建 core-image-sato 时,以为 20GB 够了,结果编译到一半磁盘满了,整个构建目录废掉,得重来。
  3. 检查网络:Yocto 构建时会从网上下载大量源码包。确保你的网络能访问 git://https:// 源。如果在内网,提前配好代理或本地镜像。
  4. 检查 Python 版本:Yocto 4.0 要求 Python 3.8+。用 python3 --version 确认一下。太老的版本会导致 BitBake 解析失败。
  5. 检查构建用户:不要用 root 用户构建。Yocto 官方明确说不支持 root 构建,因为某些任务会检查文件权限。我见过有人用 root 构建,结果生成的 rootfs 权限全乱套。
  6. 初始化构建环境:在 poky 目录下执行 source oe-init-build-env。这会创建一个 build 目录,并设置好环境变量。之后你的所有操作都在这个 build 目录下进行。
我的经验:第一次构建时,建议先跑 bitbake core-image-minimal。这个目标最小,只包含一个能启动的 Linux 系统,没有图形界面。编译时间大概 30 分钟到 1 小时(取决于机器性能)。如果这个能过,说明你的环境基本没问题。

嗯,检查清单走完,你就可以放心地开始第一次构建了。记住:Yocto 构建不是一次性的,你后面会反复修改配方、添加层、调整配置。每次改动后,都回头看一眼这个清单,尤其是磁盘空间和网络——这两样最容易出问题。

下一章,咱们就正式跑第一个构建命令,看看 Yocto 到底是怎么把一堆源码变成嵌入式 Linux 系统的。