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 软件,只需要在配置文件中添加即可。

image

  • 芯片厂商更新合并的问题;

yocto 以 patch 来管理源码,所有在源更新后,很容易把自己的 patch 打进去,如下。

image

  • 方便芯片厂商管理多个平台。

  • 至于对 U-Boot、Kernel 构建帮助不大,因为他们本来利用 Kconfig/Kbuild 系统使得构建工作已经很简单了,yocto 也只是在其上又包裹了一层。

  • 带来了哪些问题

  • 编译构建对机器配置、网络均有要求;

  • 概念很多,学习曲线陡峭;

  • 官方文档

https://docs.yoctoproject.org/current/index.html

3. yocto 基本原则

  • yocto 目录结构

image

  • sources/  核心目录,包含所有构建过程需要的所有的配置文件;

  • build_s32r45evb/ 包含编译过程中的源文件、中间文件以及最终镜像文件,整个文件夹都是由 sources文件夹里的配置文件控制的;

  • downloads/ 包含编译过程中从网络下载来的文件,下次需要可以直接从本地取得;

  • sstate-cache/ 编译过程中得cache;

  • yocto 工作流程

image

  • 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 目录以及重点文件的作用

image

每一个meta-*文件夹,yocto的语言叫做 layer。功能紧密关联的 recipes 组成 layer,layer之间功能相互独立也有依赖性。

我们 r45 平台主要关注 meta-alb、meta-rsdk 两个目录,这两个目录和meta-freescale由 NXP 维护,其他某些目录由社区维护。meta-sinpro目录是我们新建的,我们的工作都体现在这个文件夹里。

  • layer 目录

image

  • classes:该文件夹下的.bbclass文件,包含了一些在不同的metadata之间共享的信息,以及编译信息的抽象;

  • conf:该conf文件夹下的layer.conf文件定义了该metadata中使用的哪些.bb、.bbappend文件等参与构建嵌;

  • recipes-xxx:该文件夹中有许多的.bb或.bbappend文件,这些文件定义了构建系统需要的软件包或源码等,主要包括:

    • 软件包的基本信息:作者、主页、License等

    • 版本信息

    • 依赖文件

    • 从哪下载以及如何下载软件包

    • 软件包补丁信息:是否需要补丁、补丁下载地址及方式等

    • 如何配置、如何编译软件包、安装位置等

  • Machine

R45 的 machine 文件 s32r45evb.conf,如下:

image

主要对 U-Boot、Kernel 的行为做一些默认配置。

  • Distro

Distro 的配置文件主要对发行软件做一些控制。R45的 distro 文件如下:

image

  • 使能 layer

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

image

  • Bitbake

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

bitbake 常用命令不完全举例如下:

image

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 改清华源

image

下载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”