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.
58 lines
2.3 KiB
TOML
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)"
|
|
'''
|