gnome: la frontera de runtime MEDIDA — 7 typelibs, 6 proveedores, y la regla que la destapó

Venía cerrando typelibs de a uno: AccountsService → DBus-1.0 → cairo-1.0 → Gdm-1.0,
un rebuild de imagen y un arranque completo por cada uno. Cuatro rondas para
descubrir que la lista estaba escrita todo el tiempo.

`js/misc/dependencies.js` de gnome-shell ENUMERA lo que el shell exige al arrancar.
Cruzada contra el rootfs hidratado, la frontera completa es exacta:

  GnomeDesktop-4.0 + GnomeBG-4.0  → gnome-desktop (YA sellada, pero -Dintrospection=false
                                     y estática ⇒ falta la variante de isla dinámica)
  Geoclue-2.0                     → geoclue      (sin receta)
  GWeather-4.0                    → libgweather  (sin receta)
  IBus-1.0                        → ibus         (sin receta)
  Rsvg-2.0                        → librsvg      (sin receta; es Rust)
  UPowerGlib-1.0                  → upower       (sin receta)

Los otros veinte de la lista ya están. GnomeBluetooth, NM/NMA4 y Malcontent son
condicionales y no bloquean.

REGLA, y es el precio de no haberla aplicado antes: cuando el muro es `Requiring X`,
no cierres X y vuelvas a arrancar — leé el fichero donde el programa DECLARA sus deps
de runtime y cerralas todas de una.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-29 13:02:51 -04:00
co-authored by Claude Opus 5
parent e73d205f4a
commit cde77a8c91
+41 -15
View File
@@ -48,19 +48,37 @@ gdb -batch -q -ex "set sysroot $PWD/work/gnome-qemu-rootfs" \
-ex "core-file /tmp/core.gnome-shell" -ex "bt 25" work/gnome-qemu-rootfs/usr/bin/gnome-shell
```
## EL MURO DE HOY — el typelib de AccountsService
## EL MURO DE HOY — los typelibs de runtime de la capa JS
```
Gjs-CRITICAL: JS ERROR: Error: Requiring AccountsService, version 1.0:
Typelib file for namespace 'AccountsService', version '1.0' not found
Execution of main.js threw exception → gnome-shell sale con código 1
```
No es un cuelgue ni un crash: el compositor sube, expone `wayland-0`, y el shell sale con código 1
porque a `imports.gi.*` le falta un typelib. Cada vez que se cierra uno, aparece el siguiente.
No es un cuelgue: es una dep de RUNTIME que falta. La receta está escrita y medida en
`recipes/incoming-gnome/accountsservice.toml` y **no sella todavía** por dos huecos de NUESTRA capa
de compatibilidad, contados símbolo por símbolo en el comentario de esa receta: ocho símbolos
`sd-*` que `libelogind` no exporta (los cinco `sd_login_monitor_*` son una API de notificación, no
getters) y `fgetspent_r`, que es extensión de glibc y musl no tiene.
**Y ESA ITERACIÓN ES INNECESARIA — la lista está declarada en el propio shell.**
`js/misc/dependencies.js` enumera EXACTAMENTE lo que el shell exige al arrancar. Cruzada contra el
rootfs hidratado, la frontera completa es de **siete typelibs**, de cinco recetas nuevas y una a
rehacer (medido, no estimado):
| typelib | lo provee | estado |
|---|---|---|
| `GnomeDesktop-4.0`, `GnomeBG-4.0` | `gnome-desktop` | **ya sellada, pero con `-Dintrospection=false` y estática** ⇒ hace falta la variante de isla dinámica |
| `Geoclue-2.0` | geoclue | sin receta |
| `GWeather-4.0` | libgweather | sin receta |
| `IBus-1.0` | ibus | sin receta |
| `Rsvg-2.0` | librsvg | sin receta (**es Rust**) |
| `UPowerGlib-1.0` | upower | sin receta |
Lo demás de esa lista ya está: AccountsService, Atk, Atspi, Gcr, Gdk, Gdm, Gio, GioUnix,
GDesktopEnums, GdkPixbuf, Graphene, Pango, Polkit, PolkitAgent, Soup, y los cinco de mutter/shell
(Meta, Clutter, Cogl, Shell, St). `GnomeBluetooth`, `NM`/`NMA4` y `Malcontent` son condicionales de
compilación o de runtime y no bloquean.
**La regla que sale de acá, y es el precio de no haberla aplicado antes: cuando el muro es
`Requiring X`, no cierres X y vuelvas a arrancar — leé el fichero donde el programa DECLARA sus
dependencias de runtime y cerralas todas de una.** Cada ronda de este bucle cuesta un rebuild de
imagen y un arranque completo.
Cerrados por este camino hasta hoy, en orden: `AccountsService``DBus-1.0` (que incluye `Atspi`) →
`cairo-1.0` (que incluyen `Gdk` y `Pango`) → `Gdm-1.0`.
## CÓMO CAYÓ EL MURO ANTERIOR — la hebra de input (cerrado 2026-07-29)
@@ -134,12 +152,20 @@ elige `/dev/dri/card0` como primaria sin quejarse. Es el rédito directo de la c
## Lo que falta, en orden
1. **`AccountsService`** (el muro de hoy): cerrar los ocho símbolos `sd-*` en `arje-sdlogin-compat`
y `fgetspent_r`, sellar `accountsservice`, y hidratar su typelib. Ojo al costo: re-sellar
`libelogind` re-hashea todo lo que lo declara (mutter, gnome-shell, polkit…) ⇒ pasar
`yupana radio libelogind` ANTES de tocarlo.
1. **Los seis proveedores de typelib de la tabla de arriba**, en una sola tanda. `gnome-desktop`
dinámica+introspectada primero (ya está sellada, sólo cambia el modo), después geoclue,
libgweather, upower, librsvg e ibus. Ojo al costo de `libelogind`: re-sellarla re-hashea todo lo
que la declara (mutter, gnome-shell…) ⇒ pasar `yupana radio libelogind` ANTES de tocarla — ya
pasó dos veces en esta campaña.
2. **Empaquetar la política D-Bus de login1** dentro del artefacto de arje-logind-compat (hoy la
escribe el script de imagen).
3. Arreglar el `identity mismatch` del `Announce` al bus del fractal (hoy sólo un WARN).
4. Con la capa JS viva: validar CON PANTALLA (`DISP=gtk`), nunca sólo por serial — regla heredada de
KDE ([[metal-dual-desktop-en-curso]]).
## Recetas nuevas de esta etapa
`accountsservice` (b3:0328b0d0, + parche `fgetspent_r` para musl) · `gi-foreign-typelibs`
(b3:c8a4d2f8 — un `.gir` NO es un typelib: gjs resuelve contra el compilado) · `libgdm`
(b3:46fac484 — sólo la librería cliente; el demonio sigue aparcado por linux-pam).
`libelogind` pasó de 14 a 25 símbolos en tres tandas.