5 获取 SDK

5 直接在 Yocto 构建中使用 SDK 组件

请参阅 “直接在 Yocto 构建中配置可扩展 SDK 环境”。

要高效使用这种方式,需要性能较好的构建主机,或运行良好的共享状态缓存基础设施。 否则,可能需要花费大量时间,等待 BitBake 从源码构建各组件。

5 使用独立 SDK 安装程序

5 查找预构建 SDK 安装程序

可以查找并运行 Yocto 项目提供的 SDK 安装脚本,以使用现成的预构建工具链。 采用这种方式时,需要选择并下载面向特定架构的 SDK 安装程序, 再手动运行脚本完成安装。

查找与安装步骤如下:

  1. 进入安装程序目录: 打开 https://downloads.yoctoproject.org/releases/yocto/yocto-6.1_M3/toolchain/。

  2. 打开与构建主机对应的文件夹: 选择匹配 Build Host 的文件夹, 32 位主机为 i686,64 位主机为 x86_64。

  3. 查找并下载 SDK 安装程序: 选择与构建主机、目标硬件和镜像类型匹配的安装程序。

    安装文件(*.sh)遵循以下命名约定:

    poky-glibc-host_system-core-image-type-arch-toolchain[-ext]-release.sh

    其中:

    • host_system:开发系统,可以是 i686 或 x86_64。

    • type:镜像类型,可以是 sato 或 minimal。

    • arch:目标架构,例如 cortexa57-qemuarm64。

    • release:Yocto 项目的版本。

    备注

    标准 SDK 安装程序的文件名不包含 -ext。

    Yocto 项目提供的工具链基于 core-image-sato 和 core-image-minimal 镜像, 包含面向相应镜像开发所需的库。

    例如,构建主机为 64 位 x86 系统,且需要面向 64 位 core2 QEMU 目标的扩展 SDK 时, 可以进入 x86_64 文件夹,下载下列安装程序:

    poky-glibc-x86_64-core-image-sato-core2-64-qemux86-64-toolchain-6.1.sh
    
  4. 运行安装程序: 确保具有执行权限,再运行脚本。 以下示例使用 Downloads 目录中的安装文件:

    $ ~/Downloads/poky-glibc-x86_64-core-image-sato-core2-64-qemux86-64-toolchain-6.1.sh
    

    脚本执行期间,可以选择工具链的安装根目录。 目录结构详情见 “安装后的标准 SDK 目录结构” 和 “安装后的可扩展 SDK 目录结构”。

5 构建 SDK 安装程序

除了查找和下载现成安装程序,也可以自行构建,步骤如下:

  1. 配置构建环境: 确保 shell 已配置为能够运行 BitBake。 准备 构建主机 的方法见开发任务手册的 准备使用 Yocto Project。

  2. 确认安装程序面向正确的机器: 检查 MACHINE 是否与要构建的目标架构一致。

  3. 正确设置 SDK 运行主机: 如果构建的工具链要运行在与当前开发主机 (构建主机)不同的架构上,必须正确设置 SDKMACHINE。

    备注

    构建可扩展 SDK 安装程序时,SDKMACHINE 必须设置为构建该安装程序 所用机器的架构。设置不正确时,构建会失败,并出现类似以下的错误:

    The extensible SDK can currently only be built for the same
    architecture as the machine being built on - SDK_ARCH
    is set to i686 (likely via setting SDKMACHINE) which is
    different from the architecture of the build machine (x86_64).
    Unable to continue.
    
  4. 构建 SDK 安装程序: 要构建标准 SDK 安装程序并填充 SDK 镜像, 使用以下命令形式。将 image 替换为镜像名称,例如 “core-image-sato”:

    $ bitbake image -c populate_sdk
    

    可扩展 SDK 使用类似的命令:

    $ bitbake image -c populate_sdk_ext
    

    生成的 SDK 安装程序中会包含与目标根文件系统匹配的 sysroot。 bitbake 完成后,可在 Build Directory 下的 tmp/deploy/sdk 找到安装程序。

    备注

    • 上述 BitBake 命令默认不构建静态二进制文件。 如果需要用工具链构建这类库,必须确保 SDK 包含相应的静态开发库。 使用 TOOLCHAIN_TARGET_TASK 将所需库软件包加入 SDK。 以下以 libc 静态开发库为例:

      TOOLCHAIN_TARGET_TASK:append = " libc-staticdev"
      
  5. 运行安装程序: 现在可以运行 Build Directory 下 tmp/deploy/sdk 中的安装程序,例如:

    $ cd bitbake-builds/build/tmp/deploy/sdk
    $ ./poky-glibc-x86_64-core-image-sato-core2-64-toolchain-ext-6.1.sh
    

    执行脚本时可以选择工具链安装根目录。 详情见 “安装后的标准 SDK 目录结构” 和 “安装后的可扩展 SDK 目录结构”。

