6 定制可扩展 SDK 独立安装程序

本附录介绍以独立安装程序形式使用可扩展 SDK 时可以进行的定制。

备注

也可以直接在 Yocto 构建中使用可扩展 SDK 的功能,从而避免生成单独的安装产物。 参见 安装可扩展 SDK。

6 配置可扩展 SDK

可扩展 SDK 主要由生成它的 OpenEmbedded 构建系统的一份预配置副本组成。 因此,SDK 的配置来自该构建系统,并经过以下过滤。存在这些过滤条件时, OpenEmbedded 构建系统会将其应用于 build/conf/local.conf 和 build/conf/auto.conf:

另外,如果存在 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 命令进行更新:

  1. 创建一个可以通过 HTTP 或 HTTPS 共享的目录。例如,在云端配置 Apache HTTP Server 或 Nginx 服务器来托管该目录。 目录必须包含已发布的 SDK。

  2. 将 SDK_UPDATE_URL 设置为对应的 HTTP 或 HTTPS URL。 设置后,构建出的 SDK 会默认使用该 URL,用户不必像 更新已安装的可扩展 SDK 一节所述那样,将 URL 传给 devtool sdk-update 命令。

  3. 正常构建可扩展 SDK(即使用 bitbake -c populate_sdk_ext imagename 命令)。

  4. 使用以下命令发布 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 添加项目,而不必从源码构建, 需要完成以下工作:

  1. 确保用户需要安装的额外项目已经构建完成:

    • 显式构建这些项目。可以使用一个或多个依赖其他配方列表的 "meta" 配方。

    • 构建 "world" 目标,并对不希望构建的配方设置 EXCLUDE_FROM_WORLD:pn-recipename。详见 EXCLUDE_FROM_WORLD。

  2. 对外提供构建生成的 sstate-cache 目录。通常可以通过 Apache HTTP Server 或 Nginx 服务器提供访问。

  3. 设置相应配置,让生成的 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, 且不希望额外安装工具链,也可以这样设置。