2 使用可扩展 SDK

本章介绍可扩展 SDK 的组成、安装方法以及 devtool 的使用。 可扩展 SDK 便于向镜像添加应用和库、修改现有组件的源码、 在目标硬件上测试变更,并将成果集成到 OpenEmbedded Build System 中。

备注

可扩展 SDK 与标准 SDK 的主要功能对比见 简介。

除了使用 devtool,也可以直接调用工具链,例如从 Makefile 或 Autotools 中调用。 详情见 “直接使用 SDK 工具链”。

2 为什么使用可扩展 SDK,它包含什么?

可扩展 SDK 提供针对特定镜像内容定制的交叉开发工具链和库。 如果希望在工具链之外,还能使用为 Yocto 项目环境设计的一整套强大 devtool 命令, 就可以选择可扩展 SDK。

安装后的可扩展 SDK 包含多个文件与目录,主要包括环境初始化脚本、 配置文件、内部构建系统和 devtool 功能。

2 安装可扩展 SDK

2 两种安装方式

可扩展 SDK 有两种安装方式,各有优缺点:

  1. 直接在 Yocto 构建中配置可扩展 SDK 环境。 这样不必另外生成、测试、分发和维护可能非常庞大的 SDK 安装归档。 常规 Yocto 构建与 SDK 共用一个环境,出错的代码路径更少。 更新 SDK 也更简单,只需通过 git fetch 或层管理工具更新 Yocto 层。 这种方式比独立安装程序更易扩展:再次运行 bitbake 就能向 sysroot 添加内容,需要更多内容时还可以加入新的层。

  2. 通过独立安装程序配置可扩展 SDK。 这种方式提供一个自包含归档,其中含有所有必需的二进制产物, 无需重新构建。对于使用性能较弱笔记本的开发者, 也不必另外通过网络提供稳定的二进制产物缓存。

2 直接在 Yocto 构建中配置可扩展 SDK 环境

  1. 配置所需的全部层与 Yocto 构建目录, 即一个能够正常运行 bitbake 的 Yocto 构建环境。

  2. 运行:

$ bitbake meta-ide-support
$ bitbake -c populate_sysroot gtk+3
# or any other target or native item that the application developer would need
$ bitbake build-sysroots -c build_native_sysroot && bitbake build-sysroots -c build_target_sysroot

2 使用独立安装程序配置可扩展 SDK

首先,在 构建主机 上运行 *.sh 安装脚本。

可以从发布索引中相应的 工具链目录 下载归档安装程序,其中包含预构建工具链、runqemu、内部构建系统、 devtool 和支持文件。x86_64 目录提供面向多种 32 位和 64 位架构的工具链。 Yocto 项目提供的工具链基于 core-image-sato 与 core-image-minimal 镜像, 包含为相应镜像开发时所需的库。

安装脚本的文件名先标明主机系统,再标明目标架构。 可扩展 SDK 的文件名中还包含 “-ext”,通用格式如下:

poky-glibc-host_system-image_type-arch-toolchain-ext-release_version.sh

其中:

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

  • image_type 表示 SDK 对应的镜像,可以是 core-image-sato 或 core-image-minimal。

  • arch 表示经过调优的目标架构,例如 aarch64、armv5e、core2-64、 i586、mips32r2、mips64、ppc7400 或 cortexa8hf-neon。

  • release_version 表示 Yocto 项目的版本,例如 6.1 或 6.1+snapshot。

下面的安装程序面向 64 位开发主机及采用 i586 调优的目标架构, 基于当前 6.1 快照的 core-image-sato SDK:

poky-glibc-x86_64-core-image-sato-i586-toolchain-ext-6.1.sh

备注

除了下载 SDK,也可以自行构建安装程序。 方法见 构建 SDK 安装程序。

SDK 和工具链自成一体,默认安装在主目录的 poky_sdk 文件夹中。 运行安装程序时,可以选择其他位置。但 SDK 正常运行时需要写入该目录, 因此所有使用者都必须对安装位置具有写权限。

以下示例演示如何运行面向 64 位 x86 开发主机及 64 位 x86 目标架构的安装程序。 假设程序位于 ~/Downloads/ 且已具有执行权限:

$ ./Downloads/poky-glibc-x86_64-core-image-minimal-core2-64-toolchain-ext-2.5.sh
Poky (Yocto Project Reference Distro) Extensible SDK installer version 2.5
==========================================================================
Enter target directory for SDK (default: poky_sdk):
You are about to install the SDK to "/home/scottrif/poky_sdk". Proceed [Y/n]? Y
Extracting SDK..............done
Setting it up...
Extracting buildtools...
Preparing build system...
Parsing recipes: 100% |##################################################################| Time: 0:00:52
Initialising tasks: 100% |###############################################################| Time: 0:00:00
Checking sstate mirror object availability: 100% |#######################################| Time: 0:00:00
Loading cache: 100% |####################################################################| Time: 0:00:00
Initialising tasks: 100% |###############################################################| Time: 0:00:00
done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /home/scottrif/poky_sdk/environment-setup-core2-64-poky-linux

备注

如果没有安装目录的写权限,安装程序会提示并退出。 请先设置适当的目录权限,再重新运行。

