5 获取 SDK
5 直接在 Yocto 构建中使用 SDK 组件
请参阅 “直接在 Yocto 构建中配置可扩展 SDK 环境”。
要高效使用这种方式,需要性能较好的构建主机,或运行良好的共享状态缓存基础设施。 否则,可能需要花费大量时间,等待 BitBake 从源码构建各组件。
5 使用独立 SDK 安装程序
5 查找预构建 SDK 安装程序
可以查找并运行 Yocto 项目提供的 SDK 安装脚本,以使用现成的预构建工具链。 采用这种方式时,需要选择并下载面向特定架构的 SDK 安装程序, 再手动运行脚本完成安装。
查找与安装步骤如下:
进入安装程序目录: 打开 https://downloads.yoctoproject.org/releases/yocto/yocto-6.1_M3/toolchain/。
打开与构建主机对应的文件夹: 选择匹配 Build Host 的文件夹, 32 位主机为
i686,64 位主机为x86_64。查找并下载 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
运行安装程序: 确保具有执行权限,再运行脚本。 以下示例使用
Downloads目录中的安装文件:$ ~/Downloads/poky-glibc-x86_64-core-image-sato-core2-64-qemux86-64-toolchain-6.1.sh脚本执行期间,可以选择工具链的安装根目录。 目录结构详情见 “安装后的标准 SDK 目录结构” 和 “安装后的可扩展 SDK 目录结构”。
5 构建 SDK 安装程序
除了查找和下载现成安装程序,也可以自行构建,步骤如下:
配置构建环境: 确保 shell 已配置为能够运行 BitBake。 准备 构建主机 的方法见开发任务手册的 准备使用 Yocto Project。
确认安装程序面向正确的机器: 检查 MACHINE 是否与要构建的目标架构一致。
正确设置 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.
构建 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"
运行安装程序: 现在可以运行 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 来开发目标应用。
操作步骤如下:
查找并下载预构建根文件系统镜像归档: 选择与目标系统匹配的根文件系统镜像。 这些文件位于 发布索引 的 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
初始化交叉开发环境: 必须通过
source载入交叉开发环境脚本, 设置必需的环境变量。脚本位于工具链安装的顶层目录中,例如
poky_sdk。 以下示例基于 “查找预构建 SDK 安装程序”中的工具链:$ source poky_sdk/environment-setup-core2-64-poky-linux
解压根文件系统: 使用
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。