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.
87 lines
4.9 KiB
TOML
87 lines
4.9 KiB
TOML
# wireplumber 0.5.15 — EL GESTOR DE SESIÓN de PipeWire. La pieza que faltaba para que el audio sea
|
|
# audio y no sólo un socket que acepta conexiones.
|
|
#
|
|
# QUÉ APORTA, y por qué no alcanzaba con pipewire: `pipewire` se construyó con
|
|
# `-Dsession-managers=[]`, así que arranca, acepta clientes y gnome-shell conecta —el
|
|
# `Gvc-WARNING: Failed to connect context` desapareció— pero **no enumera ni enruta dispositivos**: no
|
|
# hay política de qué es entrada, qué es salida, qué se enlaza con qué. El sink que veía el shell era
|
|
# `auto_null` («Dummy Output»). Eso es el nodo de descarte, no una tarjeta.
|
|
#
|
|
# wireplumber es esa política, y está escrita EN LUA: embebe un intérprete (`lib/wplua`) y sus reglas
|
|
# viven en `src/scripts/*.lua`. De ahí que la dep interesante de esta receta no sea PipeWire sino
|
|
# **`lua`**, que hubo que autorar (el Makefile de Lua no produce `.so` ni `.pc`; ver esa receta).
|
|
#
|
|
# `-Dsystem-lua=true` es obligatorio acá: por defecto wireplumber usa su `subprojects/lua.wrap`, que
|
|
# **DESCARGA Lua 5.5 de lua.org**, y el sandbox va con `--wrap-mode=nodownload`. Con la perilla
|
|
# prendida busca por pkg-config `lua-5.5`/`lua5.5`/`lua55`, después las 5.4 y después las 5.3
|
|
# (meson.build:91-95): nuestra `lua5.4.pc` entra por la segunda tanda.
|
|
#
|
|
# `-Delogind=enabled` — cuarta vez que la C-ABI de logind aparece en esta campaña, y la primera en que
|
|
# está desde el principio: `libelogind` (arje-sdlogin-compat) ya está sellada. wireplumber la usa para
|
|
# saber si la sesión está activa antes de tomar los dispositivos de audio, que es exactamente el
|
|
# problema que resuelve nuestro shim.
|
|
#
|
|
# ✅ RESUELTO (2026-07-30): el `-I$PWD/lib/wp` de `c_args` NO HACÍA FALTA y ya no está.
|
|
#
|
|
# Se había agregado porque el build cortaba con `../lib/wp/wp.h:13: fatal error: 'client.h' file not
|
|
# found` — un header que SÍ existe justo al lado del que lo incluye, o sea que el `#include "..."`
|
|
# relativo debía haberlo encontrado. La explicación real era la CARRERA DEL ADR 0012: otro agente
|
|
# construía en el mismo repo y borraba árboles de `work/sources/` en pleno build. Esa carrera produce
|
|
# exactamente esa firma —ficheros que existen cuando los mirás después y no existían al compilar—, y es
|
|
# de las que hacen inventar arreglos para síntomas que no son del código.
|
|
#
|
|
# **Re-probado con el repo QUIETO y sella igual sin la bandera.** Confirmado, no supuesto: se comprobó
|
|
# primero que no hubiera ningún `takana build` corriendo, después se quitó el flag y el build pasó
|
|
# entero. La lección: antes de agregar una bandera que no se explica, mirar si hay otro build vivo.
|
|
#
|
|
# Por lo mismo se QUITÓ de esta receta un `rm -rf output` que había puesto antes en el configure: con
|
|
# el árbol compartido, borrar el directorio de build es sabotear a quien esté compilando en paralelo.
|
|
#
|
|
# Apagados: `-Dsystemd=disabled` y sus units (acá PID1 es arje-zero, y el arranque lo hace
|
|
# `gnome-start`); `-Ddoc=disabled` (falta sphinx/doxygen); `-Dtests=false -Ddbus-tests=false`;
|
|
# `-Dintrospection=disabled` porque nadie carga `Wp-0.5` por typelib — el shell habla con PipeWire por
|
|
# el protocolo de PulseAudio, no con wireplumber por GObject.
|
|
name = "wireplumber"
|
|
version = "0.5.15"
|
|
license = "MIT"
|
|
|
|
[source]
|
|
tarball = "https://gitlab.freedesktop.org/pipewire/wireplumber/-/archive/0.5.15/wireplumber-0.5.15.tar.gz"
|
|
sha256 = "baa121bc918df5fa0e0e70755bb1c99ffab0ab107225ecf99aa470e2c6ba5e7b"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "dynamic"
|
|
|
|
[build.phases]
|
|
configure = '''
|
|
set -e
|
|
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 \
|
|
-Dsystem-lua=true -Dsystem-lua-version=auto \
|
|
-Delogind=enabled -Dsystemd=disabled \
|
|
-Dsystemd-system-service=false -Dsystemd-user-service=false \
|
|
-Dintrospection=disabled -Ddoc=disabled \
|
|
-Dtests=false -Ddbus-tests=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"
|
|
|
|
[deps]
|
|
build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "lua", "pipewire",
|
|
"glib", "dbus-shared", "libelogind", "alsa-lib", "libsndfile", "pulseaudio",
|
|
"expat", "pcre2", "libffi", "libudev-zero", "zlib-shared"]
|
|
|
|
# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
|
|
# El gestor de sesión de pipewire. Mismo `scope = "session"` y misma advertencia: fuera de mirada
|
|
# nadie entrega Cards de sesión todavía.
|
|
[[service]]
|
|
label = "wireplumber"
|
|
id = "01HQAR53D4M2NBV8KZTYXFQA28"
|
|
exec = "/usr/bin/wireplumber"
|
|
scope = "session"
|
|
restart = { initial_ms = 500, max_ms = 20000 }
|