# gi-foreign-typelibs — compila a TYPELIB los .gir foráneos escritos a mano que trae
# gobject-introspection, y nada más.
#
# QUÉ RESUELVE, y cómo se destapó: gnome-shell arranca, expone `wayland-0` y su capa JS muere en
#
#   JS ERROR: Requiring Atspi, version 2.0: Typelib file for namespace 'DBus', version '1.0' not found
#
# `Atspi-2.0.gir` declara `<include name="DBus" version="1.0"/>`, y a diferencia del scanner —que se
# conforma con el XML— **gjs necesita el TYPELIB compilado en runtime**. `gi-foreign-girs` ya pone el
# `DBus-1.0.gir` en /usr/share/gir-1.0, pero un .gir no es un typelib.
#
# POR QUÉ UNA RECETA APARTE Y NO AGREGARLE EL COMPILE A gi-foreign-girs: `yupana radio
# gi-foreign-girs` da **17 sellados cayendo a deuda** en la cola incoming-gnome —incluidos mutter y
# gnome-shell—, porque catorce recetas la declaran para escanear. Compilar cuatro typelibs no
# justifica reconstruir la cima. Esta receta no la pisa: instala sólo en girepository-1.0, mientras
# que aquélla instala sólo en gir-1.0, así que las dos conviven en el mismo cierre. Es el mismo
# criterio que separó `udev-pc` de `libudev-zero`.
#
# QUÉ SE COMPILA Y QUÉ NO: los .gir de gobject-introspection se parten en dos grupos. Los que sólo
# dependen de GLib/GObject —o de nada— compilan sin más; los de X11 (xlib, xft, xfixes, xrandr) y
# cairo arrastran includes que no tenemos y son además los que hacían SIGSEGV a g-ir-compiler, que es
# la razón por la que nuestro g-i va con `-Dbuild_introspection_data=false`
# (ver [[gnome-introspection-dinamica]]). Acá se compila el PRIMER grupo, nombrado explícitamente:
#
#   DBus-1.0        ← el que pide Atspi, y el motivo original de esta receta
#   DBusGLib-1.0    ← su compañero; algunas .gir de la era GTK3 lo incluyen
#   fontconfig-2.0  ← lo incluye Pango
#   freetype2-2.0   ← lo incluye HarfBuzz y Pango
#   cairo-1.0       ← lo incluyen Gdk-4.0, Pango-1.0 y PangoCairo-1.0
#   GL-1.0          ← lo incluyen Clutter-16 y Cogl-16, o sea que sin él no carga `Meta`
#   libxml2-2.0     ← lo incluyen Camel-1.2, EBook-1.2 y EDataServer-1.2 (evolution-data-server)
#
# No se ponen en un glob a propósito: un glob metería los de X11 y el build fallaría a lo lejos, o
# peor, produciría typelibs rotos. La lista es corta y explícita para que se vea qué entra.
#
# LA LISTA NO SE ADIVINÓ, y la forma de sacarla es lo reusable: se leen los `<include>` de TODOS los
# .gir del rootfs hidratado —incluidos los PRIVADOS de mutter y del shell, que están fuera de
# /usr/share/gir-1.0— y se cruzan contra los typelibs presentes. Lo que queda es la lista exacta.
#
# La primera vez lo hice sólo sobre los girs del sistema y me faltaron GL-1.0 y libxml2-2.0, que
# entran por `Clutter-16`/`Cogl-16` (⇒ sin GL no carga `Meta`, o sea el compositor entero) y por
# `Camel`/`EBook`/`EDataServer`. Un ciclo de imagen+arranque perdido por auditar de menos.
#
# `xlib-2.0` NO entra aunque figure como huérfano: lo incluye únicamente `xft-2.0`, que a su vez no
# lo incluye nadie. Es un .gir presente sin consumidor, no una falta.
#
# cairo-1.0 es el único que necesita trato especial, y por la misma razón que en gi-foreign-girs: no
# viene como `.gir` sino como `.gir.in`, con dos placeholders que g-i sustituye por configure_file.
# Se reproduce la sustitución con el mismo sed, para que el XML que se compila sea idéntico al que ya
# está instalado en /usr/share/gir-1.0 (si divergieran, el typelib describiría otra librería).
# Se compila con nuestro g-ir-compiler y NO segfaultea: el crash que motivó
# `-Dbuild_introspection_data=false` era del g-i de antes de la isla dinámica.
#
# EL `--includedir` apunta a /usr/share/gir-1.0 (lo que puso gi-foreign-girs) para que g-ir-compiler
# resuelva los includes de un .gir contra los otros .gir del sistema.
name    = "gi-foreign-typelibs"
version = "1.84.0"

[source]
# El mismo tarball que gi-foreign-girs: los .gir salen de ahí. No se compila nada del proyecto.
tarball = "https://download.gnome.org/sources/gobject-introspection/1.84/gobject-introspection-1.84.0.tar.xz"
sha256  = "945b57da7ec262e5c266b89e091d14be800cc424277d82a02872b7d794a84779"

[build]
compiler = "zig-cc"
target   = "x86_64-linux-musl"
link     = "dynamic"

[build.phases]
configure = "true"
compile   = "true"
install   = '''
set -e
mkdir -p /out/usr/lib/girepository-1.0
for g in DBus-1.0 DBusGLib-1.0 fontconfig-2.0 freetype2-2.0 GL-1.0 libxml2-2.0; do
  g-ir-compiler --includedir=/usr/share/gir-1.0 \
    -o "/out/usr/lib/girepository-1.0/$g.typelib" "gir/$g.gir"
done
# cairo-1.0: mismo sed que gi-foreign-girs, para compilar EXACTAMENTE el XML que está instalado.
sed -e 's/@CAIRO_GIR_PACKAGE@/cairo-gobject/g' \
    -e 's/@CAIRO_SHARED_LIBRARY@/libcairo-gobject.so.2/g' \
    gir/cairo-1.0.gir.in > cairo-1.0.gir
g-ir-compiler --includedir=/usr/share/gir-1.0 \
  -o /out/usr/lib/girepository-1.0/cairo-1.0.typelib cairo-1.0.gir
ls -l /out/usr/lib/girepository-1.0/
'''

[deps]
build = ["gobject-introspection", "gi-foreign-girs", "glib", "glib-introspected", "libffi", "pcre2", "zlib-shared"]
