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 分支对齐检查清单
每次拉代码前,按这个清单检查一遍:
- Poky分支:确认使用LTS分支(如kirkstone)
- meta-rockchip分支:必须与Poky分支一致(如kirkstone)
- meta-openembedded分支:同样对齐(如kirkstone)
- 其他层:如果有meta-qt5、meta-python等,也要检查分支
说白了,所有层的 revision 字段必须指向同一个Yocto版本代号。不一致?等着编译报错吧。
4.4 知识结构图:Yocto源码获取流程
下面这张图把整个流程串起来了,从安装Repo到同步完成,每一步都清晰可见:
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内部管理目录