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…

llvm21: `dynamic` y con zlib — las 79 herramientas dejan de crashear, y rust se rehace detrás

Dos cambios, los dos medidos, y los dos re-sellan la cadena entera (`link` y las deps son entrada de
hash): `llvm21` 95956a16… → bd4a4094…, `rust` 015a07fb… → 702094a8…, `lld21` → 95a4794b…

1. `link = "dynamic"`. Con `static`, las 79 herramientas que publica el artefacto CRASHEAN —`llc
   --version` incluido, y también en el worker, o sea que es el build y no el entorno—: salen
   `static-pie` y el enlace estático descarta los constructores globales de los que dependen los
   registros de LLVM (`cl::opt`, `TargetRegistry`). Funciona lo que no los necesita (`llvm-ar`,
   `llvm-config`) y revienta lo que sí. **No se notó en meses porque el único consumidor, `rust`, usa
   `llvm-config` y las `.a` — nunca una herramienta.** Lo destapó `lld21`, que enlaza contra estas
   mismas librerías: estático crasheaba con cualquier entrada, dinámico da errores limpios.
2. `-DLLVM_ENABLE_ZLIB=ON` + dep `zlib`. Sin eso, cualquier `lld` construido contra este LLVM hereda
   `LLVM_ENABLE_ZLIB 0` de `LLVMConfig.cmake` y no puede leer las secciones de depuración COMPRIMIDAS
   que trae la libc del lab. Encenderlo acá es la única vía: el build standalone de lld no puede
   contradecir a su LLVM.

Las `.a` que consume `rust` no cambian de contenido —el flag sólo quita el `-static` del enlace de
los EJECUTABLES— pero el hash sí, y eso es correcto: es lo que hace que la granja rehaga rust con un
LLVM cuyas herramientas funcionan.

Los tres hashes coinciden hub↔worker antes de sembrar.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

bad2b1c63af7ad77f26b06ebe3796c1f9af4e6f0 · ruwaq Sergio · (1 killa ñawpaq) · tayta 2ff2a3115 · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

2 qillqakuna · +27 −3

diff --git a/recipes/incoming/llvm21.toml b/recipes/incoming/llvm21.toml
new file mode 120000
index 00000000..998b2a20
--- /dev/null
+++ b/recipes/incoming/llvm21.toml
@@ -0,0 +1 @@
+../llvm21.toml
\ No newline at end of file
diff --git a/recipes/llvm21.toml b/recipes/llvm21.toml
index 6668c78b..c8777b3b 100644
--- a/recipes/llvm21.toml
+++ b/recipes/llvm21.toml
@@ -32,13 +32,36 @@ sha256  = "1a417d1c8faf8d93e73fec1cbb76d393ed3218974c2283c7bac9672d3d47c54b"
 [build]
 compiler = "zig-cc"
 target   = "x86_64-linux-musl"
-link     = "static"
+# ⚠⚠ `dynamic`, y no es preferencia: con `static` **las 79 herramientas que publica este artefacto
+# CRASHEAN** (medido 2026-09-16, y también en el worker, o sea que es el build y no el entorno):
+#
+#     $ llc --version
+#     PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ …
+#     Stack dump:            ← y segfault, con el volcado vacío
+#
+# Salen `static-pie`, y el enlace estático descarta los constructores globales de los que dependen
+# los registros de LLVM (`cl::opt`, `TargetRegistry`): funciona lo que no los necesita (`llvm-ar`,
+# `llvm-config`) y revienta lo que sí. **No se notó durante meses porque el único consumidor, `rust`,
+# usa `llvm-config` y las `.a` — nunca una herramienta.** Lo destapó construir `lld21`, que enlaza
+# contra estas mismas librerías: estático crasheaba con cualquier entrada, dinámico da errores
+# limpios. Es la misma familia que `link-static-mentira-libtool` y que el openssl sin threads: **el
+# flag global de la receta decide cosas que la receta no dice**.
+#
+# Las `.a` que consume `rust` no cambian de contenido —el flag sólo quita el `-static` del enlace de
+# los EJECUTABLES—, pero `link` sí entra en `hash_inputs`, así que esto re-sella `llvm21` y con él
+# `rust`. Es el precio de tener herramientas que funcionan.
+link     = "dynamic"
 flags    = []
 
 [deps]
 # Mismas deps que `llvm18`: `samurai` es el ninja del corpus (nombre distinto, mismo programa) y
 # `pkgconf` lo pide el configure de cmake.
-build = ["cmake", "samurai", "python3", "pkgconf"]
+# ⚠ `zlib` NO es un extra: sin él, el `lld` que se construye contra este LLVM hereda
+# `LLVM_ENABLE_ZLIB 0` de `LLVMConfig.cmake` y no puede leer las secciones de depuración COMPRIMIDAS
+# que trae la libc del lab —«is compressed with ELFCOMPRESS_ZLIB, but lld is not built with zlib
+# support»—, o sea que no puede enlazar nada real. Encenderlo acá es la única vía: el build
+# standalone de lld no puede contradecir a su LLVM.
+build = ["cmake", "samurai", "python3", "pkgconf", "zlib"]
 
 [build.phases]
 # `g++` del sandbox con `-static-libstdc++ -static-libgcc`, igual que `llvm18` y `cmake`: C++ a
@@ -54,7 +77,7 @@ cmake -S llvm -B build -G Ninja \
   -DLLVM_ENABLE_RTTI=ON \
   -DLLVM_ENABLE_PROJECTS="" \
   -DLLVM_ENABLE_TERMINFO=OFF \
-  -DLLVM_ENABLE_ZLIB=OFF \
+  -DLLVM_ENABLE_ZLIB=ON \
   -DLLVM_ENABLE_ZSTD=OFF \
   -DLLVM_ENABLE_LIBXML2=OFF \
   -DLLVM_ENABLE_LIBEDIT=OFF \