4、获取Yocto源码:下载Poky、meta-rockchip、meta-openembedded等层、Repo工具使用、分支选择策略

好,咱们正式开始动手。前面几章把概念和工具链理清了,现在要真刀真枪地把Yocto环境搭起来。这一步说白了就是「拉代码」——但拉什么、从哪拉、拉哪个分支,这里头门道不少。我刚开始接触Yocto时,觉得不就是git clone嘛,结果分支没选对,编译到一半报错,折腾了两天才发现是版本不匹配。嗯,咱们今天就把这事彻底讲明白。

4.1 核心组件:Poky、meta-rockchip、meta-openembedded

Yocto项目本身不是一个单体仓库,它是由一堆「层」(Layer)组成的。咱们做Rockchip平台,至少需要三个核心组件:

组件 作用 来源
Poky Yocto参考发行版,包含BitBake构建引擎、OpenEmbedded-Core元数据、基础配方 git://git.yoctoproject.org/poky
meta-rockchip Rockchip SoC的板级支持层,包含芯片配置、U-Boot、内核、设备树 git://git.yoctoproject.org/meta-rockchip
meta-openembedded OpenEmbedded社区维护的扩展层,提供大量软件包配方(网络、多媒体、文件系统工具等) git://git.openembedded.org/meta-openembedded

关键理解:Poky是骨架,meta-rockchip是Rockchip的「身份证」,meta-openembedded是软件仓库。缺了任何一个,你的Rockchip Linux都跑不起来。

4.2 Repo工具:管理多仓库的瑞士军刀

你想想看,一个完整的Yocto项目可能要拉5~10个层。手动git clone每个仓库,还要记住它们的分支对应关系,太容易出错了。Google为Android开发的Repo工具正好解决这个问题——它用一个manifest文件统一管理多个git仓库的版本和分支。

4.2.1 安装Repo

我个人习惯把Repo放在用户目录下,方便全局调用:

mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

小提示:建议把 export PATH=~/bin:$PATH 加到 ~/.bashrc 或 ~/.zshrc 里,这样每次打开终端就不用重新设置了。

4.2.2 创建manifest文件

Repo通过一个XML文件告诉它「拉哪些仓库、用什么分支」。咱们为Rockchip项目创建一个:

mkdir rk3588-yocto && cd rk3588-yocto
cat > default.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
    <remote name="yocto" fetch="git://git.yoctoproject.org" />
    <remote name="oe" fetch="git://git.openembedded.org" />

    <project name="poky" remote="yocto" revision="kirkstone" />
    <project name="meta-rockchip" remote="yocto" revision="kirkstone" />
    <project name="meta-openembedded" remote="oe" revision="kirkstone" />
</manifest>
EOF

4.2.3 同步代码

一条命令搞定所有仓库的拉取:

repo init -u . -m default.xml
repo sync -j4

-j4 表示用4个线程并行下载,网络好的话可以改成 -j8 甚至 -j16。我在项目中遇到过网络不稳定的情况,这时候加个 --fail-fast 参数,一旦某个仓库失败就立即停止,方便排查问题。

注意:Repo同步时如果中途中断,重新执行 repo sync 会从断点继续,不会从头开始。但如果你改了本地文件,可能会冲突,建议先 git stash 再同步。

4.3 分支选择策略:别踩版本不匹配的坑

分支选错了,编译到一半报错是家常便饭。我曾经因为Poky用了kirkstone,meta-rockchip却用了dunfell,结果U-Boot编译不过,查了两天才发现是API不兼容。所以分支选择一定要遵循一个原则:所有层的分支必须对齐。

4.3.1 Yocto长期支持版本(LTS)

Yocto每两年发布一个LTS版本,推荐用于产品开发:

Yocto版本 代号 发布时间 支持周期
3.1 Dunfell 2020年4月 2年(已结束)
4.0 Kirkstone 2022年4月 4年(推荐)
5.0 Scarthgap 2024年4月 4年(最新)

