Los demonios de sistema pasan de lanzarse con `&` desde un script de 500 líneas a ser Cards del `genesis`. El bloqueo que este frente daba por corpus se levantó solo: otro agente selló evolution-data-server y gnome-shell mientras esto se escribía, y escritorio-gnome quedó 309/309. SE CORRIÓ UN CONTROL PRIMERO, y es lo único que hace interpretable el resultado: colord control: `MURIÓ al arrancar` cards: `ya vive (pid 175)` ColorManager control: `NO apareció en 40s` cards: `OK` login1/Accounts/UPower OK en los dos compositor wayland-0 y shell vivo en los dos El fallo del control DESAPARECIÓ, y no lo buscaba: colord moría arrancado por el script y vive arrancado por arje, con el bus ya listo porque la espera está dentro de su argv. Sin el control, «ColorManager OK» sería un dato suelto en vez de una diferencia. Los PIDs lo confirman: polkit=119, colord=175, upowerd=178, accounts=180 — de antes de que el lanzador de sesión existiera. QUÉ NO SE COMPROBÓ: no hay screendump; QEMU salió por timeout y el control tampoco lo tuvo. La comparación es serial contra serial y lo que se afirma es sobre los DEMONIOS, no sobre el pintado. Las piezas donde corresponde: `takana service-cards` (UNA sola implementación de receta→Card; el formato es contrato con card_core::Card), `targets.py --service-paths` (une qué-es con si-arranca), y un inyector en FICHERO APARTE porque anidar dos heredocs de python falló en vivo — el terminador del interno cerró el externo y media cosa corrió como shell. La espera del bus va DENTRO del argv de las 5 recetas de sistema: sin ella un daemon arranca antes de que dbus escuche y queda en modo idle sin registrar su nombre — un fallo que no se ve, porque el proceso vive y el bus no lo tiene. Los 5 hashes intactos. Y el guardia de gnome-start es por «¿está corriendo?», no por una perilla: así es correcto venga de donde venga el proceso y la misma copia sirve donde no se inyectaron cards.
74 lines
4.4 KiB
TOML
74 lines
4.4 KiB
TOML
# upower 1.90.10 — el servicio de energía (batería, carga, suspensión por batería crítica) y su
|
|
# librería cliente `libupower-glib`, de donde sale el typelib `UPowerGlib-1.0`.
|
|
#
|
|
# POR QUÉ ENTRA: gnome-shell lo importa desde JavaScript sin condicional
|
|
# (`js/misc/dependencies.js`: `import 'gi://UPowerGlib?version=1.0'`). O sea que **es dep de RUNTIME
|
|
# del shell** aunque no aparezca en su meson.build — el indicador de batería del panel se apoya en
|
|
# esto. Se destapó arrancando la sesión, no compilando.
|
|
#
|
|
# FUENTE: el archivo de gitlab.freedesktop.org y no `upower.freedesktop.org/releases/`, que hoy sirve
|
|
# un índice generado por `tree` sin los tarballs de la serie 1.90. Es el mismo patrón que ya usan
|
|
# cairo, libdrm, libinput, pixman y modemmanager en este repo.
|
|
#
|
|
# LAS TRES PERILLAS QUE HAY QUE FIJAR A MANO, y las tres por el mismo motivo — el `auto` de upower
|
|
# significa «preguntale a un pkg-config de systemd», que acá no existe:
|
|
#
|
|
# -Dudevrulesdir / -Dudevhwdbdir: con `auto` hace `udev_dep.get_variable(pkgconfig: 'udev_dir')`
|
|
# (meson.build:97 y :103). Nuestro `udev-pc` declara la variable **`udevdir`**, no `udev_dir` —
|
|
# el nombre con guión bajo es de systemd-udev; el sin guión es el histórico de eudev, que es el que
|
|
# copiamos. En vez de tocar `udev-pc` (que arrastraría a libudev-zero y sus 51 dependientes) se
|
|
# fijan los dos directorios acá, que es lo que la opción existe para permitir.
|
|
#
|
|
# -Dsystemdsystemunitdir=no: con la cadena vacía hace `dependency('systemd')` DURA
|
|
# (meson.build:120-122). El valor `no` está contemplado por upstream y saltea la instalación de la
|
|
# unit (src/meson.build:107). Acá PID1 es arje-zero.
|
|
#
|
|
# -Dintrospection=enabled es el punto de todo esto. `-Didevice=disabled` saca libimobiledevice (el
|
|
# soporte de batería de iPhone), que no está en el corpus. `-Dpolkit=enabled` porque polkit YA está
|
|
# sellada y es lo que decide quién puede suspender.
|
|
#
|
|
# ISLA DINÁMICA: el typelib nombra `libupower-glib.so.3` y gjs la dlopea.
|
|
name = "upower"
|
|
version = "1.90.10"
|
|
license = "GPL-2.0-or-later"
|
|
|
|
[source]
|
|
tarball = "https://gitlab.freedesktop.org/upower/upower/-/archive/v1.90.10/upower-v1.90.10.tar.gz"
|
|
sha256 = "7fcd51bece2526dbee5170feb3ffd1adab5b0cd023575f1fd119d969b73f4b90"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "dynamic"
|
|
|
|
[build.phases]
|
|
configure = '''
|
|
set -e
|
|
PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output \
|
|
--prefix=/usr --buildtype=release --wrap-mode=nodownload \
|
|
-Ddefault_library=both -Dos_backend=linux -Dintrospection=enabled \
|
|
-Didevice=disabled -Dpolkit=enabled -Dman=false -Dgtk-doc=false \
|
|
-Dudevrulesdir=/usr/lib/udev/rules.d -Dudevhwdbdir=/usr/lib/udev/hwdb.d \
|
|
-Dsystemdsystemunitdir=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", "gobject-introspection", "gi-foreign-girs", "glib", "glib-introspected", "libgudev", "udev-pc", "libudev-zero", "polkit", "libffi", "pcre2", "zlib-shared", "expat", "dbus-shared"]
|
|
|
|
# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
|
|
# ⚠ EL `argv` ESPERA AL BUS ANTES DEL `exec`, Y NO ES UNA MAÑA DE ESTA RECETA. arje ordena el
|
|
# arranque por capacidades (orden topológico real), pero eso ordena el SPAWN, no el ESTAR LISTO: no
|
|
# existe primitiva «esperá a que aparezca este socket» (DE-SYSTEMD-A-ARJE.md §13 lo lista como hueco
|
|
# abierto). Sin la espera, este daemon puede arrancar antes de que dbus-daemon escuche y quedarse en
|
|
# modo idle sin registrar nunca su nombre — un fallo que NO se ve: el proceso vive, el bus no lo
|
|
# tiene. Mientras el hueco siga abierto la espera va DENTRO del card, a la vista en el argv y no
|
|
# escondida en un wrapper, para que se pueda contar cuántos servicios la están pagando.
|
|
[[service]]
|
|
label = "upowerd"
|
|
id = "01HQAR53D4M2NBV8KZTYXFQA24"
|
|
exec = "/bin/busybox"
|
|
argv = ["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/upowerd"]
|
|
restart = { initial_ms = 500, max_ms = 20000 }
|