jaula: el envoltorio hacía arrancar a cargo, pero no a lo que cargo LANZA

cargo exporta `CARGO=<ruta del binario REAL>` —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. 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 en /lib, `llimphi-ui` de tawasuyu —winit + accesskit + wgpu— compila
entero en 2m17s. La clase es más grande que el caso: cualquier herramienta que
re-ejecute `$CARGO` o `$RUSTC` por ruta absoluta se rompía igual, en un crate
ajeno y a diez capas del origen.

El envoltorio ya prefería el cargador de la caja (`[ -x /lib/ld-musl… ]`); lo que
faltaba era ponerlo cuando no está. En la caja, que es musl, el guion se aparta.

Y va con su control, porque los trece de antes NO lo veían: todos entran por el
envoltorio. Brazo de control corrido con un cargador falso — los trece en verde y
el nuevo en rojo, que es exactamente el hueco.
This commit is contained in:
Sergio
2026-09-21 00:54:12 +00:00
parent 48f8c1d259
commit d09f91c3c3
+32
View File
@@ -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=<ruta del binario REAL>` —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"