我的建议:2025年做Rockchip项目,首选Kirkstone(4.0)或Scarthgap(5.0)。Dunfell已经EOL了,别用了。如果你做的是量产产品,Kirkstone更稳妥,社区验证充分;如果追求新特性,Scarthgap也可以,但meta-rockchip对它的支持可能还在完善中。

4.3.2 分支对齐检查清单

每次拉代码前,按这个清单检查一遍:

  1. Poky分支:确认使用LTS分支(如kirkstone)
  2. meta-rockchip分支:必须与Poky分支一致(如kirkstone)
  3. meta-openembedded分支:同样对齐(如kirkstone)
  4. 其他层:如果有meta-qt5、meta-python等,也要检查分支

说白了,所有层的 revision 字段必须指向同一个Yocto版本代号。不一致?等着编译报错吧。

4.4 知识结构图:Yocto源码获取流程

下面这张图把整个流程串起来了,从安装Repo到同步完成,每一步都清晰可见:

Yocto源码获取流程 安装Repo工具 创建Manifest文件 repo init 初始化 repo sync 同步代码 检查分支是否对齐 ✅ 源码获取完成 关键提醒 • 所有层分支必须对齐 • 推荐Kirkstone或Scarthgap • repo sync支持断点续传 分支选择策略 1. 确定Yocto LTS版本 2. 所有层使用同一代号 3. 检查meta-rockchip支持 4. 避免混用不同版本

4.5 实战:完整拉取Rockchip Yocto源码

咱们以RK3588为例,完整走一遍流程。假设你用的是Kirkstone分支:

# 1. 创建工作目录
mkdir ~/rk3588-yocto-kirkstone
cd ~/rk3588-yocto-kirkstone

# 2. 初始化Repo(使用本地manifest)
cat > default.xml << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
    <remote name="yocto" fetch="git://git.yoctoproject.org" />
    <remote name="oe" fetch="git://git.openembedded.org" />
    <project name="poky" remote="yocto" revision="kirkstone" />
    <project name="meta-rockchip" remote="yocto" revision="kirkstone" />
    <project name="meta-openembedded" remote="oe" revision="kirkstone" />
</manifest>
EOF

repo init -u . -m default.xml

# 3. 同步代码(耐心等待,第一次会比较慢)
repo sync -j4 --fail-fast

# 4. 验证分支
cd poky
git branch -a | grep kirkstone
cd ..

cd meta-rockchip
git branch -a | grep kirkstone
cd ..

cd meta-openembedded
git branch -a | grep kirkstone
cd ..

小技巧:如果网络慢,可以用 git clone --depth=1 只拉最新提交,但Repo不支持直接加这个参数。替代方案是同步完成后,在每个仓库里执行 git fetch --unshallow 补全历史。

4.6 常见问题与避坑

  • repo init报错「fatal: Not a git repository」:检查当前目录是否为空,Repo需要在空目录或已初始化的Repo工作区执行。
  • repo sync卡住不动:网络问题。试试 repo sync -j1 单线程下载,或者换个时间段再试。
  • 分支不匹配导致编译失败:这是最常见的坑。我曾经在meta-rockchip的kirkstone分支下,误用了Poky的dunfell分支,结果BitBake直接报错说找不到某些类文件。解决方案:统一所有层的分支。
  • meta-rockchip不支持最新Yocto版本:Rockchip官方对Yocto的支持通常滞后半年到一年。如果Scarthgap刚发布,meta-rockchip可能还没适配。这时候要么等,要么用Kirkstone。

重要提醒:不要在生产项目中混用不同Yocto版本的层。即使编译通过了,运行时也可能出现诡异的兼容性问题。分支对齐是Yocto开发的铁律。

好,源码拉下来了,目录结构应该是这样的:

~/rk3588-yocto-kirkstone/
├── poky/               # 核心构建系统
├── meta-rockchip/      # Rockchip板级支持
├── meta-openembedded/  # 扩展软件包
├── default.xml         # Repo manifest文件
└── .repo/              # Repo内部管理目录