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 1483Shell 181Rust 107Markdown 963619 Definitions

✅ RUST COMPILA EN LA CAJA — paso 1 cerrado, y tres paquetes que estaban en el perfil equivocado

`rustc 1.97.0` y `cargo 1.97.0` responden en `2.29.29.217`, y un `fn main(){println!("ok");}`
compila y **corre**. El toolchain oficial de rust-lang, verificado por su sha256 y sellado tal cual
con `foreign = true` (son bytes ajenos, no un build nuestro: clase `ajeno`, fuera del recuento del
corpus).

Lo que costó hacerlo correr, y ninguna de las dos cosas se ve en el grafo porque las dos estaban
`sealed` y en el perfil equivocado:

1. **El cargador musl.** `rustc` es PIE dinámico (`NEEDED librustc_driver-*.so`, `NEEDED libc.so`).
   En el worker ni arranca —`cannot execute: required file not found`, que es como se ve la falta
   del intérprete—; en la caja sí, porque ahí está `musl-shared`.
2. **`libgcc_s.so.1`**: `Error loading shared library … _Unwind_Resume: symbol not found`. Lo
   publica `gcc-libs`, sellado y declarado **sólo en los cuatro perfiles de escritorio**. Una línea
   en `base`. Es la tercera vez HOY que aparece la misma figura —`tar`, `os-release`, `gcc-libs`—:
   el paquete existe, está sellado, y no viaja en la imagen que lo necesita.

Y una propiedad que vale anotar: **no hace falta un `cc`**. El primer `rustc` falla con
`linker \`cc\` not found` y no hay que traer un compilador de C — el toolchain **trae su propio
lld** (`rustlib/<target>/bin/rust-lld`), y con `-C linker-flavor=ld.lld -C link-self-contained=yes`
enlaza y el binario corre. Una distro sin compilador de C puede compilar Rust igual.

Va en `perfil.servidor` y no en `base`: son 799 M y una imagen de escritorio no compila nada.

Pendiente, que es config del SITIO y no de la receta: que esas flags sean el default
(`/etc/cargo/config.toml`), para que `cargo build` funcione sin recordarlas.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn

41ab76c8a0c9a42d744b0d1b31b71bd866fa8966 · by Sergio · (1 month ago) · parent cd78bb98c · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

2 files · +42 −0

