From fd9f9dff6ddf9b9f15bf4917002f67c20cbc69e4 Mon Sep 17 00:00:00 2001 From: sergio Date: Wed, 29 Jul 2026 12:50:14 -0400 Subject: [PATCH] =?UTF-8?q?gnome:=20libgdm=20(b3:46fac484)=20+=20cairo-1.0?= =?UTF-8?q?.typelib=20=E2=80=94=20la=20capa=20JS=20avanza=20dos=20muros=20?= =?UTF-8?q?m=C3=A1s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dos rondas del mismo patrón, las dos destapadas ARRANCANDO: 1. `Requiring Gdk 4.0: Typelib 'cairo' 1.0 not found` ⇒ cairo-1.0 sumado a gi-foreign-typelibs. Necesita el mismo sed que gi-foreign-girs (viene como .gir.in con dos placeholders), para compilar EXACTAMENTE el XML que está instalado: si divergieran, el typelib describiría otra librería. NO segfaultea g-ir-compiler — el crash que motivó -Dbuild_introspection_data=false era del g-i de antes de la isla dinámica. La lista de cinco no se adivinó: sale de leer los de TODOS los .gir del cierre y cruzarlos contra los typelibs existentes. 2. `Requiring Gdm 1.0` ⇒ receta `libgdm`, SÓLO la librería cliente. gnome-shell la importa sin condicional (js/misc/dependencies.js:12), o sea que **la librería cliente de GDM es dep de runtime del SHELL, no del greeter** — y eso no se ve en ningún meson.build. `gdm.toml` (el demonio entero) sigue aparcada por linux-pam, pero PAM es del DEMONIO: libgdm/ no lo toca. La receta corta por ahí; cuando exista linux-pam las dos conviven. Para que libgdm compilara hicieron falta tres símbolos más en libelogind (tawasuyu 9bf977a52, re-pineado a 98db584fd, re-sellado b3:c1fc4bd8): sd_seat_get_sessions, sd_session_get_service y **sd_booted**, éste en una cabecera nueva systemd/sd-daemon.h. sd_booted NO es un stub que devuelve 0: comprueba lo mismo que systemd —que exista /run/systemd/system/— y bajo arje no está, así que responde 0 porque ES 0. gnome-shell re-sellado b3:b2d5919b por la cascada. Co-Authored-By: Claude Opus 5 (1M context) --- .../incoming-gnome/gi-foreign-typelibs.toml | 20 ++++- recipes/incoming-gnome/libelogind.toml | 5 +- recipes/incoming-gnome/libgdm.toml | 77 +++++++++++++++++++ scripts/gnome/hydrate-gnome.sh | 3 +- 4 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 recipes/incoming-gnome/libgdm.toml diff --git a/recipes/incoming-gnome/gi-foreign-typelibs.toml b/recipes/incoming-gnome/gi-foreign-typelibs.toml index 530169a7..581da5ee 100644 --- a/recipes/incoming-gnome/gi-foreign-typelibs.toml +++ b/recipes/incoming-gnome/gi-foreign-typelibs.toml @@ -22,14 +22,26 @@ # 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 de esta receta +# 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 # # 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Ó: sale de leer los `` de TODOS los .gir del cierre. Cruzados contra +# los typelibs que ya existen, los únicos huérfanos eran éstos cinco. Por eso hay una sola ronda más +# después de DBus y no una cadena de sorpresas: el cierre de includes está cerrado. +# +# 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" @@ -55,6 +67,12 @@ for g in DBus-1.0 DBusGLib-1.0 fontconfig-2.0 freetype2-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/ ''' diff --git a/recipes/incoming-gnome/libelogind.toml b/recipes/incoming-gnome/libelogind.toml index 2da61ae3..45253f5b 100644 --- a/recipes/incoming-gnome/libelogind.toml +++ b/recipes/incoming-gnome/libelogind.toml @@ -27,7 +27,7 @@ version = "0.0.1" # versiona el `Cargo.lock` de la raíz: sin él, el vendoreo `--locked` del fetch no es reproducible # (el monorepo lo gitignora en main). repo = "gitea@git.tawasuyu.net:tawasuyu/tawasuyu.git" -commit = "b56aeff46a8f707d08188f807aaabeff06faddad" +commit = "98db584fd28d9ff2bf34c9cf7d7db2e1de0b3fd0" # El monorepo COMMITEA su propio `vendor/` (`[patch.crates-io] smithay = { path = "vendor/smithay" }`, # la copia parcheada que mirada necesita para el tearing) y el `cargo vendor` de hammer escribe ahí # por defecto, pisándolo: el build muere con `failed to read /src/vendor/smithay/.cargo-checksum.json` @@ -62,5 +62,8 @@ mkdir -p /out/usr/lib/pkgconfig /out/usr/include/elogind/systemd cp target/release/libelogind.so /out/usr/lib/libelogind.so.0 ln -s libelogind.so.0 /out/usr/lib/libelogind.so cp 03_ukupacha/arje/arje-sdlogin-compat/include/systemd/sd-login.h /out/usr/include/elogind/systemd/ +# sd-daemon.h va aparte porque en systemd también son dos cabeceras y quien la usa la pide por su +# nombre: gdm hace `#include ` en common/gdm-log.c para `sd_booted()`. +cp 03_ukupacha/arje/arje-sdlogin-compat/include/systemd/sd-daemon.h /out/usr/include/elogind/systemd/ cp 03_ukupacha/arje/arje-sdlogin-compat/pkgconfig/libelogind.pc /out/usr/lib/pkgconfig/ ''' diff --git a/recipes/incoming-gnome/libgdm.toml b/recipes/incoming-gnome/libgdm.toml new file mode 100644 index 00000000..14cc2437 --- /dev/null +++ b/recipes/incoming-gnome/libgdm.toml @@ -0,0 +1,77 @@ +# libgdm 48.0 — SÓLO la librería cliente de GDM y su typelib `Gdm-1.0`, no el display manager. +# +# POR QUÉ EXISTE, y de nuevo se destapó ARRANCANDO y no compilando: gnome-shell importa `Gdm` desde +# JavaScript, y no de forma condicional —`js/misc/dependencies.js:12` hace +# `import 'gi://Gdm?version=1.0'` en el arranque, antes de cualquier lógica de sesión—. Sin el +# typelib el shell muere en: +# +# JS ERROR: Requiring Gdm, version 1.0: Typelib file for namespace 'Gdm', version '1.0' not found +# +# Además lo usan `systemActions.js` (apagar/reiniciar/cambiar de usuario), `unlockDialog.js` y todo +# `js/gdm/`. O sea que **la librería cliente de GDM es dep de runtime del SHELL**, no sólo del +# greeter, y eso no se ve en ningún meson.build. +# +# POR QUÉ NO SIRVE LA RECETA `gdm.toml`: aquélla construye el display manager ENTERO, y está aparcada +# por una razón real —`libpam_dep = cc.find_library('pam')` en meson.build:55, incondicional y sin +# `required: false`, y no hay receta de linux-pam—. Pero PAM es del DEMONIO: lo usan `daemon/` y +# `pam_gdm/`. `libgdm/` no lo toca; sus deps son glib, gio, logind y `libgdmcommon` (el estático de +# `common/`). Esta receta corta justo por ahí. Cuando exista linux-pam, `gdm.toml` sigue siendo la +# receta del demonio y ésta no estorba: instala sólo la librería, su .gir/.typelib y su .pc. +# +# LOS TRES SEDS, todos verificados contra el meson real: +# 1. `cc.find_library('pam')` → `required: false`. Sin PAM el `pam_extensions_supported` de :56 da +# falso, que a su vez hace `json-glib` opcional (:67) y saltea `subdir('pam-extensions')` (:317). +# La cadena se apaga sola; no hace falta tocar nada más. +# 2. Se borran los `subdir()` que necesitan PAM o que no aportan nada acá: daemon, utils, pam_gdm, +# po (el msgfmt de gettext-tiny — SEXTA vez), docs y `data`. Quedan `common` y `libgdm`. +# `data` es la del GREETER —perfiles dconf, autostart de orca, el gschema org.gnome.login-screen— +# y encima exige el binario `dconf` para compilar sus defaults (`data/dconf/meson.build:18`), que +# no está en el corpus. Nada de eso es la librería cliente; cuando se construya el demonio de +# verdad (gdm.toml, aparcada por PAM) volverá con él, que es su dueño. +# 3. `gnome.post_install(glib_compile_schemas: true)` se borra: meson lo saltea igual cuando hay +# DESTDIR, pero deja un WARNING por build y confunde el log. +# +# `-Dx11-support=false`: sin él el top-level pide `xcb`, `x11`, `xau` y hasta corre +# `build-aux/find-x-server.sh` para localizar el binario de Xorg (meson.build:87-93). Nada de eso +# existe acá ni va a existir — X11 está al tacho para toda la distro. Es la opción que gdm sí tiene, +# a diferencia de gnome-settings-daemon, donde GTK3/X11 son incondicionales y por eso está aparcada. +# +# `-Dlogind-provider=elogind`: gdm SÍ tiene la perilla (meson_options.txt:16) y su valor por defecto +# es `systemd`, que hace `dependency('libsystemd')` DURA (meson.build:129) y corta. No cae solo por no +# encontrar systemd.pc — hay que elegir la rama. Es exactamente el punto para el que se autoró +# arje-sdlogin-compat. Y `-Dsystemd{system,user}unitdir=no` porque acá PID1 es arje-zero. +# +# `accountsservice` es dep DURA del top-level (:69) aunque libgdm no la use: se declara y ya está +# sellada. Es la segunda vez que aparece en esta cadena. +# +# ISLA DINÁMICA (`link = "dynamic"`, `default_library=shared`): lo que se busca ES el typelib, y gjs +# dlopea la `.so` que el typelib nombra. Ver [[gnome-introspection-dinamica]]. +name = "libgdm" +version = "48.0" + +[source] +tarball = "https://download.gnome.org/sources/gdm/48/gdm-48.0.tar.xz" +sha256 = "1bc06daff093ec7b5e37ecb4f92e5da3474a1b1ba076edb9151ee967d1c30adf" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = ''' +set -e +sed -i "s/^libpam_dep = cc.find_library('pam')$/libpam_dep = cc.find_library('pam', required: false)/" meson.build +sed -i "/^subdir('data')$/d; /^subdir('daemon')$/d; /^subdir('utils')$/d; /^subdir('pam_gdm')$/d; /^subdir('po')$/d; /^subdir('docs')$/d" meson.build +sed -i "/^gnome.post_install($/,/^)$/d" meson.build +PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output \ + --prefix=/usr --buildtype=release --wrap-mode=nodownload \ + -Ddefault_library=shared -Dselinux=disabled -Dplymouth=disabled \ + -Dx11-support=false -Dlogind-provider=elogind -Dsystemd-journal=false \ + -Dsystemdsystemunitdir=no -Dsystemduserunitdir=no -Dc_args=-Wno-error=date-time +''' +compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" +install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "py3-setuptools", "gi-foreign-girs", "gobject-introspection", "glib", "glib-introspected", "accountsservice", "libelogind", "libgudev", "udev-pc", "libudev-zero", "json-glib", "libffi", "pcre2", "zlib-shared", "expat", "dbus-shared", "polkit"] diff --git a/scripts/gnome/hydrate-gnome.sh b/scripts/gnome/hydrate-gnome.sh index 042841b3..f7f821b5 100755 --- a/scripts/gnome/hydrate-gnome.sh +++ b/scripts/gnome/hydrate-gnome.sh @@ -31,7 +31,8 @@ else TARGETS=( recipes/incoming-gnome/gnome-shell.toml recipes/incoming-gnome/accountsservice.toml # imports.gi.AccountsService - recipes/incoming-gnome/gi-foreign-typelibs.toml # DBus-1.0, que Atspi-2.0 incluye + recipes/incoming-gnome/gi-foreign-typelibs.toml # DBus-1.0/cairo-1.0, que Gdk y Atspi incluyen + recipes/incoming-gnome/libgdm.toml # imports.gi.Gdm (js/misc/dependencies.js) ) fi