Files
takana/recipes/wasi-compiler-rt.toml
Sergio e852f48491 takana etapa 5a: los comentarios de las 741 recetas
Barrido de TEXTO puro: 1427 líneas de comentario TOML. Cero ArtifactHash
movidos, y eso está MEDIDO, no deducido: hasheé las 741 antes y después y los
ficheros de hashes son idénticos byte a byte (723 con hash real + 18 que ya no
hasheaban de antes).

El guardián valió la pena: el primer barrido, filtrando por 'la línea empieza
con #', movió el hash de helix, lsof y steam-runtime-sniper. La causa es que una
fase se escribe como compile = <triple> ... <triple> y sus comentarios de SHELL
también empiezan con #, pero viven dentro del VALOR — y las fases sí entran en
hash_inputs. El barrido ahora calcula los rangos de las cadenas multilínea de
TOML y no entra ahí.

Quedan intactos a propósito: .hammer-zig-cc y .hammer-cargo-vendor (literales
dentro de fases), hammerd, hammer-recover y toda ruta que empiece por /
2026-09-09 19:23:26 +00:00

142 lines
7.0 KiB
TOML

# wasi-compiler-rt — los builtins de compiler-rt compilados a wasm32.
#
# QUÉ ES: la runtime del compilador para WebAssembly (`libclang_rt.builtins-wasm32.a`). Sin esto no
# se puede enlazar NADA a wasm, y por eso es el primer eslabón real del sandbox RLBox de firefox
# (SDD 26 §3.bis, lectura 1: RLBox apagado es una desventaja de SEGURIDAD — es la jaula wasm
# alrededor de los parsers de fuentes y medios, o sea justo el código que come entrada no confiable).
#
# NO CONSTRUYE LLVM. El lab ya trae LLVM 22.1.8 CON el backend de WebAssembly compilado dentro
# (comprobado: `wasm32`, `wasm64` y las descripciones "WebAssembly 32-bit/64-bit" están en
# `libLLVM.so.22.1`). De acá sale sólo la runtime, que son ~100 ficheros C: minutos, no horas.
#
# ⚠ LA VERSIÓN TIENE QUE SEGUIR A LA DEL LAB. Los builtins son un contrato con el clang que los va a
# usar: Alpine lo escribe como `wasi-compiler-rt~$_llvmver` en las makedepends de firefox. Acá el
# tarball es 22.1.8 y el lab tiene llvm22 22.1.8-r1 — MISMA versión upstream. Si el lab sube de
# LLVM, esta receta sube con él. Y no queda al aire: `clang` y `llvm` son prefijos de
# `TOOLCHAIN_PREFIXES` (takana-core/src/lab.rs), así que un bump del lab MUEVE la huella y re-hashea
# esto solo. La alineación es un invariante vigilado, no una nota al pie.
#
# DÓNDE ATERRIZA: `/usr/lib/llvm22/lib/clang/22/lib/wasi/`, que es el resource dir donde clang
# busca los builtins sin que nadie le pase un flag. En el lab ese `lib/` NO existe (sólo hay
# `include/`), y las deps se apilan como capas overlay BAJO el rootfs ⇒ esta receta lo CREA sin
# pisar nada del lab.
#
# Verificado: el sha512 del tarball coincide byte a byte con el del APKBUILD de Alpine.
name = "wasi-compiler-rt"
version = "22.1.8"
license = "Apache-2.0 WITH LLVM-exception"
[source]
tarball = "https://github.com/llvm/llvm-project/releases/download/llvmorg-22.1.8/llvm-project-22.1.8.src.tar.xz"
sha256 = "922f1817a0df7b1489272d18134ee0087a8b068828f87ac63b9861b1a9965888"
[build]
compiler = "clang"
[deps]
# `python3`: el CMakeLists de compiler-rt busca Python3 y, si no lo encuentra, cae a un
# `find_package(Python2 ... REQUIRED)` que MUERE. El error dice "Could NOT find Python2" y lo
# que falta es python3 — el mensaje nombra el fallback, no la causa.
build = ["cmake", "samurai", "python3", "wasi-libc-headers"]
[build.phases]
configure = '''
set -e
# El toolchain file de wasi-sdk, ESCRITO ACÁ EN VEZ DE TRAÍDO. Upstream son 38 líneas repartidas en
# dos ficheros del tarball de wasi-sdk (`wasi-sdk.cmake` + `cmake/Platform/WASI.cmake`, y el segundo
# es literalmente `set(WASI 1)`). Traerlos costaría una fuente de red y una receta enteras para 38
# líneas de declaraciones puras — peor trato. Se transcriben de wasi-sdk-27, que es el que Alpine
# pinea para esta misma versión de compiler-rt.
mkdir -p cmake/Platform
echo 'set(WASI 1)' > cmake/Platform/WASI.cmake
cat > wasi-sdk.cmake <<'EOF'
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
set(CMAKE_SYSTEM_NAME WASI)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR wasm32)
set(triple wasm32-wasi)
set(CMAKE_C_COMPILER ${WASI_SDK_PREFIX}/bin/clang)
set(CMAKE_CXX_COMPILER ${WASI_SDK_PREFIX}/bin/clang++)
set(CMAKE_ASM_COMPILER ${WASI_SDK_PREFIX}/bin/clang)
set(CMAKE_AR ${WASI_SDK_PREFIX}/bin/llvm-ar)
set(CMAKE_RANLIB ${WASI_SDK_PREFIX}/bin/llvm-ranlib)
set(CMAKE_C_COMPILER_TARGET ${triple})
set(CMAKE_CXX_COMPILER_TARGET ${triple})
set(CMAKE_ASM_COMPILER_TARGET ${triple})
# No buscar EJECUTABLES en el sysroot (los de correr durante el build son del host); el resto,
# SÓLO en el sysroot, para que no se cuele una lib nativa x86_64 en un enlace a wasm.
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
EOF
# CFLAGS/LDFLAGS del entorno se limpian a propósito: cualquier flag pensado para el x86_64 nativo
# (un `-static`, un `-march`) es veneno en un enlace a wasm32 y el error que produce no se parece
# en nada a la causa.
unset CFLAGS CXXFLAGS LDFLAGS
cmake -B build -G Ninja -S compiler-rt -Wno-dev \
-DCMAKE_BUILD_TYPE=MinSizeRel \
-DCMAKE_MODULE_PATH=/src/cmake \
-DCMAKE_TOOLCHAIN_FILE=/src/wasi-sdk.cmake \
-DCMAKE_C_COMPILER_WORKS=ON \
-DCMAKE_CXX_COMPILER_WORKS=ON \
-DCOMPILER_RT_BAREMETAL_BUILD=ON \
-DCOMPILER_RT_INCLUDE_TESTS=OFF \
-DCOMPILER_RT_HAS_FPIC_FLAG=OFF \
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
-DCOMPILER_RT_OS_DIR=wasi \
-DCMAKE_AR=/usr/bin/llvm-ar \
-DCMAKE_RANLIB=/usr/bin/llvm-ranlib \
-DWASI_SDK_PREFIX=/usr \
-DCMAKE_INSTALL_PREFIX=/usr/lib/llvm22/lib/clang/22/ \
-DCMAKE_SYSROOT=/usr/share/wasi-sysroot-bootstrap
'''
compile = 'cmake --build build'
install = '''
set -e
DESTDIR=/out cmake --install build
RES=/out/usr/lib/llvm22/lib/clang/22
# El `include/` del resource dir pertenece al LAB (son los headers de clang). Instalarlo desde acá
# lo taparía con una copia del tarball: misma trampa que las deps `clang18`/`llvm18` que había que
# quitar de firefox. Fuera.
rm -rf "$RES/include"
# Los alias que espera clang según cómo se nombre el target. `wasm32-wasi` se renombró a
# `wasm32-wasip1` en LLVM 22.1 (lo dice el propio configure de Mozilla), así que el mismo `.a`
# tiene que responder a los dos nombres o el enlace falla por un alias que no existe.
for p in 1 2; do
ln -s ./wasi "$RES/lib/wasm32-wasip$p"
ln -s ./wasi "$RES/lib/wasm32-unknown-wasip$p"
done
ln -s ./libclang_rt.builtins-wasm32.a "$RES/lib/wasi/libclang_rt.builtins.a"
# GUARDIÁN. Un `cmake --install` que no instala nada sale con 0 y deja el árbol vacío — que en el
# store es un cache-hit envenenado, no un fallo. Se exige el fichero Y que sea un archivo wasm de
# verdad, no un `.a` vacío ni uno de objetos x86_64.
A="$RES/lib/wasi/libclang_rt.builtins-wasm32.a"
test -s "$A" || { echo "!! no se instaló $A" >&2; find /out -name 'libclang_rt*' >&2; exit 1; }
N=$(llvm-nm --print-file-name "$A" 2>/dev/null | wc -l)
test "$N" -gt 0 || { echo "!! $A no tiene símbolos: archivo vacío" >&2; exit 1; }
# Que los miembros sean WASM y no x86_64 nativos. Es LA comprobación que importa: si el sysroot o el
# triple se configuran mal, cmake compila igual pero produce objetos nativos, el `.a` queda lleno y
# con símbolos, y el fallo recién aparece al enlazar firefox — lejos y sin nombrar a esta receta.
# Se mira el número mágico del objeto (`\0asm`), no el nombre del fichero: la primera versión de
# este guardián exigía que el miembro terminara en `.o` y lo rechazó estando BIEN construido,
# porque compiler-rt los nombra de otro modo. Una convención de nombre no es una propiedad.
M=$(llvm-ar t "$A" | head -1)
mkdir -p /tmp/guardian && (cd /tmp/guardian && llvm-ar x "$A" "$M")
MAGIC=$(od -An -tx1 -N4 "/tmp/guardian/$M" | tr -d ' \n')
test "$MAGIC" = "0061736d" || {
echo "!! los objetos de $A NO son wasm (magic=$MAGIC, esperaba 0061736d)" >&2
echo " primer miembro: $M" >&2
exit 1
}
echo "guardián: builtins wasm32 instalados ($(llvm-ar t "$A" | wc -l) objetos, magic wasm ok, $(stat -c%s "$A") bytes)"
'''