第三章 获取源码:Git克隆Poky与目录结构解析

好,咱们进入实战环节。

上一章我们搭好了环境,现在该去拿真正的源码了。说白了,Yocto 项目的核心就是 Poky——它不是一个单独的发行版,而是一个参考构建系统。我刚开始接触时也犯过迷糊,以为 Poky 就是 Yocto 的全部。其实 Poky 更像是一个「样板间」,告诉你 Yocto 该怎么用。

3.1 用 Git 克隆 Poky

先找个干净的工作目录。我个人习惯放在 ~/yocto 下,这样好管理。

mkdir -p ~/yocto
cd ~/yocto
git clone git://git.yoctoproject.org/poky

嗯,这里要注意:如果你在公司内网,可能连不上这个地址。我曾经遇到过这种情况,后来改用 https:// 协议就好了:

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

克隆完成后,你会看到 poky 目录。进去看看:

cd poky
ls -la

你会看到一堆文件和目录。别慌,咱们一个一个来拆解。

3.2 顶层目录结构概览

先看几个关键目录:

目录/文件 作用
meta/ 核心层,包含 OE(OpenEmbedded)基础架构
meta-poky/ Poky 发行版配置层
meta-yocto-bsp/ Yocto 官方支持的板级支持包
scripts/ 各种辅助脚本
bitbake/ BitBake 构建引擎(子模块)
documentation/ 文档模板

你想想看,这就像做菜:meta/ 是锅碗瓢盆(工具),meta-poky/ 是菜谱(配置),meta-yocto-bsp/ 是特定食材(板级支持)。

3.3 深入理解 meta 层

meta/ 是最大的目录,也是 Yocto 的灵魂。进去看看:

ls meta/

你会看到:

  • classes/:各种 .bbclass 文件,相当于构建函数的「库」
  • conf/:全局配置文件,比如 bitbake.conf
  • recipes-*/:各种软件的配方(recipe)
  • files/:通用文件

我举个例子。你打开 meta/recipes-core/images/core-image-minimal.bb

# 这是一个极简镜像的配方
SUMMARY = "A small image just capable of allowing a device to boot."

IMAGE_INSTALL = "packagegroup-core-boot ${CORE_IMAGE_EXTRA_INSTALL}"

inherit core-image

看到了吗?这个配方只有几行。它继承了 core-image 类,然后指定了要安装的包组。这就是 Yocto 的威力——用最少的代码描述最复杂的事情。

核心概念:meta 层里的每个目录都对应一个「层」(Layer)。层是 Yocto 组织代码的基本单位。你可以把层想象成乐高积木——不同的层可以叠加,组合出不同的功能。

3.4 meta-poky 层

这个层定义了 Poky 发行版特有的配置。进去看看:

ls meta-poky/conf/

你会看到 distro/poky.conf。这个文件定义了发行版的名称、版本、以及一些默认策略。比如:

DISTRO = "poky"
DISTRO_NAME = "Poky (Yocto Project Reference Distro)"
DISTRO_VERSION = "4.0.3"

我刚开始做项目时,直接拿这个配置去改。结果发现很多默认选项不适合我的硬件。后来我学乖了——先理解它,再定制它。

我的经验:如果你要创建自己的发行版,建议复制 meta-poky 然后改名字,而不是直接修改原文件。这样升级 Poky 时不会冲突。

3.5 meta-yocto-bsp 层

这个层包含 Yocto 官方支持的几个板子:

  • beaglebone(TI 的 BeagleBone)
  • genericx86(通用 x86 平台)
  • edgerouter(MIPS 路由器)

每个板子目录下都有对应的机器配置文件(conf/machine/)和内核配方。比如 beaglebone-yocto.conf

#@TYPE: Machine
#@NAME: BeagleBone

require conf/machine/include/ti33x.inc

MACHINE_FEATURES = "apm usbgadget usbhost vfat ext2 screen"
KERNEL_DEVICETREE = "am335x-bone.dtb am335x-boneblack.dtb"

看到了吗?它指定了设备树文件、内核配置、以及硬件特性。这就是 Yocto 如何做到「一次配置,到处构建」的。

避坑指南:我曾经在项目中直接用了 beaglebone-yocto 的配置,结果发现它默认的 U-Boot 版本太老,导致新板子启动不了。后来我学会了——永远要检查 BSP 层是否匹配你的硬件版本。

3.6 其他重要目录

除了上面三个核心层,还有几个目录值得注意:

  • scripts/:里面有个 oe-setup-builddir 脚本,用来初始化构建目录。我每次建新项目都会用它。
  • bitbake/:这是 BitBake 引擎的源码。你不需要改它,但理解它的工作原理很有帮助。
  • documentation/:模板文件,不是真正的文档。真正的文档在 docs.yoctoproject.org

3.7 理解层(Layer)的优先级

Yocto 里有个重要概念——层优先级。每个层都有一个 layer.conf 文件,里面定义了 BBFILE_PRIORITY。数值越大,优先级越高。

比如 meta/conf/layer.conf 里:

BBFILE_PRIORITY = "5"

meta-poky/conf/layer.conf 里:

BBFILE_PRIORITY = "5"

它们优先级相同。如果你自定义一个层,建议设置更高的优先级(比如 6 或 7),这样你的配置会覆盖默认配置。

关键点:层优先级决定了当多个层提供相同配方时,哪个会被采用。优先级高的层「赢」。

3.8 实战:查看当前 Poky 版本

咱们来个小练习。查看 Poky 的版本信息:

cat meta-poky/conf/distro/poky.conf | grep DISTRO_VERSION

你会看到类似 DISTRO_VERSION = "4.0.3" 的输出。这个版本号对应 Yocto 的版本(4.0 是 Honister,4.0.3 是它的补丁版本)。

我建议你养成习惯——每次开始新项目前,先确认 Poky 版本。不同版本之间 API 可能有变化,踩过坑的人都知道。

3.9 本章小结

好,咱们捋一下今天的内容:

  1. git clone 拿到了 Poky 源码
  2. 理解了三个核心层:meta(基础)、meta-poky(发行版)、meta-yocto-bsp(板级支持)
  3. 知道了层优先级的概念
  4. 做了个小练习——查看版本号

下一章,我们会用这些源码真正构建一个镜像。到时候你会看到,这些目录结构是如何在构建过程中发挥作用的。

嗯,今天就到这里。记得动手敲一遍命令,光看是学不会的。