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>
92 lines
4.8 KiB
TOML
92 lines
4.8 KiB
TOML
# LLVM 21.1.2 — el LLVM que `rustc` necesita. NO es un duplicado de `llvm18`: son para dos cosas
|
|
# distintas y ninguna sirve para la otra.
|
|
#
|
|
# ══ POR QUÉ 21 Y NO EL 18 QUE YA ESTÁ SELLADO ══════════════════════════════════════════════════
|
|
# El plan era «rustc desde fuente con el llvm18 del corpus». Medido en el propio bootstrap de rustc
|
|
# (`src/bootstrap/src/core/build_steps/llvm.rs`), el mínimo por versión es:
|
|
#
|
|
# rustc 1.87 → LLVM ≥18 · 1.90 → ≥19 · 1.93/1.95 → ≥20 · **1.97 → ≥21**
|
|
#
|
|
# panic!("\n\nbad LLVM version: {version}, need >=21\n\n")
|
|
#
|
|
# El lab —y por tanto todo lo que construimos— está en **rust 1.97.0**, así que con `llvm18` sólo se
|
|
# podría construir `rustc 1.87`… que a su vez no se puede bootstrapear con lo que tenemos. La salida
|
|
# no es bajar de rustc: es subir de LLVM.
|
|
#
|
|
# `llvm18` se queda donde está: lo usa `mesa-llvmpipe` y mesa 24.0.9 **no soporta** LLVM 21. Dos
|
|
# consumidores con rangos incompatibles ⇒ dos artefactos. No es deuda, es la realidad de los rangos.
|
|
#
|
|
# ══ DIFERENCIAS DE BUILD FRENTE A `llvm18`, Y SON A PROPÓSITO ══════════════════════════════════
|
|
# · **Sin DYLIB.** `llvm18` construye `libLLVM.so` porque mesa la enlaza. rustc quiere las estáticas
|
|
# y su `llvm-config`; y el link del dylib es lo que pide MUCHA RAM (la receta de llvm18 anota
|
|
# «worker GORDO» por eso). Sin él, el pico baja y entra en el worker de 6 núcleos y 16 G.
|
|
# · **RTTI ON** (rustc lo exige) y sólo el target **X86**: nada de compilar los 20 backends.
|
|
name = "llvm21"
|
|
version = "21.1.2"
|
|
license = "Apache-2.0 WITH LLVM-exception"
|
|
|
|
[source]
|
|
tarball = "https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.2/llvm-project-21.1.2.src.tar.xz"
|
|
sha256 = "1a417d1c8faf8d93e73fec1cbb76d393ed3218974c2283c7bac9672d3d47c54b"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
# ⚠⚠ `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.
|
|
# ⚠ `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
|
|
# escala con zig sigue siendo terreno minado (ver el runtime de C++ que tiene que COINCIDIR).
|
|
configure = '''
|
|
CC=gcc CXX='g++ -static-libstdc++ -static-libgcc' \
|
|
cmake -S llvm -B build -G Ninja \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX=/usr \
|
|
-DLLVM_TARGETS_TO_BUILD=X86 \
|
|
-DLLVM_BUILD_LLVM_DYLIB=OFF \
|
|
-DLLVM_LINK_LLVM_DYLIB=OFF \
|
|
-DLLVM_ENABLE_RTTI=ON \
|
|
-DLLVM_ENABLE_PROJECTS="" \
|
|
-DLLVM_ENABLE_TERMINFO=OFF \
|
|
-DLLVM_ENABLE_ZLIB=ON \
|
|
-DLLVM_ENABLE_ZSTD=OFF \
|
|
-DLLVM_ENABLE_LIBXML2=OFF \
|
|
-DLLVM_ENABLE_LIBEDIT=OFF \
|
|
-DLLVM_ENABLE_BINDINGS=OFF \
|
|
-DLLVM_INCLUDE_TESTS=OFF \
|
|
-DLLVM_INCLUDE_EXAMPLES=OFF \
|
|
-DLLVM_INCLUDE_BENCHMARKS=OFF \
|
|
-DLLVM_INCLUDE_DOCS=OFF
|
|
'''
|
|
compile = "ninja -C build"
|
|
install = "DESTDIR=/out ninja -C build install"
|