Files
takana/recipes/wasi-sdk.toml
T
Sergio 85a393aff4 cadena wasm completa: wasi-libc y wasi-sdk sellan (SDD 26, unidad 3.b)
Los cuatro eslabones que enciende RLBox en firefox, sellados de punta a punta:

  wasi-libc-headers  b3:54c6e96d  (andamio, rompe el ciclo del bootstrap)
  wasi-compiler-rt   b3:a3fe63d1  (libclang_rt.builtins-wasm32.a)
  wasi-libc          b3:8e50b145  (libc.a 970.734 bytes, 32 archivos .a)
  wasi-sdk           b3:c8a587fa  (el .cfg que hace el sysroot invisible)

Los dos primeros ya estaban construidos; los dos últimos costaron dos fallos, y
ninguno de los dos era de la receta:

1. `check-symbols` moría por SESGO DE CLANG, no por un artefacto malo. El lab
   trae clang 22.1.8 y este commit de wasi-libc (2025-06-26) congeló su snapshot
   de macros predefinidos contra un clang anterior, así que el diff completo era
   UNA línea: `+#define __wasip1__ 1`. La mitad que importa —los símbolos
   definidos e indefinidos de la libc recién construida— coincidía byte a byte.
   Por eso se RECONCILIA `expected/*/predefined-macros.txt` en vez de saltar el
   chequeo con `make no-check-symbols`, que era la salida fácil: ese target
   existe y se lleva por delante también la comparación de símbolos, que es la
   que vale. Así cualquier OTRA deriva sigue matando el build.

2. `make TARGET_TRIPLE=NOBUILD ... install` NO es un no-op. La regla `install`
   depende de `finish`, que depende de `libc`, así que make no lee el triple
   inexistente como «no construyas» sino como «construí para el triple NOBUILD»
   y muere en `build/NOBUILD/.../crt1-command.o` con `invalid thread model
   'single'` — un error que nombra un fichero que nadie pidió. Se copia
   `sysroot/{lib,share,include}` a mano, que es literalmente lo que hace la
   regla de upstream (`SYSROOT ?= $(CURDIR)/sysroot`).

Cada receta lleva su guardián de contenido, porque acá el modo de fallo caro no
es el ausente sino el vacío: un sysroot con headers y sin libc.a pasa por bueno
y revienta dentro del build de firefox, horas después y sin nombrar a nadie de
esta cadena. Verificado en verde: los builtins son objetos wasm de verdad
(magic 0061736d, no x86_64 nativos) y el .cfg de wasi-sdk apunta a un sysroot
que existe.

El segundo fallo lo diagnosticamos entre dos sesiones: hammer-f8 aportó el
`invalid thread model 'single'` que explicaba la línea que yo veía.

Queda para la próxima unidad el flip de recipes/firefox.toml:
--without-wasm-sandboxed-libraries -> --with-wasi-sysroot, que es un rebuild
largo y su propia unidad de trabajo.
2026-09-06 01:29:41 +00:00

58 lines
2.3 KiB
TOML

# wasi-sdk — el fichero de configuración que le dice a clang dónde está el sysroot de wasm.
#
# Es la pieza más chica de la cadena y la que la vuelve INVISIBLE para quien la usa: sin esto,
# firefox tendría que enterarse por un flag de cómo llegar al sysroot; con esto, `clang
# --target=wasm32-wasip1` lo encuentra solo. El clang de Alpine lee `/etc/clang22/<triple>.cfg`
# —el lab ya trae ahí su propio `x86_64-alpine-linux-musl.cfg`, así que el mecanismo está probado en
# esta misma máquina— y overlayfs FUSIONA directorios, así que esta dep suma su fichero sin pisar el
# del lab.
#
# NO TIENE FUENTE UPSTREAM porque el contenido es nuestro: una línea. Usa `[source] dir`, el modo
# que se agregó para `atuq` (SDD 26 §2.ter). Es su segundo consumidor, y el primero fuera del caso
# que lo motivó.
#
# ⚠ `/etc/clang22` lleva la versión del lab en la RUTA. No es una constante que se pueda olvidar: si
# el lab sube de LLVM, esta ruta deja de existir y el sysroot se vuelve invisible en silencio — por
# eso el guardián de abajo comprueba que el directorio del lab exista ANTES de escribir dentro.
name = "wasi-sdk"
version = "27"
license = "Apache-2.0"
[source]
dir = "wasi-sdk"
[build]
compiler = "clang"
[deps]
build = ["wasi-libc"]
[build.phases]
configure = "true"
compile = "true"
install = '''
set -e
# Si el lab cambió de versión de LLVM, esta ruta ya no es la que clang lee. Fallar acá es barato;
# fallar dentro del build de firefox, cuatro horas después y con un error sobre un header de wasm
# que no nombra a esta receta, no lo es.
test -d /etc/clang22 || {
echo "!! el lab no tiene /etc/clang22: ¿subió de versión de LLVM?" >&2
ls -d /etc/clang* 2>/dev/null >&2
exit 1
}
mkdir -p /out/etc/clang22
cp /src/wasm32-unknown-wasip1.cfg /out/etc/clang22/
cp /src/wasm32-unknown-wasip1-threads.cfg /out/etc/clang22/
# GUARDIÁN: que el sysroot al que apunta el .cfg EXISTA. Un `--sysroot` que señala a la nada no da
# error: clang sigue adelante y falla mucho después por headers que no encuentra.
S=$(sed -n 's/^--sysroot //p' /out/etc/clang22/wasm32-unknown-wasip1.cfg)
test -f "$S/lib/wasm32-wasip1/libc.a" || {
echo "!! el .cfg apunta a $S y ahí no hay libc.a de wasm32-wasip1" >&2
exit 1
}
echo "guardián: /etc/clang22 apunta a un sysroot wasm real ($S)"
'''