tawasuyu

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…

TOML 1572Shell 203Rust 109Markdown 993728 Definiciones

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>

5728b5ff8bb2c8bfa021d76fde6857f221571710 · por Sergio · (hace 7 d) · padre 1ea263c7e · ver el árbol en este commit

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; }