Files
hammer/recipes/incoming-gnome/wireplumber.toml
T
sergioandClaude Opus 5 346cd59706 licencias: campo license en la receta — de 0 a 228 de 1141, sin re-hashear nada
La deuda legal bloqueante del SDD 19 §2.1. Medido hoy: **0 de 1141 recetas** declaraban
licencia, no «5 de 771» como decía el informe anterior. Los dos números estaban mal: los
«5» eran falsos positivos de `grep license` (el paquete `addlicense`, el paquete
`cargo-bundle-licenses`, una línea `install .../share/licenses/` y un comentario), y las
recetas son 1141. Contar con `grep -l <palabra>` sobre TOML cuenta comentarios y nombres,
no campos; `scripts/licencias.sh` cuenta el campo de verdad (clave en la raíz, antes del
primer `[table]`).

LO QUE HACE LA DEUDA PAGABLE: `Recipe::hash_inputs` es una LISTA BLANCA — sólo entran
source, compiler, target, link, patches, flags, phases y deps. `license` no entra, igual
que `evidence` y `slots`. Por eso se puede poblar en las recetas YA SELLADAS sin mover un
solo ArtifactHash. Verificado, no supuesto: en 40 recetas modificadas se comparó el hash
con y sin la línea — 40 idénticos, 0 cambiados. Si el campo entrara al hash, declarar la
licencia costaría reconstruir el corpus entero y no se haría nunca. Clavado con el test
`licencia_round_trip_y_no_afecta_el_hash`.

TRAMPA DE TOML: una clave suelta después de un `[table]` pertenece a esa tabla. Puesta al
final del fichero, `license` acaba dentro de `[deps]` y se pierde EN SILENCIO, porque serde
ignora los campos que no conoce — no hay error, simplemente no está. Va arriba, junto a
`name` y `version`; el sembrador la inserta tras `version`.

NO SE ADIVINA. Declarar mal una licencia es peor que dejarla vacía: convierte un hueco
visible en una afirmación falsa. Sólo se puebla desde una tabla curada entrada por entrada
(`docs/licencias-conocidas.tsv`); lo que no tiene evidencia queda vacío y se CUENTA.
Concretamente se descartó el atajo «k* = KDE ⇒ LGPL»: en este catálogo `kail`, `kind`,
`ko`, `kopia`, `krew`, `kustomize`, `kyverno`, `katana`, `kibi`, `kmon` y toda la familia
`kube*` son herramientas Go sin relación con KDE. El nombre no es evidencia.

Quedan 913, casi todas CLIs Go/Rust importados en masa — y ésas sí son automatizables con
evidencia real: Cargo.toml trae el campo `license` y los módulos Go traen su LICENSE en el
árbol. El cierre estructural es capturarlo en la fase de fetch, que ya descarga y extrae
cada tarball, y inyectar el texto en `hammer pack` (aguas abajo del ArtifactHash) en vez de
en la fase install (que sí re-hashearía).

De paso, respaldo-storagebox.sh reordenado por valor irreemplazable y con zstd: medido en
la oficina, el uplink da 8 Mbps iguales por cable y por wifi ⇒ 128 G no caben en una
sentada, así que sube primero el cerebro (estado + repo) y `--partial-dir` hace que cortar
a mitad de un artefacto no tire lo ya subido.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 10:24:11 -04:00

77 lines
4.3 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 `hammer 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"]