gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1471Shell 173Rust 105Markdown 943545 Definitions

⎇ 3d79cdf98b9085ee55e2dad8e91b96761772a680 recipes/incoming-gnome/accountsservice.toml TOML · 118 lines · 8.5 KB History raw

SDD 30 4c: GNOME con los demonios supervisados por arje — y el control arregló colord 3d79cdf98 · Sergio ·

1# accountsservice 23.13.9 — el servicio D-Bus de cuentas de usuario (nombre, avatar, idioma, si es
2# administrador). Lo pide gnome-shell desde JAVASCRIPT, no desde C: por eso no aparecía en el
3# meson.build de la cima ni en su cierre de build, y sólo se destapó ARRANCANDO la sesión:
4#
5#   Gjs-CRITICAL: JS ERROR: Requiring AccountsService, version 1.0:
6#                 Typelib file for namespace 'AccountsService', version '1.0' not found
7#   Execution of main.js threw exception
8#
9# Lección del método: **el cierre de BUILD no es el cierre de RUNTIME**. gnome-shell selló con
10# 108/108 recetas y aun así le falta esto, porque `imports.gi.AccountsService` se resuelve en tiempo
11# de ejecución. Toda dep que el shell cargue por typelib desde JS es invisible al build.
12#
13# -Delogind=true es la pieza que hace que esto entre gratis: accountsservice pide `libsystemd` por
14# defecto (meson.build:219) y con esta opción pide `libelogind` (:217), que YA está sellada —
15# arje-sdlogin-compat, con Version 255 en su .pc, por encima del >= 229.4 que exige. Es la quinta vez
16# en la campaña que la C-ABI de logind aparece, y la primera que se resuelve sin esquivarla.
17#
18# Apagados:
19#   -Dvapi=false      → no hay valac en el corpus.
20#   -Ddocbook=false -Dgtk_doc=false → xmlto/gtk-doc.
21#   -Dsystemdsystemunitdir=no  → no instala units de systemd; acá PID1 es arje-zero. Ojo: el valor
22#                        tiene que ser literalmente `no`, NO la cadena vacía — con vacía el meson
23#                        interpreta "averiguá el directorio" y ASERTA pidiendo systemd.pc (:183).
24# libxcrypt es `required: false` (meson.build:161) ⇒ no hace falta receta: sin ella el servicio no
25# cambia contraseñas, que no es lo que el shell le pide (le pide el usuario y su avatar).
26#
27# `generate-version.sh` se reemplaza por un `echo` de la versión. El script del tarball deriva la
28# versión del NOMBRE DEL DIRECTORIO (`basename $PWD | sed 's/^accountsservice-\(.*\)$/\1/'`), y en el
29# sandbox de takana el árbol de fuentes es `/src` ⇒ no matchea y aborta con "Version unknown". Fijarla
30# además la vuelve DETERMINISTA: la otra rama del script (la de checkout git) calcula la versión con
31# `date` sobre el último commit, que es exactamente lo que un store direccionable por contenido no
32# puede tolerar.
33#
34# El otro sed borra una ASERCIÓN sobre wtmp (meson.build:107). accountsservice busca el fichero de
35# histórico de logins probando `WTMPX_FILENAME` y `_PATH_WTMPX`; **musl no define ninguno de los dos**
36# —no implementa wtmp—, así que cae a la rama final, que exige que `/var/log/utx.log` EXISTA en el
37# constructor y aborta si no. Se borra sólo la línea del assert: la rama igual deja
38# `PATH_WTMP='/var/log/utx.log'`, o sea que el servicio vigila esa ruta y, como nunca aparece, no
39# reporta histórico de sesiones. Lo que el shell le pide —el usuario, su nombre y su avatar— no
40# depende de wtmp. La alternativa era `touch` ese fichero en el sandbox para que el chequeo pasara,
41# que es hacer verdadera una premisa falsa; preferible borrar el chequeo y decir por qué.
42#
43# Y un tercer sed saca `subdir('tests')` (:235), que accountsservice no expone como opción. No es por
44# ahorrar tiempo de build: los tests arrastran el subproyecto `mocklibc`, que llama `fgetgrent()` —
45# una extensión GNU que **musl no implementa**. No hay forma de compilarlo acá, y lo que se pierde es
46# la suite del upstream, no la librería.
47#
48# El sed saca `subdir('po')`. QUINTA vez que el msgfmt de gettext-tiny obliga a esto (iso-codes, gcr,
49# eds, gnome-shell y ahora ésta). Ya no es un gotcha: es la deuda de autorar el gettext de GNU.
50#
51# ISLA DINÁMICA: -Dintrospection=true + shared, porque lo que falta es justamente el TYPELIB.
52#
53# ══ LOS DOS HUECOS QUE HUBO QUE TAPAR, Y NINGUNO ERA DE accountsservice ═════════════════════════
54# El configure pasaba entero desde el principio; lo que cortaba era el COMPILE, por dos motivos
55# independientes, los dos de NUESTRA capa de compatibilidad. Se cuentan acá porque el trabajo real
56# de esta receta está afuera de ella:
57#
58# 1. LA C-ABI DE sd-login SE QUEDABA CORTA. `libelogind` (arje-sdlogin-compat) exportaba 14 símbolos
59#    —los que necesitaba mutter— y accountsservice usa OCHO que no estaban:
60#      sd_get_sessions · sd_seat_can_multi_session · sd_session_get_display
61#      sd_login_monitor (el tipo) · sd_login_monitor_new · sd_login_monitor_unref
62#      sd_login_monitor_get_fd · sd_login_monitor_flush
63#    Los cinco de `sd_login_monitor_*` eran la parte con enjundia: no son getters sobre ficheros sino
64#    una API de NOTIFICACIÓN (un fd que se mete en un poll y despierta cuando cambia el estado de
65#    sesiones). Implementados con inotify sobre /run/systemd/{sessions,seats,users}, que es donde
66#    vive ese estado. Ahora libelogind exporta 22.
67#
68# 2. `fgetspent_r` NO EXISTE EN musl (extensión de glibc; la usa src/daemon.c:265). Se tapa con
69#    `accountsservice-fgetspent_r-musl.patch`, que la implementa sobre el `fgetspent()` que musl SÍ
70#    tiene, copiando el registro al buffer del llamador. La copia no es adorno: daemon.c GUARDA esos
71#    buffers en un GHashTable, y `fgetspent()` devuelve un struct estático que se reescribe en cada
72#    llamada. El parche sigue el patrón que el propio accountsservice ya usa para /etc/passwd
73#    (`src/fgetpwent.c` incluido bajo `#ifndef HAVE_FGETPWENT`).
74#
75# SELLA: b3:0328b0d0. Produce `AccountsService-1.0.typelib`, que es lo que la capa JS del shell pedía.
76#
77# CÓMO SE DESTAPÓ, y es la lección de método: gnome-shell selló con su cierre de build COMPLETO
78# (108/108) y aun así la sesión murió pidiendo este typelib. **El cierre de build no es el cierre de
79# runtime**: todo lo que el shell carga por `imports.gi.*` desde JavaScript es invisible al grafo de
80# deps. Se encuentra arrancando, no compilando.
81name    = "accountsservice"
82version = "23.13.9"
83license = "GPL-3.0-or-later"
84
85[source]
86tarball = "https://www.freedesktop.org/software/accountsservice/accountsservice-23.13.9.tar.xz"
87sha256  = "adda4cdeae24fa0992e7df3ffff9effa7090be3ac233a3edfdf69d5a9c9b924f"
88patches = ["accountsservice-fgetspent_r-musl.patch"]
89
90[build]
91compiler = "zig-cc"
92target   = "x86_64-linux-musl"
93link     = "dynamic"
94
95[build.phases]
96configure = "printf '#!/bin/sh\\necho 23.13.9\\n' > generate-version.sh && sed -i \"/^subdir('po')$/d\" meson.build && sed -i '/Do not know which filename to watch for wtmp changes/d' meson.build && sed -i \"/^subdir('tests')$/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 -Delogind=true -Dintrospection=true -Dvapi=false -Ddocbook=false -Dgtk_doc=false -Dsystemdsystemunitdir=no -Dc_args=-Wno-error=date-time"
97compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
98install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
99
100[deps]
101build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "py3-setuptools", "gi-foreign-girs", "gobject-introspection", "glib", "glib-introspected", "polkit", "dbus-shared", "libelogind", "libffi", "pcre2", "zlib-shared", "expat"]
102
103# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
104# Se lanza EXPLÍCITO, no por activación de D-Bus, y el motivo está medido en el script de sesión: la
105# activación por bus funciona, pero deja el arranque esperando el timeout y no deja log donde mirar.
106# ⚠ EL `argv` ESPERA AL BUS ANTES DEL `exec`, Y NO ES UNA MAÑA DE ESTA RECETA. arje ordena el
107# arranque por capacidades (orden topológico real), pero eso ordena el SPAWN, no el ESTAR LISTO: no
108# existe primitiva «esperá a que aparezca este socket» (DE-SYSTEMD-A-ARJE.md §13 lo lista como hueco
109# abierto). Sin la espera, este daemon puede arrancar antes de que dbus-daemon escuche y quedarse en
110# modo idle sin registrar nunca su nombre — un fallo que NO se ve: el proceso vive, el bus no lo
111# tiene. Mientras el hueco siga abierto la espera va DENTRO del card, a la vista en el argv y no
112# escondida en un wrapper, para que se pueda contar cuántos servicios la están pagando.
113[[service]]
114label   = "accounts-daemon"
115id      = "01HQAR53D4M2NBV8KZTYXFQA23"
116exec    = "/bin/busybox"
117argv    = ["sh", "-c", "i=0; while [ ! -S /run/dbus/system_bus_socket ] && [ $i -lt 100 ]; do i=$((i+1)); sleep 0.2; done; exec /usr/libexec/accounts-daemon"]
118restart = { initial_ms = 500, max_ms = 20000 }