gnome: libgdm (b3:46fac484) + cairo-1.0.typelib — la capa JS avanza dos muros más
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 <include> 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) <noreply@anthropic.com>
This commit is contained in:
@@ -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 `<include>` 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/
|
||||
'''
|
||||
|
||||
|
||||
@@ -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 <systemd/sd-daemon.h>` 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/
|
||||
'''
|
||||
|
||||
@@ -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"]
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user