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 \