3、源码获取:Poky源码仓库、分支选择策略、git clone与fetch、源码目录结构解析

好,咱们进入第三章。源码获取,这是动手搭建Yocto环境的第一步。说实话,这一步看似简单,但坑不少。我见过太多新手一上来就git clone,结果拉了个巨无霸下来,磁盘爆了,或者分支选错,编译到一半报错,心态直接崩了。

这一章,我就带你把这步走稳。咱们聊聊Poky仓库到底是什么,分支怎么选,怎么高效拉代码,以及拉下来后那一堆文件夹都是干嘛的。

3.1 Poky源码仓库:它到底是什么?

先搞清楚一个概念。Poky不是Yocto的全部,但它是Yocto项目的参考构建系统。说白了,Poky = BitBake + OpenEmbedded-Core + 一些元数据。你把它拉下来,就能直接开始做嵌入式Linux的构建。

官方仓库地址是:git://git.yoctoproject.org/poky。我个人习惯用这个,稳定可靠。当然,你也可以用GitHub上的镜像,但官方源永远是第一选择。

核心要点:Poky是Yocto的“最小可运行集合”。你不需要把所有meta层都拉下来,先搞定Poky,后面再按需添加。

3.2 分支选择策略:别选错了,否则白干

分支选择,嗯,这里要重点说。Yocto每半年发一个大版本,比如kirkstonelangdalemickledore。每个版本对应一个稳定分支。

我建议你遵循这个原则:选最新的LTS(长期支持)版本。比如现在,kirkstone是LTS,支持周期长,社区活跃,遇到问题容易搜到答案。

为什么不要选master

  • master是开发分支,今天能编译,明天可能就挂了。
  • 我在项目中吃过这个亏。有一次为了尝鲜,用了master,结果一个关键recipe改了依赖,整个构建链断了,排查了两天。

分支命名规则很简单:

  • 稳定分支:kirkstonelangdale,直接是版本代号。
  • 开发分支:master,天天变。
  • 标签:yocto-4.0.3,对应某个具体发布版本。

我的建议:如果你是做产品,用LTS分支。如果你是学习,用最新的非LTS稳定分支也行,但别用master。

3.3 git clone与fetch:怎么拉才快?

好,分支选好了,接下来就是拉代码。这里有两个常用操作:git clonegit fetch

第一次拉取:用git clone

我最常用的命令是:

git clone -b kirkstone git://git.yoctoproject.org/poky

这个命令做了两件事:拉取整个仓库,然后自动切换到kirkstone分支。注意,这里有个坑——Poky仓库历史很庞大,直接clone会下载全部历史,很慢。

怎么加速?加个--depth 1参数:

git clone -b kirkstone --depth 1 git://git.yoctoproject.org/poky

--depth 1表示只拉取最近一次提交,不拉历史。这样速度快很多,磁盘占用也小。我平时做项目,除非需要查历史,否则都用这个。

后续更新:用git fetch

仓库拉下来后,过段时间想更新,不要再用clone了。用fetch:

cd poky
git fetch --all
git reset --hard origin/kirkstone

这样只会拉取增量更新,速度快得多。我曾经见过有人每次更新都重新clone,磁盘空间浪费不说,还慢得要命。

注意:如果你用了--depth 1,后续fetch时可能无法直接切换到其他分支。如果需要切换分支,建议不要加--depth,或者用git fetch --unshallow补全历史。

3.4 源码目录结构解析:拉下来后,里面都有啥?

代码拉下来了,咱们看看里面都有什么。我列一下核心目录,你心里有个数。

目录/文件 作用
bitbake/ BitBake构建引擎,Yocto的大脑。负责解析recipe、调度任务。
meta/ OpenEmbedded-Core核心层。包含基础recipe、类文件、配置文件。
meta-poky/ Poky发行版配置层。定义了Poky这个发行版的默认策略。
meta-yocto-bsp/ Yocto官方支持的板级支持包(BSP)。比如qemu模拟器、一些开发板。
scripts/ 辅助脚本。比如oe-init-build-env,用来初始化构建环境。
documentation/ 文档源码。如果你要自己编译Yocto手册,这里就是源文件。
LICENSE 许可证文件。Yocto是开源项目,遵守MIT许可证。
README 自述文件。告诉你如何开始。

这里面,meta/目录是最核心的。你想想看,所有软件包的编译规则、依赖关系,都在这里。我刚开始学Yocto时,最喜欢翻meta/recipes-core/下面的recipe,看看一个软件包是怎么被“描述”出来的。

bitbake/目录也很重要。它本身是一个独立的Python项目,Yocto只是把它集成进来。如果你对构建系统本身感兴趣,可以看看里面的代码。

一句话总结:Poky仓库 = 构建引擎(bitbake) + 核心元数据(meta) + 发行版配置(meta-poky) + 板级支持(meta-yocto-bsp)。

3.5 避坑指南:我踩过的几个坑

最后,分享几个我实际遇到的坑,你遇到了别慌。

  • 坑一:磁盘空间不足。Poky仓库完整clone大概1.5GB左右,但构建过程中会下载源码包、生成临时文件,轻松吃掉几十GB。建议预留至少50GB空间。
  • 坑二:网络超时。国内拉取git://协议有时会慢。可以用https://协议替代,或者配置代理。我一般用https://git.yoctoproject.org/git/poky作为备选。
  • 坑三:分支混乱。我曾经同时维护两个项目,一个用kirkstone,一个用langdale。结果不小心在kirkstone目录下执行了git pull origin langdale,导致分支错乱。建议每个项目单独clone一份Poky,不要共用。

嗯,源码获取这块,说难不难,但细节决定成败。你按照我上面说的做,基本不会出大问题。下一章,咱们聊聊构建环境的初始化,那一步也有不少门道。