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>
88 lines
5.5 KiB
TOML
88 lines
5.5 KiB
TOML
# wireplumber 0.5.15 — EL GESTOR DE SESIÓN de PipeWire, en la variante de COSMIC.
|
|
#
|
|
# ── POR QUÉ EXISTE ESTA COPIA Y NO SE REUSA LA DE GNOME ─────────────────────────────────────────
|
|
# `recipes/incoming-gnome/wireplumber.toml` está sellada y funciona, pero su binario NEEDea
|
|
# `libglib-2.0.so.0`, `libgobject-2.0.so.0` y `libpipewire-0.3.so.0` **de la isla dinámica de GNOME**.
|
|
# Traerlo tal cual a la imagen de COSMIC significaría meter una segunda glib y una segunda pipewire —
|
|
# justo el choque de 370 ficheros solapados que la campaña midió y evitó.
|
|
#
|
|
# La regla del runbook es que copiar entre colas sale gratis **sólo si toda la clausura resuelve
|
|
# igual**. Acá NO resuelve igual, y eso es lo que se quiere: de las 19 deps, 14 dan hash idéntico y
|
|
# las que divergen divergen A PROPÓSITO —`pipewire` apunta a la de COSMIC (`338d1d8c`), que es la que
|
|
# el escritorio realmente ARRANCA. Un gestor de sesión contra otra pipewire que la que corre no
|
|
# gestiona nada.
|
|
#
|
|
# ── EL CAMBIO DE FONDO: `glib` → `glib-shared` ──────────────────────────────────────────────────
|
|
# COSMIC usa la `glib` ESTÁTICA del corpus (le sirve a `xdg-desktop-portal`, que es un ejecutable).
|
|
# Acá no alcanza: wireplumber produce `libwireplumber-0.5.so` y sus módulos, y la estática del corpus
|
|
# tiene **44.275 reubicaciones `R_X86_64_32/32S`** en `libglib-2.0.a` ⇒ no es PIC y no se puede
|
|
# enlazar dentro de un `.so`. (Regla del frente GNOME: `readelf -r` ANTES de gastar un build.)
|
|
#
|
|
# La salida no fue una campaña nueva sino una MEDICIÓN: `incoming-kde/glib-shared.toml` copiada acá
|
|
# resuelve al **mismo hash** (`0584ce1f`) y **ya está sellada** ⇒ cero rebuild. Idem `pcre2-shared`
|
|
# (`f254abaa`), `lua` (`e6c35f98`) y `libelogind` (`f1a690b2`), traídas por la misma razón: no existen
|
|
# en el catálogo padre y sus hashes coinciden con los de su cola de origen.
|
|
#
|
|
# ── LO QUE APORTA, Y POR QUÉ HACE FALTA ACÁ ─────────────────────────────────────────────────────
|
|
# `pipewire` se construye con `-Dsession-managers=[]`: arranca, acepta clientes y sirve —el portal ya
|
|
# figura como cliente suyo— pero **no hay política** de qué es entrada, qué es salida, ni quién mueve
|
|
# un nodo de `Paused` a `Streaming`. Y ahí está parado ScreenCast: el backend crea el nodo
|
|
# (`cosmic-screencast`, `Video/Source`, visible en `pw-cli ls Node`), su log dice
|
|
# `state-changed 'Connecting' -> 'Paused'`… y no emite el `Response`. La hipótesis a confirmar o
|
|
# matar con esta receta es que falta exactamente esto.
|
|
#
|
|
# La política está escrita EN LUA: embebe un intérprete (`lib/wplua`) y sus reglas viven en
|
|
# `src/scripts/*.lua`. Por eso la dep interesante no es PipeWire sino **`lua`**.
|
|
#
|
|
# `-Dsystem-lua=true` es obligatorio: por defecto 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` — la C-ABI de logind otra vez, y acá la sirve `arje-sdlogin-compat`, el mismo
|
|
# shim que en el resto del fractal. wireplumber la usa para saber si la sesión está activa antes de
|
|
# tomar los dispositivos, que es justo el problema que ese shim resuelve.
|
|
#
|
|
# Apagados: `-Dsystemd=disabled` y sus units (PID1 es arje-zero y el arranque lo hace `cosmic-start`);
|
|
# `-Ddoc=disabled` (falta sphinx/doxygen); `-Dtests=false -Ddbus-tests=false`; `-Dintrospection=disabled`
|
|
# porque nadie carga `Wp-0.5` por typelib.
|
|
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]
|
|
# Sin `rm -rf output`: con el árbol de fuentes compartido (ADR 0012) borrar el dir de build es
|
|
# sabotear a quien esté compilando en paralelo. Lección heredada de la receta de GNOME.
|
|
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]
|
|
# Difiere de la de GNOME en cuatro nombres, y los cuatro a propósito: `glib-shared` en vez de `glib`
|
|
# (la estática no es PIC), `pcre2-shared` en vez de `pcre2` (coherencia con lo que el `.pc` de
|
|
# glib-shared declara), y `pipewire`/`pulseaudio` que resuelven a los de ESTA cola — los que el
|
|
# escritorio arranca.
|
|
build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "lua", "pipewire",
|
|
"glib-shared", "dbus-shared", "libelogind", "alsa-lib", "libsndfile", "pulseaudio",
|
|
"expat", "pcre2-shared", "libffi", "libudev-zero", "zlib-shared"]
|