fix(jaula): el sysroot no traía el paquete de la propia receta, y ponía plugins en los `-L`
Dos arreglos que estaban en el árbol desde el 2026-09-30 sin commitear, ahora medidos contra la
versión publicada con `recipes/pipewire.toml` y `recipes/mirada-compositor.toml`.
1. **El paquete de la receta misma entra al sysroot.** Apuntarle a `recipes/pipewire.toml` y que
traiga sus quince build-deps pero no pipewire es lo contrario de lo que cualquiera espera, y se
pierde en silencio porque el resultado igual tiene miles de enlaces: sólo se nota cuando el `.pc`
del propio paquete no resuelve. Medido: pipewire pasa de 4658 a 5098 enlaces y de 29 a 31
módulos que resuelven.
2. **Los `-L` salen de los cuatro directorios canónicos**, no de «todo directorio que tenga un
`.so`». El filtro por nombre no alcanza: una receta declara en `[deps] build` tanto bibliotecas
como HERRAMIENTAS (perl, python, meson), y ésas traen `.so` anidados. Medido con pipewire, la
versión vieja emitía cuatro rutas y dos no son bibliotecas de enlace:
usr/lib
usr/lib/pulseaudio ← plugins
usr/lib/python3.12/config-3.12-x86_64-linux-musl ← libpython para empotrar
usr/share/gdb/auto-load/usr/lib ← scripts de gdb
Invitar al enlazador a resolver un símbolo ahí es un defecto carísimo de diagnosticar. Una
biblioteca de verdad vive en `lib`, `lib64`, `usr/lib` o `usr/lib64`; lo anidado es plugin,
runtime o dlopen. El bucle usa `find -maxdepth 1` y no `ls lib*.so* lib*.a`: `ls a* b*` sale 2
si UNO de los dos patrones no casa aunque el otro sí, y con eso `lib64` —que tiene `libpam.so`
y ningún `.a`— quedaba afuera, y con él el libpam que el compositor necesita.
Los dos controles que el guion ya trae siguen en verde con los cambios puestos: 27 de 28 módulos
resuelven para mirada-compositor (el que falta es `xkbcommon-x11`, fuera de la clausura) y
xkbcommon compila, enlaza, corre y su `.so` sale del sysroot y no de la imagen de Arch.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +20 −5
diff --git a/scripts/servidor/jaula-sysroot.sh b/scripts/servidor/jaula-sysroot.sh
index e39e15df..80a4d437 100755
--- a/scripts/servidor/jaula-sysroot.sh
+++ b/scripts/servidor/jaula-sysroot.sh
@@ -56,8 +56,12 @@ for r in $RECETAS; do
[ -f "$r" ] || { echo "no existe la receta $r" >&2; exit 1; }
d=$(tr '\n' ' ' < "$r" | sed -n 's/.*build[[:space:]]*=[[:space:]]*\[\([^]]*\)\].*/\1/p' | tr -d '"' | tr ',' ' ')
[ -n "$d" ] || { echo "la receta $r no declara [deps] build" >&2; exit 1; }
- deps="$deps $d"
- echo "==> $r: $(printf '%s' "$d" | wc -w) build-deps"
+ # Y EL PAQUETE DE LA RECETA MISMA. Apuntarle a `recipes/pipewire.toml` y que traiga sus quince
+ # build-deps pero no pipewire es lo contrario de lo que cualquiera espera; se pierde en silencio
+ # porque el resultado igual tiene cientos de enlaces y sólo se nota cuando el `.pc` no resuelve.
+ propio=$(sed -n 's/^name[[:space:]]*=[[:space:]]*"\([^"]*\)".*/\1/p' "$r" | head -1)
+ deps="$deps $d $propio"
+ echo "==> $r: $propio + $(printf '%s' "$d" | wc -w) build-deps"
done
deps="$deps musl"
@@ -116,9 +120,20 @@ PCP="$SYS/usr/lib/pkgconfig:$SYS/usr/share/pkgconfig:$SYS/lib64/pkgconfig:$SYS/l
# van explícitas, y se DERIVAN de la granja: el corpus no instala todo en el mismo sitio.
# ⚠ `rustflags` no se fusiona entre configs: si un repo define el suyo, éste se ignora ENTERO y
# el sysroot deja de verse. Hoy tawasuyu sólo define `[env]`, así que convive.
-# Sólo lo que un `-l` puede nombrar (`lib<algo>.so`/`.a`): así quedan afuera `lib64/security` y
-# `usr/lib/dri`, que son módulos que alguien abre con dlopen, no bibliotecas que se enlacen.
-LIBDIRS=$(find "$SYS" \( -name 'lib*.so' -o -name 'lib*.so.*' -o -name 'lib*.a' \) | sed 's#/[^/]*$##' | sort -u)
+# SÓLO los cuatro directorios canónicos de biblioteca, y no «todo directorio que tenga un .so».
+# El filtro por nombre no alcanza: una receta declara en `[deps] build` tanto las bibliotecas contra
+# las que se enlaza como las HERRAMIENTAS que necesita para construirse (perl, python, meson), y
+# esas traen `usr/lib/perl5/5.40.2/.../CORE/libperl.so`, `usr/lib/python3.12/config-*/libpython.so`
+# y hasta `usr/share/gdb/auto-load/`. Ponerlos en `-L` es invitar al enlazador a resolver un
+# símbolo con la biblioteca equivocada, que es un defecto carísimo de diagnosticar. Una biblioteca
+# de verdad vive en uno de estos cuatro; lo anidado es plugin, runtime o dlopen.
+LIBDIRS=""
+for d in "$SYS/lib" "$SYS/lib64" "$SYS/usr/lib" "$SYS/usr/lib64"; do
+ # ⚠ `ls a* b*` sale 2 si UNO de los dos no casa, aunque el otro sí. Con eso `lib64` —que tiene
+ # `libpam.so` y ningún `.a`— quedaba afuera, y con él el libpam que el compositor necesita.
+ [ -d "$d" ] || continue
+ find "$d" -maxdepth 1 \( -name 'lib*.so*' -o -name 'lib*.a' \) 2>/dev/null | grep -q . && LIBDIRS="$LIBDIRS $d"
+done
ZIG=$(find "$STORE" -maxdepth 3 -type f -perm -100 -name zig -path '*seed-zig*' 2>/dev/null | head -1)
[ -n "$ZIG" ] || { echo "no encuentro el zig de seed-zig en $STORE" >&2; exit 1; }