fix(espeak-ng): las transitivas de audio van a mano — no hay `.pc` de donde sacarlas
`sonic` SELLÓ y con eso espeak-ng pasó el configure y llegó a enlazar. Murió así:
Error relocating /src/build/src/libespeak-ng/libespeak-ng.so.1: pa_strerror: symbol not found
Error relocating …: snd_strerror: symbol not found
`libpcaudio.a` referencia esos símbolos, pero espeak-ng la encuentra con
`find_library(PCAUDIO_LIB pcaudio)` — que devuelve **la ruta del `.a` y nada más**, sin las
transitivas. Medido con `nm`: `pa_strerror` vive en `libpulse.so` y `snd_strerror` en
`libasound.so`.
⇒ `-lpulse-simple -lpulse -lasound` en los dos `*_LINKER_FLAGS`.
Es la MISMA figura que `fontconfig.pc → Requires.private: expat` en fcitx5, **con una diferencia que
importa**: allá la cura fue `PKG_CONFIG_ARGN=--static`, porque el `.pc` existía y sabía declarar sus
privadas. Acá pcaudiolib **no publica `.pc`** (upstream no trae plantilla), así que no hay de dónde
sacarlas automáticamente: se escriben a mano o no hay forma. Esa asimetría es lo que vale guardar —
la misma clase de defecto tiene dos curas según si el `.pc` existe.
Y el síntoma engaña: sale «symbol not found» al EJECUTAR, no «undefined reference» al enlazar,
porque la fase de datos corre el propio `espeak-ng` para compilar los fonemas y es ahí donde el
cargador tropieza. Un enlace que «pasa» y revienta al primer uso es la forma más cara de este fallo.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +19 −1
- recipes/espeak-ng.toml +19 −1
diff --git a/recipes/espeak-ng.toml b/recipes/espeak-ng.toml
index 103ed5bb..bd5d3016 100644
--- a/recipes/espeak-ng.toml
+++ b/recipes/espeak-ng.toml
@@ -37,6 +37,22 @@
# no significa «opcional»; hay que leer el `else()`.**
# ESPEAK_COMPAT=ON instala también el nombre viejo `espeak`, que es el que invocan los
# scripts y las apps que no se actualizaron a `espeak-ng`
+#
+# ⚠ **LOS `-l` DE PULSE Y ALSA VAN A MANO, y es el problema transitivo del corpus estático otra
+# vez.** Con `sonic` resuelto, el build llegó a enlazar y murió así:
+# Error relocating /src/build/src/libespeak-ng/libespeak-ng.so.1: pa_strerror: symbol not found
+# Error relocating …: snd_strerror: symbol not found
+# `libpcaudio.a` referencia esos símbolos, pero espeak-ng la encuentra con
+# `find_library(PCAUDIO_LIB pcaudio)` — que devuelve **la ruta del `.a` y nada más**, sin las
+# transitivas. Y pcaudiolib no publica `.pc` (upstream no trae plantilla), así que no hay de dónde
+# sacarlas automáticamente. Medido con `nm`: `pa_strerror` está en `libpulse.so` y `snd_strerror` en
+# `libasound.so`.
+#
+# ⇒ Es la MISMA figura que `fontconfig.pc → Requires.private: expat` en fcitx5, con una diferencia
+# que importa: allá la cura fue `PKG_CONFIG_ARGN=--static` porque el `.pc` existía y sabía sus
+# privadas; **acá no hay `.pc`, así que las transitivas se escriben a mano o no hay forma.** Y el
+# fallo sale al EJECUTAR, no al enlazar —la fase de datos corre el propio `espeak-ng` para compilar
+# los fonemas—, que es por qué el síntoma es «symbol not found» y no «undefined reference».
name = "espeak-ng"
version = "1.52.0"
license = "GPL-3.0-or-later"
@@ -64,7 +80,9 @@ cmake -B build -G Ninja -Wno-dev \
-DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
-DBUILD_SHARED_LIBS=ON -DUSE_MBROLA=OFF -DUSE_SPEECHPLAYER=OFF \
- -DESPEAK_COMPAT=ON -DBUILD_TESTING=OFF
+ -DESPEAK_COMPAT=ON -DBUILD_TESTING=OFF \
+ -DCMAKE_SHARED_LINKER_FLAGS="-lpulse-simple -lpulse -lasound" \
+ -DCMAKE_EXE_LINKER_FLAGS="-lpulse-simple -lpulse -lasound"
'''
compile = "cmake --build build"
install = '''