diff --git a/docs/state/targets.toml b/docs/state/targets.toml
index 497a2231..8c720b97 100644
--- a/docs/state/targets.toml
+++ b/docs/state/targets.toml
@@ -24,6 +24,12 @@ descripcion = "userland foundational C: la distro arranca y se usa (shell, VCS,
 # Lift verbatim de BASE_SYSTEM_PKGS (scripts/product-userland-from-repo.sh). De-Alpinizado y firmado,
 # tandas base-system-1..3.
 paquetes = [
+  # `gcc-libs` (2026-09-14): `libgcc_s.so.1` y `libstdc++.so.6`. Estaba sellado y declarado sólo en
+  # los CUATRO perfiles de escritorio — y lo necesita cualquier binario ajeno que no sea estático
+  # puro. Se vio al traer el toolchain oficial de Rust: `rustc` arrancó (el cargador musl ya está,
+  # `musl-shared`) y murió con `Error loading shared library libgcc_s.so.1`. La lección de `foot`
+  # otra vez, y van tres hoy: el paquete existe y no viaja en la imagen que lo necesita.
+  "gcc-libs",
   # `os-release` (2026-09-14): la IDENTIDAD del sistema — nombre, URL, color y **el logo oficial**.
   # No existía: la caja decía «Host: vServer» y ni una palabra de takana. Va en `base` y no en `cli`
   # porque toda imagen de takana debe saber decir qué es, incluida la más pelada: lo lee cualquier
@@ -1331,6 +1337,13 @@ paquetes = [
   # sale 78 si el repo no existe. Una caja que se inventa su identidad soberana al arrancar es peor
   # que una caja sin peer.
   "minga",
+  # `rust-toolchain-bin` (2026-09-14): el compilador de Rust. Va en `servidor` y NO en `base` por
+  # tamaño —799 M— y porque una imagen de escritorio no compila nada; la caja que sirve el repo y
+  # construye sí. Es el paso 1 de tres: prebuilt ajeno (`foreign`) para desbloquear hoy; luego rustc
+  # desde fuente con el `llvm18` ya sellado; luego la cadena mrustc del selfhost. Sin compilador de
+  # Rust, la distro depende del LAB —un rootfs ajeno que ENTRA en el ArtifactHash— para poder
+  # reconstruir su propio instrumental, que son 12 crates y 42 555 líneas.
+  "rust-toolchain-bin",
   # `netup` (2026-09-10): el cliente DHCP propio que levanta la red al arrancar. Entra como RAÍZ
   # aunque su binario YA venga dentro del `product-rootfs`, y por una razón concreta: el del producto
   # está congelado en el artefacto sellado del bootstrap, así que un arreglo de netup no llega nunca
diff --git a/recipes/rust-toolchain-bin.toml b/recipes/rust-toolchain-bin.toml
index 4d01beb8..67773b9e 100644
--- a/recipes/rust-toolchain-bin.toml
+++ b/recipes/rust-toolchain-bin.toml
@@ -51,3 +51,32 @@ compile   = "true"
 # `--disable-ldconfig`: no hay ldconfig acá y su ausencia haría fallar el instalador por un paso que
 # en una distro de binarios estáticos no significa nada.
 install   = "./install.sh --prefix=/out/usr --disable-ldconfig --components=rustc,cargo,rust-std-x86_64-unknown-linux-musl"
+
+# ══ LO QUE COSTÓ HACERLO CORRER, MEDIDO EN LA CAJA ═════════════════════════════════════════════
+# El artefacto sella (799 M) y **no ejecuta** hasta tener dos cosas que la distro publica por
+# separado. Ninguna se ve en el grafo: las dos son `sealed` y estaban en el perfil equivocado.
+#
+# 1. **El cargador musl.** `rustc` es PIE DINÁMICO (`NEEDED librustc_driver-*.so`, `NEEDED libc.so`).
+#    En el worker ni arranca —`cannot execute: required file not found`, que es como se ve la
+#    ausencia del intérprete—; en la caja sí, porque ahí está `musl-shared`.
+# 2. **`libgcc_s.so.1`.** Con el cargador puesto, el siguiente error fue
+#    `Error loading shared library libgcc_s.so.1 … _Unwind_Resume: symbol not found`. Lo publica
+#    `gcc-libs`, que estaba sellado y declarado **sólo en los cuatro perfiles de escritorio**. Una
+#    línea en `base` y listo. (Tercera vez hoy que aparece la misma figura: el paquete existe y no
+#    viaja en la imagen que lo necesita.)
+#
+# Con eso: `rustc 1.97.0` y `cargo 1.97.0` responden en la caja.
+#
+# ══ Y NO HACE FALTA UN `cc` ════════════════════════════════════════════════════════════════════
+# El primer `rustc hola.rs` falla con `linker \`cc\` not found`: la caja no tiene compilador de C.
+# No hace falta traer uno — **el toolchain trae su propio `lld`**
+# (`lib/rustlib/<target>/bin/rust-lld` y su `gcc-ld/`), y con
+#
+#     -C linker-flavor=ld.lld -C linker=<…>/rust-lld -C link-self-contained=yes
+#
+# enlaza y el binario CORRE. Probado en la caja: `fn main(){println!("ok");}` → `ok`. Es una
+# propiedad que vale anotar: una distro sin compilador de C puede compilar Rust igual.
+#
+# ⚠ Pendiente (config del SITIO, no de la receta): que esas flags sean el default, con un
+# `/etc/cargo/config.toml` o el `CARGO_TARGET_*_LINKER` correspondiente, para que `cargo build`
+# funcione sin recordarlas.