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.
90 lines
6.7 KiB
TOML
90 lines
6.7 KiB
TOML
# colord 1.4.7 — gestión de color (perfiles ICC por dispositivo). mutter la exige por pkg-config sin
|
|
# perilla (meson.build:128): aplica la curva de color a cada monitor en el backend nativo.
|
|
#
|
|
# CON DEMONIO desde 2026-07-30 (`-Ddaemon=true`). Antes iba apagado, con este razonamiento:
|
|
# «mutter enlaza libcolord (el cliente D-Bus), no necesita el demonio». Cierto para COMPILAR mutter y
|
|
# falso para el escritorio andando: al arrancar la sesión, mutter pide `org.freedesktop.ColorManager` y
|
|
# se come 25 s de timeout de activación D-Bus en CADA arranque —
|
|
# libmutter-WARNING: Failed to connect to colord daemon: Error calling StartServiceByName for
|
|
# org.freedesktop.ColorManager: Timeout was reached
|
|
# — porque el artefacto INSTALA el `.service` de activación (`Exec=/usr/libexec/colord`) y ese binario
|
|
# no existía. O sea que la versión sin demonio no era «colord apagado» sino **colord roto de forma
|
|
# lenta**: el peor de los dos, porque no falla, tarda.
|
|
#
|
|
# El propio comentario de esta receta marcaba la condición para volver: «si alguna vez hace falta el
|
|
# demonio de verdad, vuelve con polkit encima». **Polkit ya está**: `arje-polkit-compat` sirve
|
|
# `org.freedesktop.PolicyKit1` desde que se cerró el bus de sistema, y `polkit-gobject-1` —lo único que
|
|
# el meson del demonio agrega (meson.build:194)— estaba sellado desde antes.
|
|
#
|
|
# `-Ddaemon_user=root`: upstream avisa por consola que correr el demonio como root «is not a good idea»
|
|
# y tiene razón, pero acá no hay usuario `colord` en /etc/passwd ni mecanismo que lo cree — eso es
|
|
# trabajo del paquete de sistema, no de esta receta. Queda explícito para que se lea como deuda y no
|
|
# como descuido.
|
|
#
|
|
# ⚠ MEDIDO 2026-07-27, y el resultado desmiente lo que yo suponía al escribir esta receta: apagar el
|
|
# demonio NO adelgaza las deps. En colord 1.4.7 el bloque de dependency() es de nivel superior, sin
|
|
# ningún `if get_option('daemon')` que lo cubra (meson.build:114-123):
|
|
# sqlite3 ✓ (ya en el corpus) gusb ✗ gudev-1.0 ✗ libudev ✗
|
|
# (las tres ya están selladas). Prender el demonio por tanto **no agrega una sola dep nueva** salvo
|
|
# polkit-gobject-1, ya sellada: el coste estaba pagado desde 2026-07-27 sin que nadie lo cobrara.
|
|
# Nota histórica de entonces: colord costaba 3 recetas nuevas antes que ella: libusb → libgusb, y
|
|
# libgudev (envoltorio GObject de libudev; el proveedor de libudev.pc sería libudev-zero, ya en el
|
|
# corpus). libgudev NO se paga sólo por colord: mutter también la exige por su opción `udev`, que es
|
|
# la que hace falta para el backend nativo KMS. Ése es el orden correcto de la próxima tanda.
|
|
#
|
|
# systemd=false por la misma razón que en todo este frente: arje-zero es PID1.
|
|
# argyllcms_sensor=false: sensores de calibración de HARDWARE (colorímetros por USB). El demonio anda
|
|
# sin ellos; lo que se pierde es calibrar con una sonda física, que no es el caso de uso acá.
|
|
# introspection=false: mutter la enlaza en C.
|
|
name = "colord"
|
|
version = "1.4.7"
|
|
license = "GPL-2.0-or-later AND LGPL-2.1-or-later"
|
|
|
|
[source]
|
|
tarball = "https://www.freedesktop.org/software/colord/releases/colord-1.4.7.tar.xz"
|
|
sha256 = "de02d9910634ae159547585cec414e450f711c27235453b4f9b38a9f2361a653"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
#
|
|
# COLORD VA A LA ISLA DINÁMICA, y no por gusto: su meson construye libcolord/libcolordprivate/
|
|
# libcolorhug como shared_library() PASE LO QUE PASE — -Ddefault_library=static no las hace
|
|
# estáticas. Con --prefer-static, cada uno de esos .so se tragaba una copia de la glib ESTÁTICA, o
|
|
# sea una tabla de GType por objeto compartido. El síntoma, medido el 2026-07-27, fue exactamente el
|
|
# que da esa duplicación: las herramientas que el propio build compila (cd-create-profile, cd-it8)
|
|
# enlazan y arrancan, pero mueren con `assertion 'G_IS_FILE (file)' failed` y acto seguido SIGSEGV —
|
|
# el tipo GFile registrado en una copia de glib no es el mismo que el que valida la otra.
|
|
# Enlazar la glib .so (la cola GNOME la provee: default_library=both) deja UN registro de tipos, que
|
|
# es lo que GObject asume. Es la misma razón por la que glib/gtk4/gobject-introspection ya son isla
|
|
# dinámica en este frente: la introspección no fue el único motivo, sólo el primero que lo obligó.
|
|
link = "dynamic"
|
|
|
|
[build.phases]
|
|
configure = "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 -Ddaemon=true -Ddaemon_user=root -Dsystemd=false -Dudev_rules=false -Dargyllcms_sensor=false -Dbash_completion=false -Dintrospection=false -Dvapi=false -Dsane=false -Dtests=false -Dinstalled_tests=false -Dman=false -Ddocs=false -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"
|
|
|
|
# lcms2 = el motor ICC (reusada de la cola KDE, ya sellada). glib para gio/D-Bus.
|
|
# sqlite: REQUERIDA aunque daemon=false — meson.build:119 la pide incondicionalmente (la usa la
|
|
# librería para leer la base de perfiles ICC). Ya estaba en el corpus y sellada, provee sqlite3.pc.
|
|
[deps]
|
|
build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "glib", "lcms2", "sqlite", "libgusb", "libgudev", "libudev-zero", "libusb", "json-glib", "hwdata", "polkit", "dbus-shared", "expat", "libffi", "pcre2", "zlib"]
|
|
|
|
# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
|
|
# Mutter lo pide al arrancar y, si no está, se come 25 s de timeout de activación D-Bus. Por eso es
|
|
# un servicio declarado y no algo que el bus levante cuando alguien pregunte.
|
|
# ⚠ 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 = "colord"
|
|
id = "01HQAR53D4M2NBV8KZTYXFQA25"
|
|
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/colord"]
|
|
restart = { initial_ms = 500, max_ms = 20000 }
|