gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

fix(pcaudiolib): mi guardián estuvo mal dos veces, y las dos eran verificables antes

El build de pcaudiolib fue **correcto** —configure, compile e install, con la `.a` y la cabecera en
su sitio— y mi guardián lo rechazó:

    pcaudiolib: falta pcaudiolib.pc — espeak-ng la busca por ahí

Dos errores en el mismo control:

1. **Exigía un `pcaudiolib.pc` que upstream NO PUBLICA.** No hay `.pc.in` en el árbol, medido. Y
   espeak-ng tampoco lo necesita: la busca con `find_library(PCAUDIO_LIB pcaudio)` y
   `find_path(PCAUDIO_INC "pcaudiolib/audio.h")` — **nunca con pkg-config** (`cmake/deps.cmake:3`,
   que yo mismo había leído una hora antes). Inventé un requisito y rechacé trabajo bueno.
2. **Buscaba `have_pulseaudio=yes` en `config.log` y ese texto no existe.** Lo que el configure
   escribe es `HAVE_PULSE_SIMPLE_H` y `HAVE_ALSA_ASOUNDLIB_H` — y los DOS estaban, o sea que los
   backends se detectaron bien y mi control los habría denunciado como ausentes. Un guardián con el
   patrón equivocado no es un guardián: es un generador de falsos positivos.

⇒ Ahora comprueba **lo que el consumidor busca de verdad**: la `.a`, y la cabecera en
`include/pcaudiolib/audio.h` —la ruta exacta del `find_path`, no `/usr/include` suelta— más los
backends por el marcador que el configure escribe.

**Es el tercer guardián demasiado estricto que escribo hoy** (antes: `hangul.so` cuando la
convención es `libhangul.so`, y el `.pc` de libhangul que sí hacía falta pero por otro motivo). El
patrón de los tres es idéntico y vale más que los tres arreglos: **afirmar un requisito sin leerlo
en la fuente del consumidor.** Un guardián se escribe DESPUÉS de mirar qué busca quien va a usar el
paquete, no desde la idea de lo que un paquete «debería» publicar.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

dc18cd21b970eae378367f1f8201f1a57067934f · por Sergio · (hace 1 d) · padre 313001692 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

1 archivos · +22 −11

diff --git a/recipes/pcaudiolib.toml b/recipes/pcaudiolib.toml
index 81b8c711..72eb3a8c 100644
--- a/recipes/pcaudiolib.toml
+++ b/recipes/pcaudiolib.toml
@@ -45,25 +45,36 @@ flags    = []
 # existe ahorra una campaña.
 configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --disable-shared --enable-static --with-pic --without-sndio'
 compile   = 'make -j"$(nproc)"'
-# Guardián: la `.a`, su `.pc` —que es como espeak-ng la encuentra— y **al menos un backend de
-# audio compilado**. Lo último es el punto: una pcaudiolib sin pulse ni alsa compila, instala y no
-# reproduce nada, y entonces el problema se traslada a espeak-ng disfrazado de otra cosa.
+# ⚠ **ESTE GUARDIÁN ESTUVO MAL DOS VECES EN LA MISMA PASADA, y las dos eran verificables antes.**
+#
+# 1. **Exigía un `pcaudiolib.pc` que upstream NO PUBLICA** (no hay `.pc.in` en el árbol, medido). Y
+#    además espeak-ng no lo necesita: la busca con `find_library(PCAUDIO_LIB pcaudio)` y
+#    `find_path(PCAUDIO_INC "pcaudiolib/audio.h")` — **nunca con pkg-config** (`cmake/deps.cmake:3`).
+#    O sea que inventé un requisito, y el guardián rechazó un build correcto. Es la tercera vez hoy
+#    que un guardián mío es demasiado estricto; el patrón de los tres es el mismo: afirmar un
+#    requisito sin haberlo leído en la fuente del consumidor.
+# 2. **Buscaba `have_pulseaudio=yes` en `config.log` y ese texto no existe.** Lo que sí escribe el
+#    configure es `HAVE_PULSE_SIMPLE_H` y `HAVE_ALSA_ASOUNDLIB_H` — y los DOS estaban ahí, o sea que
+#    los backends se detectaron y el control los habría denunciado como ausentes.
+#
+# ⇒ Ahora comprueba exactamente lo que el consumidor busca —la `.a` y la cabecera en la ruta que
+# `find_path` espera— y los backends por el marcador que el configure escribe de verdad.
 install = '''
 set -e
 make DESTDIR=/out install
 [ -f /out/usr/lib/libpcaudio.a ] || { echo "pcaudiolib: no quedó la .a — NO sello" >&2; exit 1; }
-[ -f /out/usr/lib/pkgconfig/pcaudiolib.pc ] || { echo "pcaudiolib: falta pcaudiolib.pc — espeak-ng la busca por ahí" >&2; exit 1; }
-# `config.log` dice qué backends detectó el configure; si ninguno, esta receta no sirve para nada.
+# La RUTA de la cabecera importa: espeak-ng hace `find_path(PCAUDIO_INC "pcaudiolib/audio.h")`, así
+# que tiene que estar en ese subdirectorio y no suelta en /usr/include.
+[ -f /out/usr/include/pcaudiolib/audio.h ] || { echo "pcaudiolib: falta include/pcaudiolib/audio.h — es la ruta exacta que el find_path de espeak-ng busca" >&2; exit 1; }
 back=""
-grep -q 'have_pulseaudio=.\{0,1\}yes' config.log 2>/dev/null && back="$back pulse"
-grep -q 'have_alsa=.\{0,1\}yes' config.log 2>/dev/null && back="$back alsa"
+grep -q 'HAVE_PULSE_SIMPLE_H' config.log 2>/dev/null && back="$back pulse"
+grep -q 'HAVE_ALSA_ASOUNDLIB_H' config.log 2>/dev/null && back="$back alsa"
 if [ -z "$back" ]; then
-  echo "pcaudiolib: CERO backends de audio detectados — compilaría y no reproduciría nada" >&2
-  grep -iE 'have_(pulseaudio|alsa)=' config.log 2>/dev/null | head -4 >&2
+  echo "pcaudiolib: CERO backends de audio — compilaría y no reproduciría nada" >&2
+  grep -oE 'HAVE_[A-Z_]*(PULSE|ALSA|SNDIO)[A-Z_]*' config.log 2>/dev/null | sort -u | head -5 >&2
   exit 1
 fi
-echo "pcaudiolib: .a + .pc · backends:$back"
+echo "pcaudiolib: .a + include/pcaudiolib/audio.h · backends:$back"
 '''
-
 [deps]
 build = ["libtool", "make", "pkgconf", "pulseaudio", "alsa-lib"]