2 运行可扩展 SDK 环境初始化脚本

安装后,必须先运行环境初始化脚本,才能实际使用 SDK。

如果直接在 Yocto 构建中使用 SDK,脚本位于 Build Directory 下的 tmp/deploy/images/qemux86-64/。

使用独立安装程序时,脚本位于安装时选择的目录中, 可能是默认的 poky_sdk,也可能是自行指定的位置。

运行前,要确认脚本与目标架构匹配。环境脚本名称以 environment-setup 开头, 并包含经过调优的目标架构名称。下面先切换到 SDK 安装目录, 再载入面向 IA 目标机器的环境脚本。原示例将其描述为采用 i586 调优的目标:

$ cd /home/scottrif/poky_sdk
$ source environment-setup-core2-64-poky-linux
SDK environment now set up; additionally you may now run devtool to perform development tasks.
Run devtool --help for further details.

直接在 Yocto 构建中使用环境脚本时,调用方式类似:

$ source tmp/deploy/images/qemux86-64/environment-setup-core2-64-poky-linux

脚本会定义 SDK 所需的许多环境变量,例如 PATH、CC 和 LD。 要查看脚本导出的全部变量,可以直接阅读安装后的脚本文件。

2 在 SDK 工作流中使用 devtool

可扩展 SDK 的核心是命令行工具 devtool。 它提供构建、测试和打包软件的功能,并可将软件集成到由 OpenEmbedded 构建系统生成的镜像中。

备注

devtool 并不限于可扩展 SDK。 对于任何需要把构建输出纳入构建系统所生成镜像的项目,都可以使用它辅助开发。

devtool 的命令结构类似 Git, 各项功能对应不同子命令。运行 devtool --help 可以查看全部命令。

备注

另见 Yocto 项目参考手册的 devtool 速查。

以下子命令是常用的开发入口:

  • devtool add:帮助添加要构建的新软件。

  • devtool modify:配置环境,以便修改现有组件的源码。

  • devtool ide-sdk:为 IDE 生成配置。

  • devtool upgrade:更新现有配方,以构建更新后的源码。

与构建系统一样,devtool 用配方表示软件包。 devtool add 会自动创建配方;devtool modify 则使用指定的现有配方, 确定源码来源以及如何应用补丁。这两种方式都会建立一个环境, 使配方构建使用由你控制的源码树,从而允许按需修改源码。 默认情况下,新配方和源码放在 SDK 下的 workspace 目录中。

如何使用 devtool 添加、修改、升级配方等,见开发任务手册的 使用 devtool 命令行工具。

2 向可扩展 SDK 安装其他内容

可扩展 SDK 开箱时通常只包含少量工具和库。 最小 SDK 基本是空的,之后按需填充。有时必须显式安装额外组件。 可以先用 devtool search 查找。例如,需要链接 libGL, 却不知道哪个配方提供它时,可以运行:

$ devtool search libGL mesa
A free implementation of the OpenGL API

确定配方名称后(本例为 mesa),即可安装。

2 直接在 Yocto 构建中使用可扩展 SDK 时

这种情况下可以直接使用 bitbake 等 Yocto 构建工具来构建额外组件:

$ bitbake curl-native
# Add newly built native items to native sysroot
$ bitbake build-sysroots -c build_native_sysroot
$ bitbake mesa
# Add newly built target items to target sysroot
$ bitbake build-sysroots -c build_target_sysroot

2 使用独立可扩展 SDK 安装程序时

$ devtool sdk-install mesa

devtool sdk-install 默认假定 SDK 提供者已经提供该组件的预构建版本。 如果没有预构建产物,而且可以接受从源码构建,则加入 “-s” 选项:

$ devtool sdk-install -s mesa

从源码构建通常比安装预构建产物耗时得多。 另外,如果要添加的组件没有配方,则必须改用 devtool add。

2 更新已安装的可扩展 SDK

如果使用的可扩展 SDK 会不定期发布更新,例如第三方提供的 SDK, 就需要手动将这些更新拉取到已经安装的 SDK 中。

使用以下命令更新:

$ devtool sdk-update

此命令假定提供者已经按照 “为已安装的可扩展 SDK 提供更新” 的说明,通过 SDK_UPDATE_URL 设置默认更新地址。 如果没有设置,就需要在命令中自行指定:

$ devtool sdk-update path_to_update_directory

备注

地址必须指向已经发布的 SDK,而不是供下载和安装的 SDK 安装程序。

2 创建包含额外组件的派生 SDK

有时需要提供包含自定义库的 SDK。例如,厂商的客户要使用 SDK 开发平台专用软件,并且需要厂商提供的自定义库。 可以基于当前安装的 SDK,按以下步骤创建派生 SDK:

  1. 根据需要,先安装一个作为派生基础的可扩展 SDK。

  2. 载入 SDK 的环境脚本。

  3. 使用 devtool add 加入所需的额外库或其他组件。

  4. 运行 devtool build-sdk。

这些步骤会使用加入 workspace 的配方,生成包含这些配方及其二进制产物的新 SDK 安装程序。 配方会放入派生 SDK 中独立的层,使 workspace 保持干净, 方便最终用户继续添加自己的配方。