| .. SPDX-License-Identifier: CC-BY-SA-2.0-UK |
| |
| Enabling GObject Introspection Support |
| ************************************** |
| |
| `GObject introspection <https://gi.readthedocs.io/en/latest/>`__ |
| is the standard mechanism for accessing GObject-based software from |
| runtime environments. GObject is a feature of the GLib library that |
| provides an object framework for the GNOME desktop and related software. |
| GObject Introspection adds information to GObject that allows objects |
| created within it to be represented across different programming |
| languages. If you want to construct GStreamer pipelines using Python, or |
| control UPnP infrastructure using Javascript and GUPnP, GObject |
| introspection is the only way to do it. |
| |
| This section describes the Yocto Project support for generating and |
| packaging GObject introspection data. GObject introspection data is a |
| description of the API provided by libraries built on top of the GLib |
| framework, and, in particular, that framework's GObject mechanism. |
| GObject Introspection Repository (GIR) files go to ``-dev`` packages, |
| ``typelib`` files go to main packages as they are packaged together with |
| libraries that are introspected. |
| |
| The data is generated when building such a library, by linking the |
| library with a small executable binary that asks the library to describe |
| itself, and then executing the binary and processing its output. |
| |
| Generating this data in a cross-compilation environment is difficult |
| because the library is produced for the target architecture, but its |
| code needs to be executed on the build host. This problem is solved with |
| the OpenEmbedded build system by running the code through QEMU, which |
| allows precisely that. Unfortunately, QEMU does not always work |
| perfectly as mentioned in the ":ref:`dev-manual/gobject-introspection:known issues`" |
| section. |
| |
| Enabling the Generation of Introspection Data |
| ============================================= |
| |
| Enabling the generation of introspection data (GIR files) in your |
| library package involves the following: |
| |
| #. Inherit the :ref:`ref-classes-gobject-introspection` class. |
| |
| #. Make sure introspection is not disabled anywhere in the recipe or |
| from anything the recipe includes. Also, make sure that |
| "gobject-introspection-data" is not in |
| :term:`DISTRO_FEATURES_BACKFILL_CONSIDERED` |
| and that "qemu-usermode" is not in |
| :term:`MACHINE_FEATURES_BACKFILL_CONSIDERED`. |
| In either of these conditions, nothing will happen. |
| |
| #. Try to build the recipe. If you encounter build errors that look like |
| something is unable to find ``.so`` libraries, check where these |
| libraries are located in the source tree and add the following to the |
| recipe:: |
| |
| GIR_EXTRA_LIBS_PATH = "${B}/something/.libs" |
| |
| .. note:: |
| |
| See recipes in the ``oe-core`` repository that use that |
| :term:`GIR_EXTRA_LIBS_PATH` variable as an example. |
| |
| #. Look for any other errors, which probably mean that introspection |
| support in a package is not entirely standard, and thus breaks down |
| in a cross-compilation environment. For such cases, custom-made fixes |
| are needed. A good place to ask and receive help in these cases is |
| the :ref:`Yocto Project mailing |
| lists <resources-mailinglist>`. |
| |
| .. note:: |
| |
| Using a library that no longer builds against the latest Yocto |
| Project release and prints introspection related errors is a good |
| candidate for the previous procedure. |
| |
| Disabling the Generation of Introspection Data |
| ============================================== |
| |
| You might find that you do not want to generate introspection data. Or, |
| perhaps QEMU does not work on your build host and target architecture |
| combination. If so, you can use either of the following methods to |
| disable GIR file generations: |
| |
| - Add the following to your distro configuration:: |
| |
| DISTRO_FEATURES_BACKFILL_CONSIDERED = "gobject-introspection-data" |
| |
| Adding this statement disables generating introspection data using |
| QEMU but will still enable building introspection tools and libraries |
| (i.e. building them does not require the use of QEMU). |
| |
| - Add the following to your machine configuration:: |
| |
| MACHINE_FEATURES_BACKFILL_CONSIDERED = "qemu-usermode" |
| |
| Adding this statement disables the use of QEMU when building packages for your |
| machine. Currently, this feature is used only by introspection |
| recipes and has the same effect as the previously described option. |
| |
| .. note:: |
| |
| Future releases of the Yocto Project might have other features |
| affected by this option. |
| |
| If you disable introspection data, you can still obtain it through other |
| means such as copying the data from a suitable sysroot, or by generating |
| it on the target hardware. The OpenEmbedded build system does not |
| currently provide specific support for these techniques. |
| |
| Testing that Introspection Works in an Image |
| ============================================ |
| |
| Use the following procedure to test if generating introspection data is |
| working in an image: |
| |
| #. Make sure that "gobject-introspection-data" is not in |
| :term:`DISTRO_FEATURES_BACKFILL_CONSIDERED` |
| and that "qemu-usermode" is not in |
| :term:`MACHINE_FEATURES_BACKFILL_CONSIDERED`. |
| |
| #. Build ``core-image-sato``. |
| |
| #. Launch a Terminal and then start Python in the terminal. |
| |
| #. Enter the following in the terminal:: |
| |
| >>> from gi.repository import GLib |
| >>> GLib.get_host_name() |
| |
| #. For something a little more advanced, enter the following see: |
| https://python-gtk-3-tutorial.readthedocs.io/en/latest/introduction.html |
| |
| Known Issues |
| ============ |
| |
| Here are know issues in GObject Introspection Support: |
| |
| - ``qemu-ppc64`` immediately crashes. Consequently, you cannot build |
| introspection data on that architecture. |
| |
| - x32 is not supported by QEMU. Consequently, introspection data is |
| disabled. |
| |
| - musl causes transient GLib binaries to crash on assertion failures. |
| Consequently, generating introspection data is disabled. |
| |
| - Because QEMU is not able to run the binaries correctly, introspection |
| is disabled for some specific packages under specific architectures |
| (e.g. ``gcr``, ``libsecret``, and ``webkit``). |
| |
| - QEMU usermode might not work properly when running 64-bit binaries |
| under 32-bit host machines. In particular, "qemumips64" is known to |
| not work under i686. |
| |