Yocto / OpenEmbedded

一、什么是 Yocto

二、与 Buildroot 对比

特性 Buildroot Yocto
学习曲线 平缓 陡峭
配置方式 menuconfig BitBake 配方
包数量 几百 1000+
工具链支持 单一 多种并存(SDK)
量产 适合中小项目 适合大型产品
增量构建 一般 优秀(sstate)
应用 路由器、IoT 汽车、医疗、电信

三、核心概念

四、获取

git clone git://git.yoctoproject.org/poky
cd poky
git checkout kirkstone   # 当前 LTS 分支

source oe-init-build-env build

初始化:

TEMPLATECONF=meta-myvendor/conf-templates/conf-source . oe-init-build-env build

五、目录结构

poky/
├── bitbake/              构建引擎
├── documentation/
├── meta/                 OE 核心 recipes
├── meta-poky/            Poky distro
├── meta-yocto-bsp/       通用 BSP
├── meta-*                第三方 layer(openembedded.org)
├── scripts/
├── LICENSE
└── README

build/
├── conf/                 用户配置
│   ├── bblayers.conf
│   ├── local.conf
│   └── ...
├── sstate-cache/         缓存
├── tmp/
│   ├── work/             各包构建目录
│   ├── deploy/
│   │   └── images/
│   └── ...

六、关键配置文件

1. conf/local.conf

MACHINE ??= "qemuarm64"
DISTRO ?= "poky"
PACKAGE_CLASSES ?= "package_rpm"
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
SSTATE_MIRRORS ?= "file://.* https://sstate.yoctoproject.org/2.5/PATH;downloadfilename=PATH"
DL_DIR ?= "${TOPDIR}/downloads"

2. conf/bblayers.conf

BBLAYERS ?= " \
    /path/to/poky/meta \
    /path/to/poky/meta-poky \
    /path/to/poky/meta-yocto-bsp \
    /path/to/meta-myvendor \
"

七、常用命令

# 查看 machine
bitbake -l | grep ^MACHINE

# 解析 recipe
bitbake -e busybox | less
bitbake -c cleansstate busybox          # 清一个包的 sstate
bitbake -c clean busybox                # 清 build
bitbake -c devshell busybox             # 打开开发 shell
bitbake -c menuconfig linux-yocto       # 配置内核

# 构建
bitbake core-image-minimal
bitbake core-image-sato
bitbake my-custom-image

# 看依赖
bitbake -g busybox

# 生成 SDK
bitbake -c populate_sdk core-image-minimal

八、Recipe 示例

# myapp_1.0.bb
SUMMARY = "My Application"
DESCRIPTION = "My awesome application"
HOMEPAGE = "https://example.com/myapp"
LICENSE = "GPL-2.0-only"
LIC_FILES_CHKSUM = "file://COPYING;md5=..."

SRC_URI = "git://github.com/myvendor/myapp;protocol=https;branch=main"
SRCREV = "abc123def456"

inherit autotools pkgconfig systemd
# inherit cmake

DEPENDS += "libuv openssl"

EXTRA_OECONF = "--with-ssl"

SYSTEMD_SERVICE:${PN} = "myapp.service"

do_install:append() {
    install -d ${D}${sysconfdir}
    install -m 0644 ${WORKDIR}/myapp.conf ${D}${sysconfdir}/myapp.conf
}

FILES:${PN} += "${sysconfdir}/myapp.conf"

九、自定义 Layer

bitbake-layers create-layer meta-myvendor
cd meta-myvendor
mkdir -p conf/recipes-* recipes-*/myapp

十、自定义 Image

# my-custom-image.bb
require recipes-core/images/core-image-minimal.bb

IMAGE_INSTALL:append = " \
    myapp \
    openssh \
    vim \
"

IMAGE_FEATURES:append = " ssh-server-dropbear"

十一、SDK

为应用开发者生成独立工具链:

bitbake -c populate_sdk core-image-minimal
# 生成 tmp/deploy/sdk/poky-glibc-x86_64-core-image-minimal-armv7at2hf-neon-vfpv4-toolchain-3.1.20.sh

./tmp/deploy/sdk/...sh
source /opt/poky/.../environment-setup-armv7at2hf-neon-vfpv4

十二、镜像生成

ls tmp/deploy/images/<MACHINE>/
├── core-image-minimal-<machine>.ext4
├── core-image-minimal-<machine>.tar.xz
├── zImage
├── uImage
├── *.dtb
├── u-boot.bin
└── *.wic                          # 全镜像

十三、典型厂商使用

十四、debug

# 看日志
cat tmp/work/.../temp/log.do_compile

# 调试单个包
bitbake -c devshell myapp

# 看失败任务
bitbake -c cleansstate failed-task