001-Yocto 总结分享
1. yocto 之前
Linux 底层BSP开发主要围绕三件事情,U-Boot、Kernel、Rootfs。在没有 yocto 构建工具之前都需要手动编译处理。
构建 U-Boot
配置交叉编译工具链;
执行 make xx\_defconfig,配置 U-Boot;
执行 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-,编译 U-Boot;
构建 Kernel
配置交叉编译工具链;
执行 make xx\_defconfig,配置 Kernel;
执行 make ARCH=arm CROSS\_COMPILE=arm-linux-gnueabihf-,编译 Kernel;
构建Rootfs
- 手动下载源码编译环境需要的库、应用
手动处理有一个最大的麻烦就是处理依赖,往往安装 A 软件时,发现 A 软件依赖 B 软件,装 B 软件时,又发现依赖 C 软件,这样无穷无尽。
busybox;
生成 SD/Flash 镜像
一般根据某一个 layout 规矩,执行脚本把上面三者打包到一起。
2. yocto 之后
仅仅执行一个bitbake fsl-image-auto,上面所有的工作均自动完成,当然简单的背后是有一堆配置文件来支持。
解决了之前的哪些痛点
- Rootfs 软件依赖问题;
例如增加 vim 软件,只需要在配置文件中添加即可。

- 芯片厂商更新合并的问题;
yocto 以 patch 来管理源码,所有在源更新后,很容易把自己的 patch 打进去,如下。

方便芯片厂商管理多个平台。
至于对 U-Boot、Kernel 构建帮助不大,因为他们本来利用 Kconfig/Kbuild 系统使得构建工作已经很简单了,yocto 也只是在其上又包裹了一层。
带来了哪些问题
编译构建对机器配置、网络均有要求;
概念很多,学习曲线陡峭;
官方文档
https://docs.yoctoproject.org/current/index.html
3. yocto 基本原则
- yocto 目录结构

sources/ 核心目录,包含所有构建过程需要的所有的配置文件;
build_s32r45evb/ 包含编译过程中的源文件、中间文件以及最终镜像文件,整个文件夹都是由 sources文件夹里的配置文件控制的;
downloads/ 包含编译过程中从网络下载来的文件,下次需要可以直接从本地取得;
sstate-cache/ 编译过程中得cache;
yocto 工作流程

Fetch – get the source code
Extract – unpack the sources
Patch – apply patches for bug fixes and new capability
Configure – set up your environment specifications
Build – compile and link
Install – copy files to target directories
Package – bundle files for installation
source 目录以及重点文件的作用

每一个meta-*文件夹,yocto的语言叫做 layer。功能紧密关联的 recipes 组成 layer,layer之间功能相互独立也有依赖性。
我们 r45 平台主要关注 meta-alb、meta-rsdk 两个目录,这两个目录和meta-freescale由 NXP 维护,其他某些目录由社区维护。meta-sinpro目录是我们新建的,我们的工作都体现在这个文件夹里。
- layer 目录

classes:该文件夹下的.bbclass文件,包含了一些在不同的metadata之间共享的信息,以及编译信息的抽象;
conf:该conf文件夹下的layer.conf文件定义了该metadata中使用的哪些.bb、.bbappend文件等参与构建嵌;
recipes-xxx:该文件夹中有许多的.bb或.bbappend文件,这些文件定义了构建系统需要的软件包或源码等,主要包括:
软件包的基本信息:作者、主页、License等
版本信息
依赖文件
从哪下载以及如何下载软件包
软件包补丁信息:是否需要补丁、补丁下载地址及方式等
如何配置、如何编译软件包、安装位置等
Machine
R45 的 machine 文件 s32r45evb.conf,如下:

主要对 U-Boot、Kernel 的行为做一些默认配置。
- Distro
Distro 的配置文件主要对发行软件做一些控制。R45的 distro 文件如下:

- 使能 layer
在 nxp-setup-alb.sh 文件中添加指定的 layer 可以实现自动添加,也可以手动在 local.conf 文件中添加。

- Bitbake
bitbake 是 yocto 系统的构建工具。可以简单的认为它类似 make 工具,make 工具的行为是由 Makefile 决定的,而 bitbake 的行为是由 .bb、.bbapend文件决定的。bitbake 的命令很多,可以执行bitbake -h 查看或者参考链接 https://docs.yoctoproject.org/bitbake/2.0/index.html
bitbake 常用命令不完全举例如下:

4. yocto 实践
- 新建 sinpro layer
yocto 以补丁的形式(包括源码和配置文件)关联不同的layer,所以我们不会直接改其他 layer。我们所有的定制都在meta-sinpro层完成。新建 layer 的具体过程如下,且测试驱动的编译:
$ bitbake-layers create-layer ../sources/meta-sinpro
$ cd ../sources
$ cp -rp ../poky/meta-skeleton/recipes-kernel/ .
$ bitbake hello-mod; #(hello-mod 是.bb文件的名字,与源文件名无关)
改 U-Boot 源码(手动)
进入 ~/NXP/Workspace/rsdk-yocto-build/build_s32r45evb/tmp/work/s32r45evb-fsl-linux/u-boot-s32/2020.04-r0/git 修改代码;
bitbake u-boot-s32 -c clearnsstate && bitbake uboot-s32 重新编译;
验证 patch 是ok;
git commit 提交这次修改;
git diff 生成 patch;
把 patch 拷贝到 meta-sinpro中,并修改相关 .bb 文件;
改 U-Boot 源码(自动)
所谓自动实际上是用 devtool 工具,具体操作如下:
devtool modify u-boot-s32,会在build目录下生成workspace目录,并把u-boot-s32的源码提取到此处;
修改源码;
devtool build u-boot-s32 编译uboot;
git commit 提交版本;
devtool finish u-boot-s32 ../meta-sinpro,自动提交patch到指定layer;
5. tips
- 下载 repo 改清华源

下载NXP bsp 改清华源
- 下载NXP bsp 改清华源
repo init -u https://source.codeaurora.org/external/autobsps32/auto\_yocto\_bsp-b release/bsp32.0**--repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo\*\*
- bitbake中断后继续报错
中断后会生成 .lock 文件,重新接着编译会出错,删除.lock文件就好了。
- git 仓库默认协议下载慢
指定https协议,有时候会快很多,操作如下:
URL ?= “git://source.codeaurora.org/external/autobsps32/linux;protocol=https”
参考网站
开源 layer: http://layers.openembedded.org/layerindex/branch/master/layers/
Yocto 官方文档,搞懂yocto,这个文档要多看: https://docs.yoctoproject.org/index.html