5 解压根文件系统

安装工具链后,某些场景还需要单独解压根文件系统,例如:

  • 通过 NFS 启动镜像。

  • 将根文件系统用作目标 sysroot。

  • 使用根文件系统作为目标 sysroot 来开发目标应用。

操作步骤如下:

  1. 查找并下载预构建根文件系统镜像归档: 选择与目标系统匹配的根文件系统镜像。 这些文件位于 发布索引 的 machines 目录中,按机器分别存放。

    机器专用目录包含受支持机器的 *.tar.bz2 归档, 也包含可直接用于 QEMU 的 *.ext4 根文件系统镜像文件。

    预构建根文件系统镜像的命名约定如下:

    core-image-profile-machine.tar.bz2

    其中:

    • profile:文件系统镜像的类型,例如 minimal、minimal-dev 或 sato。 各镜像类型的说明见 Yocto 项目参考手册的“镜像”一章。

    • machine:与下载目录名称相同的机器名称。

    Yocto 项目提供的根文件系统基于 core-image-sato 和 core-image-minimal 镜像。

    例如,计划使用 BeagleBone 作为目标硬件,镜像为 core-image-sato-sdk 时, 可以下载以下文件:

    core-image-sato-sdk-beaglebone-yocto.tar.bz2
    
  2. 初始化交叉开发环境: 必须通过 source 载入交叉开发环境脚本, 设置必需的环境变量。

    脚本位于工具链安装的顶层目录中,例如 poky_sdk。 以下示例基于 “查找预构建 SDK 安装程序”中的工具链:

    $ source poky_sdk/environment-setup-core2-64-poky-linux
    
  3. 解压根文件系统: 使用 runqemu-extract-sdk,并传入根文件系统镜像。

    以下命令会解压从 发布索引 下载的预构建根文件系统镜像。原文将解压目录描述为 core2-64-sato; 下方示例命令实际指定的是 beaglebone-sato:

    $ runqemu-extract-sdk ~/Downloads/core-image-sato-sdk-beaglebone-yocto.tar.bz2 ~/beaglebone-sato
    

    随后可以将目标 sysroot 指向 beaglebone-sato。

5 安装后的标准 SDK 目录结构

运行 *.sh 安装脚本安装标准 SDK 后,可以看到以下目录结构:

install_dir/version/
├── buildinfo
├── environment-setup-target-poky-linux
├── site-config-target-poky-linux
├── sysroots/
│   ├── target-poky-linux/
│   │   ├── bin/
│   │   ├── boot/
│   │   ├── etc/
│   │   ├── home/
│   │   ├── lib/
│   │   ├── media/
│   │   ├── mnt/
│   │   ├── proc/
│   │   ├── run/
│   │   ├── sbin/
│   │   ├── sys/
│   │   ├── tmp/
│   │   ├── usr/
│   │   └── var/
│   └── host-pokysdk-linux/
│       ├── bin/
│       ├── environment-setup.d/
│       ├── etc/
│       ├── lib/
│       ├── sbin/
│       ├── usr/
│       └── var/
└── version-target-poky-linux

安装后的 SDK 包含 SDK 环境初始化脚本、目标配置文件、目标版本文件, 以及为目标系统开发产物所需的根文件系统(sysroots)。

上图中的斜体文字表示文件或目录名称中可以替换的部分。 例如,install_dir/version 是 SDK 安装目录。 默认 install_dir 为 /opt/poky/,version 表示具体 SDK 快照,例如 6.1。 target 表示目标架构,例如 i586;host 表示开发主机架构,例如 x86_64。 因此,sysroots 中的两个目录可以分别是目标端的 i586-poky-linux 和主机端的 x86_64-pokysdk-linux。

5 安装后的可扩展 SDK 目录结构

运行 *.sh 安装脚本安装可扩展 SDK 后,可以看到以下目录结构:

install_dir/
├── bitbake-cookerdaemon.log
├── buildinfo
├── buildtools/
├── cache/
├── conf/
├── .devtoolbase
├── downloads/
├── environment-setup-target-poky-linux
├── layers/
├── oe-time-dd-test.dat
├── preparing_system_build.log
├── site-config-target-poky-linux
├── sstate-cache/
├── sysroots/
├── tmp/
├── version-target-poky-linux
└── workspace/

可扩展 SDK 的目录结构与标准 SDK 有明显区别。 它没有以相同方式分离主机端与目标端内容,而是内嵌了一份 OpenEmbedded 构建系统,并使用该构建系统自己的 sysroot。

值得关注的文件包括 SDK 环境初始化脚本、目标配置文件、目标版本文件, 以及安装程序运行的构建系统准备脚本和 BitBake 生成的日志。

上图中的斜体文字同样表示可替换的名称部分。 install_dir 是 SDK 安装位置,默认为主目录下的 poky_sdk; target 表示目标架构,例如 i586。