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 文件)生成,执行以下步骤:
继承 gobject-introspection 类。
确保配方及其包含的内容没有禁用内省。同时确保 DISTRO_FEATURES_OPTED_OUT 中没有 "gobject-introspection-data", MACHINE_FEATURES_OPTED_OUT 中没有 "qemu-usermode"。任一情况存在, 都不会生成数据。
尝试构建配方。如果错误看起来是找不到
.so库,请检查库在源码树中的 位置,并在配方中添加:GIR_EXTRA_LIBS_PATH = "${B}/something/.libs"
备注
可参考
oe-core仓库中使用 GIR_EXTRA_LIBS_PATH 的配方。检查其他错误。它们通常意味着软件包的内省支持不完全符合标准,因此在 交叉编译环境中失败,需要专门修复。可以通过 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 测试镜像中的内省功能
使用以下步骤测试镜像中的内省数据生成功能:
确保 DISTRO_FEATURES_OPTED_OUT 中没有 "gobject-introspection-data", MACHINE_FEATURES_OPTED_OUT 中没有 "qemu-usermode"。
构建
core-image-sato。启动终端,再在终端中启动 Python。
输入以下内容:
>>> from gi.repository import GLib >>> GLib.get_host_name()
更进阶的示例见: 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 上工作。