Lo que el script de sesión lanza con `&` ahora está declarado en las recetas y habilitado en el perfil. Ninguna receta movió su hash: 9/9 idénticos a los que los grafos ya registraban. EL HALLAZGO, y no lo buscaba: la comprobación inversa del resolutor rechazó `arje-logind-compat` y `arje-polkit-compat` porque están en CERO perfiles — y sin embargo qemu-desktop-image.sh los copia al rootfs a mano y el de COSMIC hace `exit 1` si falta logind-compat. Dos binarios imprescindibles, presentes en la imagen y ausentes del destino declarado: la misma forma del agujero de `foot`, encontrada por una comprobación en vez de por una imagen inusable. Son raíces de escritorio-gnome (los dos) y de escritorio-cosmic (sólo logind, verificado que sus scripts no nombran polkit). DOS COSAS QUE NO SON TRANSCRIPCIÓN: - `dbus-daemon --fork` no se traduce tal cual: arje supervisa al HIJO DIRECTO y Type=forking no existe, así que un daemon que forkea y sale deja a arje viendo morir al padre con éxito y reencarnándolo para siempre. La card usa --nofork. - `scope = system|session` decide DÓNDE va la card. Las de sesión necesitan XDG_RUNTIME_DIR y usuario logueado; en el genesis arrancarían antes de que exista ninguno. Y fuera de mirada NADIE entrega cards de sesión todavía, así que salen con AVISO: el hueco queda contado, no omitido. Correcciones propias: la unicidad del label es DENTRO del perfil, no del corpus (upower vive legítimamente en dos colas); la membresía se lee de los CINCO grafos, no sólo el del corpus; una RAÍZ manda sobre el grafo, que es derivado y lo regenera el cron; y la flag nace en inglés (`--services`) como manda la regla 4, aunque `--lista` sea deuda vieja del mismo fichero. `--selftest`: 7 casos, el primero es el CONTROL que tiene que pasar en verde.
82 lines
5.9 KiB
TOML
82 lines
5.9 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.
|
|
[[service]]
|
|
label = "colord"
|
|
id = "01HQAR53D4M2NBV8KZTYXFQA25"
|
|
exec = "/usr/libexec/colord"
|
|
restart = { initial_ms = 500, max_ms = 20000 }
|