diff --git a/scripts/servidor/jaula-herramientas.sh b/scripts/servidor/jaula-herramientas.sh index 9f86a8f7..61d9c51e 100755 --- a/scripts/servidor/jaula-herramientas.sh +++ b/scripts/servidor/jaula-herramientas.sh @@ -63,6 +63,24 @@ fi [ -n "$LAB" ] || { echo "no encuentro el alpine del lab (probé /work/dev-fs/alpine y /work/$U/dev-fs/alpine)" >&2; exit 1; } echo "==> lab en $LAB" +# ── Y EL CARGADOR VA TAMBIÉN EN `/lib`, QUE NO ES REDUNDANTE (2026-09-21, medido) ─────────────── +# El envoltorio alcanza para que `cargo` ARRANQUE, pero no para lo que cargo lanza por su cuenta: +# cargo exporta `CARGO=` —el del store, no el envoltorio— y hay macros que +# lo ejecutan. `proc-macro-crate` corre `$CARGO locate-project` para ubicar la raíz del workspace, +# y adentro de la jaula ese exec moría con «No such file or directory» —que acá miente: el fichero +# existe y es ejecutable, el que falta es el INTÉRPRETE—. `crate_name()` devolvía Err y el derive +# `Type` de zvariant caía a su última rama (`::zvariant`) en vez de `::zbus::zvariant`: +# +# error[E0433]: cannot find `zvariant` in the crate root (atspi-proxies 0.13.0) +# +# Eso se lee como un defecto del lock del repo ajeno y NO lo es: con el cargador puesto, +# `llimphi-ui` de tawasuyu —winit + accesskit + wgpu— compila entero en 2m17s. La clase es más +# grande que este caso: CUALQUIER herramienta que re-ejecute `$CARGO` o `$RUSTC` por su ruta +# absoluta se rompía igual, en un crate ajeno y a diez capas del origen. +if [ ! -e /lib/ld-musl-x86_64.so.1 ] && ln -sfn "$LAB/lib/ld-musl-x86_64.so.1" /lib/ld-musl-x86_64.so.1 2>/dev/null; then + echo " (puesto /lib/ld-musl-x86_64.so.1 -> $LAB — sin él, lo que cargo LANZA no arranca)" +fi + # El zig del CORPUS, el mismo que usa cc-por-zig.sh en la caja. No se toma el de `/work/dev-fs/tools` # para que el `cc` de adentro y el de afuera sean el mismo binario. ZIG=$(find /store -maxdepth 3 -type f -perm -100 -name zig -path '*seed-zig*' 2>/dev/null | head -1) @@ -184,5 +202,19 @@ else printf " ✗ %-9s %s\n" "rustc" "$(grep -m1 error "$T/e3" 2>/dev/null || head -1 "$T/e3")"; fallos=$((fallos+1)) fi +# ── CONTROL: y que arranquen SIN el envoltorio ───────────────────────────────────────────────── +# Esto es lo que ve una proc-macro: `$CARGO` y `$RUSTC` apuntan al binario del STORE, no a `$BIN`. +# Los tres controles de arriba pasan con este camino roto —todos entran por el envoltorio—, y el +# error sale después, en un crate ajeno, diciendo otra cosa. +R=$(ls -dt /store/*-rust 2>/dev/null | while read -r d; do n=${d##*/}; [ "${n#*-}" = "rust" ] && { echo "$d"; break; }; done) +export LD_LIBRARY_PATH="$LAB/lib:$LAB/usr/lib:$R/usr/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" +mkdir -p "$T/src"; : > "$T/src/lib.rs" # sin un target, `locate-project` ni llega a mirar la ruta +printf '[package]\nname = "x"\nversion = "0.0.0"\nedition = "2021"\n' > "$T/Cargo.toml" +if out=$("$R/usr/bin/cargo" locate-project --workspace --message-format=plain --manifest-path="$T/Cargo.toml" 2>&1); then + printf " ✓ %-9s el binario del store arranca sin envoltorio (\$CARGO)\n" "cargo" +else + printf " ✗ %-9s %s\n" "cargo" "$(printf '%s' "$out" | head -1 | cut -c1-60)"; fallos=$((fallos+1)) +fi + [ "$fallos" -eq 0 ] || { echo "==> $fallos comprobación(es) en rojo" >&2; exit 1; } echo "==> $BIN listo"