6 定制可扩展 SDK 独立安装程序
本附录介绍以独立安装程序形式使用可扩展 SDK 时可以进行的定制。
备注
也可以直接在 Yocto 构建中使用可扩展 SDK 的功能,从而避免生成单独的安装产物。 参见 安装可扩展 SDK。
6 配置可扩展 SDK
可扩展 SDK 主要由生成它的 OpenEmbedded 构建系统的一份预配置副本组成。 因此,SDK 的配置来自该构建系统,并经过以下过滤。存在这些过滤条件时, OpenEmbedded 构建系统会将其应用于 build/conf/local.conf 和 build/conf/auto.conf:
排除值以 "/" 开头的变量,因为这些值很可能是特定于 Build Host 的路径。
排除 ESDK_LOCALCONF_REMOVE 中列出的变量。 这些变量不允许从 OpenEmbedded 构建系统配置传入可扩展 SDK 的配置。 通常它们与运行构建系统的机器有关,放入可扩展 SDK 配置可能导致问题。
默认排除的变量列表见 Yocto 项目参考手册词汇表中的 ESDK_LOCALCONF_REMOVE。
包含 ESDK_LOCALCONF_ALLOW 中列出的变量。 将变量加入 ESDK_LOCALCONF_ALLOW 会覆盖前两条过滤规则。其默认值为空。
禁用通过 INHERIT 全局继承、且列在 ESDK_CLASS_INHERIT_DISABLE 中的类。对于在 SDK 环境中有问题或不需要的类,通常使用 ESDK_CLASS_INHERIT_DISABLE 禁用。默认值禁用 buildhistory 类。
另外,如果存在 conf/sdk-extra.conf,其内容会不经过滤地附加到生成的 SDK
内的 build/conf/local.conf 末尾。如果希望某个变量值只作用于
SDK,而不作用于创建 SDK 的 OpenEmbedded 构建系统,sdk-extra.conf
尤其有用。
6 根据构建主机环境调整可扩展 SDK
大多数情况下,可扩展 SDK 的默认设置能够适应 Build Host 的环境。 不过,在下列情况下可能需要调整:
如果 SDK 配置通过 INHERIT 变量继承了其他类,而你不需要或不希望 在 SDK 中启用它们,可以按上一节所述,将其加入 ESDK_CLASS_INHERIT_DISABLE 变量来禁用。
备注
ESDK_CLASS_INHERIT_DISABLE 的默认值使用 "?=" 运算符设置。 因此,你需要使用 "=" 定义完整列表,或使用 ":append"、"+=" 追加值。 这些运算符的说明见 BitBake 用户手册的 Basic Syntax 一节。
如果某些类或配方向标准构建流程添加了额外任务(任务随配方构建执行, 而非显式调用),则需要采取以下措施之一:
确认这些任务属于 共享状态 任务(其输出可以保存到共享状态缓存并从中恢复), 或者可以基于某个共享状态任务快速生成其输出,然后将任务名称加入 SDK_RECRDEP_TASKS。
如果任务由某个类添加,而可扩展 SDK 不需要该类的功能,则禁用这些任务。 方法是按上一节所述,将该类加入 ESDK_CLASS_INHERIT_DISABLE。
通常应配置共享状态镜像,使 SDK 用户在安装后能够添加其他项目, 而不必从源码构建。详见 提供可额外安装的可扩展 SDK 内容。
如果希望 SDK 用户可以方便地更新 SDK,需要设置 SDK_UPDATE_URL。 详见 为已安装的可扩展 SDK 提供更新。
如果调整了 COREBASE 中的文件和目录列表(通过 build/conf/bblayers.conf 启用的层除外),必须将这些文件列入 COREBASE_FILES,以便复制到 SDK 中。
如果 OpenEmbedded 构建系统使用的环境设置脚本不是 oe-init-build-env,必须设置 OE_INIT_ENV_SCRIPT 指向实际使用的环境设置脚本。
备注
还必须相应调整前面所述的 COREBASE_FILES 变量值。
6 修改可扩展 SDK 安装程序标题
设置 SDK_TITLE 并重新构建 SDK 安装程序,即可修改安装程序显示的标题。 有关构建 SDK 安装程序的说明,参见 构建 SDK 安装程序。
默认情况下,如果设置了 DISTRO_NAME,标题就来自该变量; 否则来自 DISTRO。
populate_sdk_base 类按以下方式定义 SDK_TITLE 的默认值:
SDK_TITLE ??= "${@d.getVar('DISTRO_NAME') or d.getVar('DISTRO')} SDK"
修改该变量的方法有多种,一种有效的方式是在发行版配置文件中设置它。
这样,标题就适用于整个发行版。例如,假设你的发行版有自己的层
"meta-mydistro",并采用与默认 "poky" 发行版相同的文件层次结构,
则可以在 ~/meta-mydistro/conf/distro/mydistro.conf 中按以下形式更新
SDK_TITLE:
SDK_TITLE = "your_title"
6 为已安装的可扩展 SDK 提供更新
修改配置或元数据后,如果希望已安装的 SDK 也体现这些变化,需要执行以下额外步骤。
这样,使用已安装 SDK 的用户就可以通过 devtool sdk-update 命令进行更新:
创建一个可以通过 HTTP 或 HTTPS 共享的目录。例如,在云端配置 Apache HTTP Server 或 Nginx 服务器来托管该目录。 目录必须包含已发布的 SDK。
将 SDK_UPDATE_URL 设置为对应的 HTTP 或 HTTPS URL。 设置后,构建出的 SDK 会默认使用该 URL,用户不必像 更新已安装的可扩展 SDK 一节所述那样,将 URL 传给
devtool sdk-update命令。正常构建可扩展 SDK(即使用
bitbake -c populate_sdk_extimagename 命令)。使用以下命令发布 SDK:
$ oe-publish-sdk some_path/sdk-installer.sh path_to_shared_http_directory
每次重新构建 SDK,且希望通过更新机制提供其中的变更时,都必须重复此步骤。
完成上述步骤后,现有 SDK 用户只需运行 devtool sdk-update
即可获取并应用最新更新。更多信息见
更新已安装的可扩展 SDK。
6 修改 SDK 的默认安装目录
构建可扩展 SDK 安装程序时,SDK 的默认安装目录由 populate_sdk_base 类中的 DISTRO 和 SDKEXTPATH 决定:
SDKEXTPATH ??= "~/${@d.getVar('DISTRO')}_sdk"
显式设置 SDKEXTPATH 即可修改默认安装目录。
设置该变量的方法有多种,最合理的方式是在发行版配置文件中设置。
这样,默认安装目录就适用于整个发行版。例如,假设你的发行版有自己的层
"meta-mydistro",并采用与默认 "poky" 发行版相同的文件层次结构,
则可以在 ~/meta-mydistro/conf/distro/mydistro.conf 中按以下形式更新
SDKEXTPATH:
SDKEXTPATH = "some_path_for_your_installed_sdk"
构建安装程序后,运行它时会询问用户是否接受 some_path_for_your_installed_sdk 目录作为可扩展 SDK 的默认安装位置。
6 提供可额外安装的可扩展 SDK 内容
如果希望用户能够向你构建的可扩展 SDK 添加项目,而不必从源码构建, 需要完成以下工作:
确保用户需要安装的额外项目已经构建完成:
显式构建这些项目。可以使用一个或多个依赖其他配方列表的 "meta" 配方。
构建 "world" 目标,并对不希望构建的配方设置
EXCLUDE_FROM_WORLD:pn-recipename。详见 EXCLUDE_FROM_WORLD。
对外提供构建生成的
sstate-cache目录。通常可以通过 Apache HTTP Server 或 Nginx 服务器提供访问。设置相应配置,让生成的 SDK 知道如何找到它。需要设置的变量是 SSTATE_MIRRORS:
SSTATE_MIRRORS = "file://.* https://example.com/some_path/sstate-cache/PATH"
可以在两个不同的位置设置 SSTATE_MIRRORS:
如果同一镜像值适用于实际构建 SDK 的 OpenEmbedded 构建系统和 SDK 本身 (即两边都能访问该镜像,或者构建系统端会快速失败,且镜像内容不会干扰构建), 可以在 build/conf/local.conf 或自定义发行版配置中设置。 然后添加以下内容,将该变量传入 SDK:
ESDK_LOCALCONF_ALLOW = "SSTATE_MIRRORS"
如果只想为 SDK 设置 SSTATE_MIRRORS,可以在 Build Directory 或任意层中创建
conf/sdk-extra.conf,并在其中设置该变量。备注
如果不确定应选哪种方法设置 SSTATE_MIRRORS,第二种方法最稳妥。
6 缩小可扩展 SDK 安装程序的下载大小
默认情况下,可扩展 SDK 会打包重建其对应镜像所需的全部共享状态产物,
安装程序可能达到 1 GB 甚至更大。如果这个体积带来问题,可以在配置中加入以下设置,
构建一个仅包含安装并使用 devtool command 所需内容的 SDK:
SDK_EXT_TYPE = "minimal"
将 SDK_EXT_TYPE 设为 "minimal" 后,生成的 SDK 安装程序约为 35 MB,
下载和安装都很快。但最小安装程序本身不安装任何库或工具。
这些库和工具必须按需安装,或者通过 devtool 操作、
显式运行 devtool sdk-install 命令来安装。
多数情况下,构建最小 SDK 时,还需要启用导入系统生成的更广泛的软件包信息。
尤其是 devtool add,需要这些信息才能有效地将源码树中发现的依赖映射到对应配方。
这些信息也使 devtool search 能返回有用的结果。
要提供这些更全面的信息,需要设置:
SDK_INCLUDE_PKGDATA = "1"
更多信息见 SDK_INCLUDE_PKGDATA。
如上设置 SDK_INCLUDE_PKGDATA 会构建 "world" 目标, 以便提供其中所有配方的信息。这会显著增加构建时间; 根据配置中包含的配方数量,SDK 安装程序也会增大 30–80 MB。
可以使用 EXCLUDE_FROM_WORLD:pn-recipename 排除不需要的配方。
不过,如果要向 SDK 提供额外项目,通常本来就需要构建 "world",
因此多数情况下这不会产生过多额外开销。
备注
如果将 SDK_EXT_TYPE 设为 "minimal",就必须提供共享状态镜像, 以便按需安装项目。详见 提供可额外安装的可扩展 SDK 内容。
构建 SDK 时,将 SDK_INCLUDE_TOOLCHAIN 设为 "1", 可以显式要求包含工具链。尤其是在 SDK_EXT_TYPE 为 "minimal" 时, 默认不包含工具链,此设置很有用。如果你为 IDE 或其他工具构建小型 SDK, 且不希望额外安装工具链,也可以这样设置。