22 启用 GObject 内省支持

GObject 内省 是运行时环境访问基于 GObject 的软件的标准机制。GObject 是 GLib 库的一项功能,为 GNOME 桌面及 相关软件提供对象框架。GObject 内省向 GObject 添加信息,使其中创建的对象 能够在不同编程语言中表示。要使用 Python 构建 GStreamer 管线,或使用 Javascript 和 GUPnP 控制 UPnP 基础设施,必须借助 GObject 内省。

本节介绍 Yocto Project 对生成和打包 GObject 内省数据的支持。内省数据描述 基于 GLib 框架,特别是其 GObject 机制构建的库所提供的 API。GObject Introspection Repository(GIR)文件放入 -dev 软件包;typelib 文件 则与被内省的库一起放入主软件包。

这些数据在构建库时生成:将库链接到一个小型可执行二进制程序,由该程序请求 库描述自身,再运行程序并处理其输出。

在交叉编译环境中生成这些数据较为困难,因为库面向目标架构生成,但代码需要 在构建主机上执行。OpenEmbedded 构建系统通过 QEMU 运行代码来解决这个问题。 不过 QEMU 并不总能正常工作,见 “已知问题” 一节。

22 启用内省数据生成

要为库软件包启用内省数据(GIR 文件)生成,执行以下步骤:

  1. 继承 gobject-introspection 类。

  2. 确保配方及其包含的内容没有禁用内省。同时确保 DISTRO_FEATURES_OPTED_OUT 中没有 "gobject-introspection-data", MACHINE_FEATURES_OPTED_OUT 中没有 "qemu-usermode"。任一情况存在, 都不会生成数据。

  3. 尝试构建配方。如果错误看起来是找不到 .so 库,请检查库在源码树中的 位置,并在配方中添加:

    GIR_EXTRA_LIBS_PATH = "${B}/something/.libs"
    

    备注

    可参考 oe-core 仓库中使用 GIR_EXTRA_LIBS_PATH 的配方。

  4. 检查其他错误。它们通常意味着软件包的内省支持不完全符合标准,因此在 交叉编译环境中失败,需要专门修复。可以通过 Yocto Project 邮件列表 寻求帮助。

备注

如果某个库无法在最新 Yocto Project 发行版中构建,并输出内省相关错误, 可以尝试上述排查流程。

22 禁用内省数据生成

如果不希望生成内省数据,或者 QEMU 无法在所用构建主机与目标架构组合上正常 工作,可以用以下任一方式禁用 GIR 文件生成:

  • 在发行版配置中添加:

    DISTRO_FEATURES_OPTED_OUT = "gobject-introspection-data"
    

    此语句禁止通过 QEMU 生成内省数据,但仍允许构建内省工具和库,因为构建 它们不需要 QEMU。

  • 在机器配置中添加:

    MACHINE_FEATURES_OPTED_OUT = "qemu-usermode"
    

    此语句禁止在为该机器构建软件包时使用 QEMU。目前该功能仅由内省配方使用, 因此效果与前一种方式相同。

    备注

    未来的 Yocto Project 版本可能有其他功能受此选项影响。

禁用内省数据后,仍可通过其他方式获得,例如从合适的系统根目录复制,或在 目标硬件上生成。OpenEmbedded 构建系统目前没有为这些方法提供专门支持。

22 测试镜像中的内省功能

使用以下步骤测试镜像中的内省数据生成功能:

  1. 确保 DISTRO_FEATURES_OPTED_OUT 中没有 "gobject-introspection-data", MACHINE_FEATURES_OPTED_OUT 中没有 "qemu-usermode"。

  2. 构建 core-image-sato。

  3. 启动终端,再在终端中启动 Python。

  4. 输入以下内容:

    >>> from gi.repository import GLib
    >>> GLib.get_host_name()
    
  5. 更进阶的示例见: https://python-gtk-3-tutorial.readthedocs.io/en/latest/introduction.html

22 已知问题

GObject 内省支持存在以下已知问题:

  • qemu-ppc64 会立即崩溃,因此无法为该架构构建内省数据。

  • QEMU 不支持 x32,因此禁用了内省数据。

  • musl 会使临时 GLib 二进制程序因断言失败而崩溃,因此禁用了内省数据生成。

  • 由于 QEMU 无法正确运行二进制程序,某些架构上的特定软件包禁用了内省, 例如 gcr、libsecret 和 webkit。

  • 在 32 位主机上运行 64 位二进制程序时,QEMU 用户模式可能无法正常工作。 特别是已知 "qemumips64" 无法在 i686 上工作。