wireplumber: el -I$PWD/lib/wp NO hacía falta — era la carrera del ADR 0012

La receta llevaba una bandera de include que su propio comentario marcaba EN DUDA: se
había puesto 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. La explicación real
era que **otro agente construía en el mismo repo y borraba árboles de work/sources/ en
pleno build** — la carrera del ADR 0012, que produce exactamente esa firma: ficheros que
existen cuando los mirás después y no existían al compilar.

Re-probado CON EL REPO QUIETO —comprobando primero que no hubiera ningún `hammer build`
vivo— y sella igual sin la bandera. Confirmado, no supuesto. Verificado además de punta a
punta: audio sigue dando `48. HDA Intel [alsa]` con sink y source reales, 0 page-flips
fallidos.

La lección queda en la receta: antes de agregar una bandera que no se explica, mirar si hay
otro build vivo. Es barato y evita inventar arreglos para síntomas que no son del código.

**GOTCHA DEL LAB, aprendido a la mala en el mismo movimiento: los BYTES del fichero .patch
entran al ArtifactHash.** Corregir la PROSA obsoleta de `pipewire-sound-initialized.patch`
—decía que la decisión libudev-zero-vs-eudev seguía pendiente cuando ya está resuelta—
re-hasheó pipewire y arrastró wireplumber. La distinción que conviene tener presente:
**comentar una RECETA es gratis** (hash_inputs toma source/compiler/target/link/flags/fases/
deps, no los comentarios del TOML) **y comentar un PARCHE cuesta un rebuild**. Anotado en
pipewire.toml, que es donde se va a leer.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 13:04:50 -04:00
co-authored by Claude Opus 5
parent 1e5313a412
commit ef2668ad97
3 changed files with 28 additions and 13 deletions
@@ -78,6 +78,10 @@ o sea que **sólo acepta el device CARD** (`/sys/.../sound/card0`), no `controlC
`/sys/class/*` entero, con nodo o sin él.
⇒ **El device que SPA necesita nunca entra en la enumeración.** No hay guarda que sacar: falta la
mitad del espacio de búsqueda. Las salidas son (a) enseñarle a libudev-zero a recorrer `/sys/class`
—`yupana radio libudev-zero` = 51 sellados a deuda— o (b) empaquetar eudev. Es una decisión de
arquitectura, no un parche, y queda para quien la tome.
mitad del espacio de búsqueda.
**YA RESUELTO (2026-07-30)**, y por el camino (a): `recipes/libudev-zero-scan-class.patch` enseña a
libudev-zero a enumerar devices de CLASE para una lista acotada de subsistemas (hoy `sound`). Se
descartó eudev porque sin udevd es PEOR —rompió el input en otro frente— y correr udevd contradice la
arquitectura. El audio funciona: `48. HDA Intel [alsa]` con sink y source reales. Los detalles, y por
qué la lista es acotada (recorrer `/sys/class` entero rompía el VÍDEO), están en ese parche.
+8
View File
@@ -15,6 +15,14 @@
# parche: dice por qué se toca pipewire (radio 2) y no libudev-zero (radio 51), y por qué quitar ese
# guarda es legítimo (protege de una carrera contra udevd que sin udevd no existe).
#
# ⚠ GOTCHA DEL LAB, aprendido a la mala el 2026-07-30: **los BYTES del fichero `.patch` entran al
# ArtifactHash** (`Recipe::hash_inputs` lee el patch entero, no sólo su diff), así que **editar la PROSA
# de un parche re-sella el artefacto y todo lo que dependa de él**. Corregir un comentario obsoleto en
# `pipewire-sound-initialized.patch` re-hasheó pipewire y arrastró wireplumber.
# La distinción que conviene tener presente: **comentar una RECETA es gratis** —`hash_inputs` sólo toma
# source/compiler/target/link/flags/fases/deps, no los comentarios del TOML— **y comentar un PARCHE
# cuesta un rebuild**. Si hay que corregir el relato de un parche, hacerlo cuando se pueda pagar.
#
# ⚠ SIN GESTOR DE SESIÓN todavía (`-Dsession-managers=[]`). PipeWire arranca y acepta clientes —lo que
# quita el `Gvc-WARNING: Failed to connect context: Connection refused` del shell— pero sin
# wireplumber no enumera ni enruta dispositivos: no hay política de qué entra y qué sale. Para una VM
+13 -10
View File
@@ -21,15 +21,18 @@
# saber si la sesión está activa antes de tomar los dispositivos de audio, que es exactamente el
# problema que resuelve nuestro shim.
#
# ⚠ EL `-I$PWD/lib/wp` DE `c_args` ESTÁ EN DUDA, y conviene decirlo antes de que alguien lo copie.
# Se agregó 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
# al fichero incluyente debería haberlo encontrado. Al rato apareció la explicación de verdad: **otro
# agente estaba construyendo en el mismo repo y había borrado árboles de `work/sources/` en pleno
# build**, que es la carrera del ADR 0012 (el árbol de fuentes es caché Y workspace a la vez) y
# produce exactamente esa firma: ficheros que existen al mirarlos después y no existían al compilar.
# La receta sella con la bandera puesta; **falta re-probar SIN ella con el repo quieto** para saber si
# hacía falta o si sólo tapó el síntoma de la carrera.
# ✅ 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.
@@ -61,7 +64,7 @@ PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages
-Dsystemd-system-service=false -Dsystemd-user-service=false \
-Dintrospection=disabled -Ddoc=disabled \
-Dtests=false -Ddbus-tests=false \
"-Dc_args=-Wno-error=date-time -I$PWD/lib/wp"
-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"