# 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 ``, 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 `` 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"]