Yocto构建系统
Yocto介绍
官方介绍如下:
The Yocto Project is an open source collaboration project that provides templates, tools and methods to help you create custom Linux-based systems for embedded products regardless of the hardware architecture.
Yocto Project 是一个开源协作项目,它提供了一些模板、工具和方法来支持面向嵌入式产品的自定义 Linux 系统,不管硬件架构是什么。我想要告诉那些对 yocto 这个名称不甚理解的用户的是,术语 yocto是最小的 SI 单元。最为一个前缀,yocto 表示 10^-24。
Yocto Project 的两大主要组件由 Yocto Project 和 OpenEmbedded 项目一起维护,这两个组件是 BitBake 和 OpenEmbedded-Core,前者是构建引擎,后者是运行构建过程所使用的一套核心配方 (recipe)。
Poky
Poky 是 Yocto Project 的一个参考构建系统。它包含 BitBake、OpenEmbedded-Core、一个板卡支持包 (BSP) 以及整合到构建过程中的其他任何程序包或层。Poky 这一名称也指使用参考构建系统得到的默认 Linux 发行版,它可能极其小 (core-image-minimal),也可能是带有 GUI 的整个 Linux 系统 (core-image-sato)。
您可以将 Poky 构建系统看作是整个项目的一个参考系统,即运行中进程的一个工作示例。在下载 Yocto Project 时,实际上也下载了可用于构建默认系统的这些工具、实用程序、库、工具链和元数据的实例。这一参考系统以及它创建的参考发行版都被命名为 Poky。您还可以将此作为一个起点来创建您自己的发行版,当然,您可以对此发行版随意命名。
所有构建系统都需要的一个项目是工具链:一个编译器、汇编程序、链接器以及为给定架构创建二进制可执行文件所需的其他二进制实用程序。Poky 使用了 GNU Compiler Collection (GCC),不过您也可以指定其他工具链。Poky 使用了一种名为交叉编译 的技术:在一个架构上使用工具链为另一个架构构建二进制可执行文件(例如,在基于 x86 的系统上构建 ARM 发行版)。开发人员常常在嵌入式系统开发中使用交叉编译来利用主机系统的高性能。
Metadata
元数据集按层 进行排列,这样一来每一层都可以为下面的层提供单独的功能。基层是 OpenEmbedded-Core 或 oe-core
,提供了所有构建项目所必需的常见配方、类和相关功能。然后您可以通过在 oe-core
之上添加新层来定制构建。
OpenEmbedded-Core 由 Yocto Project 和 OpenEmbedded 项目共同维护。将 Yocto Project 与 OpenEmbedded 分开的层是 meta-yocto
层,该层提供了 Poky 发行版配置和一组核心的参考 BSP。
OpenEmbedded 项目本身是一个独立的开源项目,具有可与 Yocto Project 交换的配方(大部分)以及与 Yocto Project 类似的目标,但是两者具有不同的治理和范围。
BSP
BSP 包含为特定板卡或架构构建 Linux 必备的基本程序包和驱动程序。这通常由生产板卡的硬件制造商加以维护。BSP 是 Linux 操作系统与运行它的硬件之间的接口。注意,您也可以为虚拟机创建 BSP。
BitBake
BitBake 是一个构建引擎。它读取配方并通过获取程序包来密切关注它们、构建它们并将结果纳入可引导映像。BitBake 由 Yocto Project 和 OpenEmbedded 项目共同维护。
Yocto官方文档资源
Yocto快速入门指南
Bitbake用户手册
Yocto完全手册
Yocto开发手册
Yocto的Linux kernel开发手册
Yocto参考手册
构建Yocto Linux系统
i2SOM已经提供好整个Yocto软件包,可以直接使用。同时还提供了一份download软件包,以节省开发者用于再次下载软件包所花费的时间。
构建前,需要把i2SOM-ST-Yocto.tar.gz和i2SOM-Yocto-predl-pkgs.tar.xz文件下载后放在"$HOME/PanGu"目录下。
请注意,Yocto构建系统需要有几点注意
这里创建的PanGu目录是位于"$HOME"下,而不是/home目录。
Yocto构建是在普通用户下,请不要使用root用户来构建。
Yocto构建不需要加载SDK的环境变量,如果当前shell有加载,就新建一个shell后再执行Yocto构建的命令。
编译前准备
分别解压Yocto代码,downloads,sstate-cache目录。
downloads是Yocto在编译期间默认下载需要的软件包的目录。为了节省时间,PanGu提供了提前下载好的软件包,可以节省下载时间。
sstate-cache是Yocto提供用于加速编译过程的缓存机制,为了缩短编译时间,PanGu提供了的sstate-cache目录,可以节省80%的编译时间。如果没有放置该目录,Yocto在第一次构建时会需要很长时间来从零构建。
$ cd $HOME/i2SOM-STM32MP1
$ tar xvf i2SOM-ST-Yocto.tar.gz
$ tar xvf i2som-pangu-predownload.tar.xz
$ tar xvf i2som-pangu-sstate-cache.tar.xz
$ tar xvf linux-st.tar.gz
$ tar xvf u-boot-st.tar.gz
$ tar xvf arm-trusted-firmware.tar.gz
解压后的目录结构如下
$ tree ~/i2SOM-STM32MP1
/home/i2som/i2SOM-STM32MP1
├── arm-trusted-firmware
├── arm-trusted-firmware-a26789cad.tar.gz
├── downloads
├── i2som-pangu-sstate-cache.tar.xz
├── i2som-pangu-yocto-predownload.tar.xz
├── i2SOM-ST-Yocto
├── i2SOM-ST-Yocto.tar.gz
├── linux-st
├── linux-st-ef13b6fb2.tar.gz
├── Makefile.sdk
├── sstate-cache
├── u-boot-st
└── u-boot-st-656fae51.tar.gz
这里的linux-st, u-boot-st, arm-trusted-firmware分别指代对应的软件包,可以在开发资源包里看到对应的文件名。扩展名前面的部分是标识符,请以实际文件为准!
然后进入i2SOM-ST-Yocto目录,初始化构建目录和配置。以下以构建Weston系统为例
$ cd i2SOM-ST-Yocto
$ DISTRO=openstlinux-weston MACHINE=pangu source layers/meta-i2som-styocto/scripts/envsetup.sh
上面的最后一步是初始化Yocto的构建目录,执行后会自动创建"build-openstlinuxweston-pangu"目录,并加载相应的环境变量至当前shell环境。
如果构建Qt系统,命令如下
$ cd i2SOM-ST-Yocto
$ DISTRO=openstlinux-eglfs MACHINE=pangu source layers/meta-i2som-styocto/scripts/envsetup.sh
MACHINE参数支持设备:
MACHINE参数 | 适用设备 |
pangu | PanGu开发板 |
i2SOM Yocto的提供了以下系统镜像:
DISTRO参数 | 镜像名称 | 系统名称 | 描述 | 应用场景 |
openstlinux-eglfs openstlinux-weston | core-image-base | 命令行版系统(CommandLine System) | 不包含任何图形库 | 适合无显示的产品,通讯网关、工业控制器、数据采集器等 |
openstlinux-eglfs | i2som-image-qt | Qt5图形产品版系统(GUI System) | 包含基于Qt5图形库 | 适合需要人机交互、图表显示的产品,智能家居控制、工业辅助操作仪表 |
openstlinux-weston | i2som-image-weston | 基于Wayland的weston镜像weston | 包含基于Wayland图形库 | 适合需要人机交互、图表显示的产品,智能家居控制、工业辅助操作仪表 |
如果退出当前shell环境后,可以使用以下命令重新进入已创建好的构建目录
$ DISTRO=openstlinux-weston MACHINE=pangu source layers/meta-i2som-styocto/scripts/envsetup.sh
构建Weston系统
下面开始为PanGu开发板构建Weston系统。
$ bitbake i2som-image-weston
构建花费的时间,取决计算机的CPU,内存和硬盘。CPU决定并行的任务数量。Yocto在编译时会产生大量文件,因此SSD会比HDD的速度快很多。
构建完成后,会在当前目录下的"tmp-glibc/deploy/images/pangu/"目录下看到构建出的镜像文件。
$ ls -lh tmp-glibc/deploy/images/pangu/
total 859M
-rw-r--r-- 1 build build 93M Jul 10 14:56 core-image-base-openstlinux-weston-pangu-20190710065454.rootfs.ext4
-rw-r--r-- 1 build build 21K Jul 10 14:56 core-image-base-openstlinux-weston-pangu-20190710065454.rootfs.manifest
-rw-r--r-- 1 build build 18M Jul 10 14:56 core-image-base-openstlinux-weston-pangu-20190710065454.rootfs.tar.xz
-rw-r--r-- 1 build build 309K Jul 10 14:56 core-image-base-openstlinux-weston-pangu-20190710065454.testdata.json
lrwxrwxrwx 1 build build 67 Jul 10 14:56 core-image-base-openstlinux-weston-pangu.ext4 -> core-image-base-openstlinux-weston-pangu-20190710065454.rootfs.ext4
lrwxrwxrwx 1 build build 71 Jul 10 14:56 core-image-base-openstlinux-weston-pangu.manifest -> core-image-base-openstlinux-weston-pangu-20190710065454.rootfs.manifest
lrwxrwxrwx 1 build build 69 Jul 10 14:56 core-image-base-openstlinux-weston-pangu.tar.xz -> core-image-base-openstlinux-weston-pangu-20190710065454.rootfs.tar.xz
lrwxrwxrwx 1 build build 69 Jul 10 14:56 core-image-base-openstlinux-weston-pangu.testdata.json -> core-image-base-openstlinux-weston-pangu-20190710065454.testdata.json
drwxr-xr-x 2 build build 4.0K Jul 10 14:56 flashlayout_core-image-base
drwxr-xr-x 2 build build 4.0K Jul 7 23:35 flashlayout_i2som-image-weston
-rw-r--r-- 1 build build 475M Jul 7 23:35 i2som-image-weston-openstlinux-weston-pangu-20190707151603.rootfs.ext4
-rw-r--r-- 1 build build 60K Jul 7 23:34 i2som-image-weston-openstlinux-weston-pangu-20190707151603.rootfs.manifest
-rw-r--r-- 1 build build 96M Jul 7 23:35 i2som-image-weston-openstlinux-weston-pangu-20190707151603.rootfs.tar.xz
-rw-r--r-- 1 build build 320K Jul 7 23:34 i2som-image-weston-openstlinux-weston-pangu-20190707151603.testdata.json
lrwxrwxrwx 1 build build 70 Jul 7 23:35 i2som-image-weston-openstlinux-weston-pangu.ext4 -> i2som-image-weston-openstlinux-weston-pangu-20190707151603.rootfs.ext4
lrwxrwxrwx 1 build build 74 Jul 7 23:34 i2som-image-weston-openstlinux-weston-pangu.manifest -> i2som-image-weston-openstlinux-weston-pangu-20190707151603.rootfs.manifest
lrwxrwxrwx 1 build build 72 Jul 7 23:35 i2som-image-weston-openstlinux-weston-pangu.tar.xz -> i2som-image-weston-openstlinux-weston-pangu-20190707151603.rootfs.tar.xz
lrwxrwxrwx 1 build build 72 Jul 7 23:34 i2som-image-weston-openstlinux-weston-pangu.testdata.json -> i2som-image-weston-openstlinux-weston-pangu-20190707151603.testdata.json
lrwxrwxrwx 2 build build 59 Jul 7 23:05 Image -> Image--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
-rw-r--r-- 2 build build 15M Jul 7 23:05 Image--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
lrwxrwxrwx 2 build build 59 Jul 7 23:05 Image-pangu.bin -> Image--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
drwxr-xr-x 2 build build 4.0K Jun 30 02:25 scripts
-rw-r--r-- 2 build build 64M Jul 7 23:07 st-image-bootfs-openstlinux-weston-pangu-20190707145953.bootfs.ext4
-rw-r--r-- 2 build build 5.9M Jul 7 23:07 st-image-bootfs-openstlinux-weston-pangu-20190707145953.bootfs.tar.xz
-rw-r--r-- 2 build build 147 Jul 7 23:07 st-image-bootfs-openstlinux-weston-pangu-20190707145953.rootfs.manifest
-rw-r--r-- 2 build build 308K Jul 7 23:07 st-image-bootfs-openstlinux-weston-pangu-20190707145953.testdata.json
lrwxrwxrwx 2 build build 67 Jul 7 23:07 st-image-bootfs-openstlinux-weston-pangu.ext4 -> st-image-bootfs-openstlinux-weston-pangu-20190707145953.bootfs.ext4
lrwxrwxrwx 2 build build 71 Jul 7 23:07 st-image-bootfs-openstlinux-weston-pangu.manifest -> st-image-bootfs-openstlinux-weston-pangu-20190707145953.rootfs.manifest
lrwxrwxrwx 2 build build 69 Jul 7 23:07 st-image-bootfs-openstlinux-weston-pangu.tar.xz -> st-image-bootfs-openstlinux-weston-pangu-20190707145953.bootfs.tar.xz
lrwxrwxrwx 2 build build 69 Jul 7 23:07 st-image-bootfs-openstlinux-weston-pangu.testdata.json -> st-image-bootfs-openstlinux-weston-pangu-20190707145953.testdata.json
-rw-r--r-- 2 build build 12K Jul 7 23:31 st-image-userfs-openstlinux-weston-pangu-20190707151603.rootfs.manifest
-rw-r--r-- 2 build build 309K Jul 7 23:31 st-image-userfs-openstlinux-weston-pangu-20190707151603.testdata.json
-rw-r--r-- 2 build build 94M Jul 7 23:31 st-image-userfs-openstlinux-weston-pangu-20190707151603.userfs.ext4
-rw-r--r-- 2 build build 60M Jul 7 23:31 st-image-userfs-openstlinux-weston-pangu-20190707151603.userfs.tar.xz
lrwxrwxrwx 2 build build 67 Jul 7 23:31 st-image-userfs-openstlinux-weston-pangu.ext4 -> st-image-userfs-openstlinux-weston-pangu-20190707151603.userfs.ext4
lrwxrwxrwx 2 build build 71 Jul 7 23:31 st-image-userfs-openstlinux-weston-pangu.manifest -> st-image-userfs-openstlinux-weston-pangu-20190707151603.rootfs.manifest
lrwxrwxrwx 2 build build 69 Jul 7 23:31 st-image-userfs-openstlinux-weston-pangu.tar.xz -> st-image-userfs-openstlinux-weston-pangu-20190707151603.userfs.tar.xz
lrwxrwxrwx 2 build build 69 Jul 7 23:31 st-image-userfs-openstlinux-weston-pangu.testdata.json -> st-image-userfs-openstlinux-weston-pangu-20190707151603.testdata.json
-rw-r--r-- 2 build build 259 Jul 7 23:07 st-image-vendorfs-openstlinux-weston-pangu-20190707145953.rootfs.manifest
-rw-r--r-- 2 build build 309K Jul 7 23:07 st-image-vendorfs-openstlinux-weston-pangu-20190707145953.testdata.json
-rw-r--r-- 2 build build 16M Jul 7 23:07 st-image-vendorfs-openstlinux-weston-pangu-20190707145953.vendorfs.ext4
-rw-r--r-- 2 build build 2.2M Jul 7 23:07 st-image-vendorfs-openstlinux-weston-pangu-20190707145953.vendorfs.tar.xz
lrwxrwxrwx 2 build build 71 Jul 7 23:07 st-image-vendorfs-openstlinux-weston-pangu.ext4 -> st-image-vendorfs-openstlinux-weston-pangu-20190707145953.vendorfs.ext4
lrwxrwxrwx 2 build build 73 Jul 7 23:07 st-image-vendorfs-openstlinux-weston-pangu.manifest -> st-image-vendorfs-openstlinux-weston-pangu-20190707145953.rootfs.manifest
lrwxrwxrwx 2 build build 73 Jul 7 23:07 st-image-vendorfs-openstlinux-weston-pangu.tar.xz -> st-image-vendorfs-openstlinux-weston-pangu-20190707145953.vendorfs.tar.xz
lrwxrwxrwx 2 build build 71 Jul 7 23:07 st-image-vendorfs-openstlinux-weston-pangu.testdata.json -> st-image-vendorfs-openstlinux-weston-pangu-20190707145953.testdata.json
-rw-r--r-- 2 build build 68K Jul 7 23:05 stm32mp157a-panguboard--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb
lrwxrwxrwx 2 build build 76 Jul 7 23:05 stm32mp157a-panguboard.dtb -> stm32mp157a-panguboard--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb
-rw-r--r-- 2 build build 68K Jul 7 23:05 stm32mp157a-panguboard-lcd--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb
lrwxrwxrwx 2 build build 80 Jul 7 23:05 stm32mp157a-panguboard-lcd.dtb -> stm32mp157a-panguboard-lcd--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb
lrwxrwxrwx 2 build build 80 Jul 7 23:05 stm32mp157a-panguboard-lcd-pangu.dtb -> stm32mp157a-panguboard-lcd--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb
-rw-r--r-- 2 build build 69K Jul 7 23:05 stm32mp157a-panguboard-mipi--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb
lrwxrwxrwx 2 build build 81 Jul 7 23:05 stm32mp157a-panguboard-mipi.dtb -> stm32mp157a-panguboard-mipi--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb
lrwxrwxrwx 2 build build 81 Jul 7 23:05 stm32mp157a-panguboard-mipi-pangu.dtb -> stm32mp157a-panguboard-mipi--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb
lrwxrwxrwx 2 build build 76 Jul 7 23:05 stm32mp157a-panguboard-pangu.dtb -> stm32mp157a-panguboard--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb
-rw-r--r-- 1 build build 240K Jul 4 13:54 tf-a-stm32mp157a-panguboard-trusted.stm32
-rw-r--r-- 1 build build 118K Jul 6 12:27 u-boot-spl.stm32-stm32mp157a-panguboard-basic
-rw-r--r-- 1 build build 734K Jul 6 12:27 u-boot-stm32mp157a-panguboard-basic.img
-rw-r--r-- 1 build build 730K Jul 6 12:27 u-boot-stm32mp157a-panguboard-trusted.stm32
lrwxrwxrwx 2 build build 60 Jul 7 23:05 uImage -> uImage--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
-rw-r--r-- 2 build build 5.8M Jul 7 23:05 uImage--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
lrwxrwxrwx 2 build build 60 Jul 7 23:05 uImage-pangu.bin -> uImage--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
lrwxrwxrwx 2 build build 61 Jul 7 23:05 vmlinux -> vmlinux--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
-rw-r--r-- 2 build build 181M Jul 7 23:05 vmlinux--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
lrwxrwxrwx 2 build build 61 Jul 7 23:05 vmlinux-pangu.bin -> vmlinux--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
lrwxrwxrwx 2 build build 60 Jul 7 23:05 zImage -> zImage--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
-rw-r--r-- 2 build build 5.8M Jul 7 23:05 zImage--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
lrwxrwxrwx 2 build build 60 Jul 7 23:05 zImage-pangu.bin -> zImage--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin
上面列出的构建后的文件中,有部分是链接文件,可以先忽略。下面表格是构建出的文件描述:
文件后缀 | 文件说明 |
*.ext4 | 目标镜像的ext4文件系统格式的文件 |
*.manifest | 目标镜像内包含的软件包列表文件 |
*.tar.xz | 目标镜像的tar.xz格式的文件 |
<br>u-boot-spl.stm32-stm32mp157a-panguboard-basic<br> | U-Boot的 SPL程序 |
<br>uImage-pangu.bin -> uImage--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.bin<br> | Linux kernel uImage文件 |
<br>stm32mp157a-panguboard--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb<br> | PanGu开发板的DeviceTree设备描述文件,支持HDMI接口 |
stm32mp157a-panguboard-lcd--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb | PanGu开发板的DeviceTree设备描述文件,支持RGB LCD接口 |
stm32mp157a-panguboard-mipi--4.19+github+0+ff1fafeb00-r0-pangu-20190707145953.dtb | PanGu开发板的DeviceTree设备描述文件,支持MIPI DSI接口 |
<br>flashlayout_i2som-image-weston<br> | flashlayout_i2som-image-weston目录是用于STM32CubeProgrammer使用 USB烧写的配置文件 |
更新Yocto中的Linux和U-Boot代码
Yocto的开发流程中是让各个软件自行管理版本,Yocto只是作为构建的工具。U-Boot,Linux kernel的代码,需要使用git功能来管理,每次修改后需要提交到本地仓库,如果有远程仓库也需要推送到远程仓库。然后修改对应的bb文件,才能让Yocto使用新版本的代码来编译。
U-Boot
i2SOM-ST-Yocto/meta-i2som-styocto/recipes-bsp/u-boot/u-boot-i2som-common_2018.11.inc
SRCREV_class-devupstream 表示git commit id的SHA-1 校验和值,更换为新的值即可。
Linux kernel
i2SOM-ST-Yocto/meta-i2som-styocto/recipes-kernel/linux/linux-i2som_4.19.bb
SRCREV 表示git commit id的SHA-1 校验和值,更换为新的值即可。
Bitbake命令
Bitbake是Yocto上提供给开发者使用的构建命令,其语法如下:
bitbake [options] [recipename/target recipe:do_task ...]
以下是Bitbake常用的参数和用法,使用bitbake命令前,必须先执行过初始化Yocto构建。
构建一个软件包
$ bitbake recipe
删除文件
Bitbake中删除文件有三种方式。
仅删除解压任务后的输出文件
删除目标从"do_unpack"任务后所有输出的文件(do_unpack
, do_configure
, do_compile
, do_install
, and do_package
)
$ bitbake -c clean recipe
删除文件和源代码
删除目标的所有输出文件、sstate缓存和下载的源文件(即DL_DIR目录下的文件)。本质上,do cleanall任务与do cleansstate任务相同,只是增加了删除下载的源文件。
$ bitbake -c cleanall recipe
删除目标的所有输出文件和sstate缓存。本质上,do_cleansstate任务与do_clean任务是相同的,只是添加了对sstate缓存的删除。
$ bitbake -c cleansstate recipe
显示构建时的环境变量
$ bitbake -e foo
最后编辑:SteveChen 更新时间:2024-10-18 15:16