On Sun, 16 Apr 2023 at 13:22:57 +0200, Helmut Grohne wrote:
> when adding new general build profiles, we're supposed to consult with
> debian-devel. Thus I propose the "nogir" profile. This profile is
> supposed to skip building "gir*" packages containing typelib files.

Unfortunately, I don't think this profile as stated will be practically
useful, so I object to its addition on behalf of the GNOME team. I would
support its addition if it was practically useful, but in the current
state of the archive, it is not.

GObject-Introspection metadata for a library consists of two
files:

* a GIR XML text file like /usr/share/gir-1.0/Flatpak-1.0.gir, analogous
  to a C header, usually-but-not-always architecture-independent
  in the same way C headers are (see #905715, #1029957, etc.), and
  intended to be read by the toolchains of compiled languages like Rust
  and Vala to generate Rust/Vala/etc. bindings for the library at
  compile-time on developer systems;

* a binary typelib file like
  /usr/lib/x86_64-linux-gnu/girepository-1.0/Flatpak-1.0.typelib,
  analogous to a C library, and intended to be read by dynamic language
  runtimes like gjs or dynamic language extensions like PyGI to generate
  JavaScript/Python/etc. bindings for the library in-memory on end-user
  systems

The GObject-Introspection mini-policy currently says that GIR XML needs to be
shipped in the architecture-independent -dev package, so for example a
typical simple example is libflatpak-dev which contains:

* /usr/include/flatpak/flatpak.h (and friends)
* /usr/lib/x86_64-linux-gnu/pkgconfig/flatpak.pc
* /usr/share/gir-1.0/Flatpak-1.0.gir
* /usr/lib/x86_64-linux-gnu/libflatpak.so

If your goal is to be able to compile the runtime and -dev parts of
GLib-based libraries like libflatpak for a cross architecture to use them
as build-dependencies, then a nogir profile is not going to be helpful,
because to ship the -dev package, you still need the GIR XML.

To generate /usr/share/gir-1.0/Flatpak-1.0.gir, we need to
enable GObject-Introspection and run g-ir-scanner against the
compiled libflatpak, which is exactly the part of the build that is
non-cross-friendly: because of the way GObject-Introspection currently
works, it needs to be able to execute a host-architecture binary linked to
the just-compiled libflatpak (the "dump binary") which outputs a subset
of the runtime type information known to the GObject type system. It
can be via qemu/binfmt_misc - it doesn't need to be high-performance, or
do anything beyond minor computation and relatively basic syscalls like
stdio - but it does have to work.

Generating /usr/lib/x86_64-linux-gnu/girepository-1.0/Flatpak-1.0.typelib
and therefore gir1.2-flatpak-1.0 involves "compiling" that GIR XML into
a more efficient binary format. As far as I understand it, this doesn't
strictly need to execute host-architecture code.

If the GIR XML had always been in a separate package, like
gir1.2-flatpak-1.0-dev or something, then we could turn that
off under nogir as well; but it isn't, and splitting it would be a
backwards-incompatible change, as well as requiring *many* trips through
the NEW queue. Please see #1030223 for more information.

I do have some ideas about how this can potentially be addressed
post-bookworm (see #1030223) but so far I haven't really got far with
implementing that. I'm sorry that the number of things I've found myself
responsible for prevents me from progressing any of them particularly
quickly.

    smcv

Reply via email to