sergio/takana
> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
recetas: apuntar al vigía que EXISTE, no al que borré
1# spidermonkey (mozjs 128 ESR) — el motor JavaScript de Mozilla. KEYSTONE del frente GNOME: gjs cuelga
2# de él, y gnome-shell cuelga de gjs. Es de lo más DIFÍCIL que hay en cualquier distro.
3#
4# ⚠ PRIMER BORRADOR — NO va a sellar a la primera. mozjs sobre musl nunca compila de un saque; el
5# sistema de build de Mozilla (mach/configure) NO es uno de los auto-detectados por el lab, así que las
6# fases van A MANO y hay que ITERARLAS EN EL WORKER (ccx33 o mayor: el compile C++ come ~8GB+ y quiere
7# swap; ccx23 va justo). Anclado al APKBUILD de mozjs128 de Alpine (misma libc musl). Decisiones:
8# · Fuente = tarball del SOURCE de Firefox 128.14.0esr (mozjs se construye desde js/src de ese árbol).
9# · clang (el rootfs trae LLVM 22); mozjs prefiere clang fuerte a gcc.
10# · icu IN-TREE (--without-system-icu): evita casar versiones de un icu del sistema (una dep menos).
11# · nspr y zlib del sistema (recetas nspr + zlib del corpus).
12# · shared-js (libmozjs-128.so) — lo que gjs enlaza.
13# Cosas que MUY probablemente haya que tocar al iterar: el nombre exacto del build dir/mach vs configure,
14# --enable-release/--enable-hardening, flags de linker (lld), y RUST/CBINDGEN en PATH. Cuando selle en
15# el worker, se congela el hash y se promueve.
16name = "spidermonkey"
17version = "128.14.0"
18license = "MPL-2.0"
19
20[source]
21tarball = "https://ftp.mozilla.org/pub/firefox/releases/128.14.0esr/source/firefox-128.14.0esr.source.tar.xz"
22sha256 = "93b9ef6229f41cb22ff109b95bbf61a78395a0fe4b870192eeca22947cb09a53"
23strip_components = 1
24
25[build]
26compiler = "clang"
27target = "x86_64-linux-musl"
28link = "dynamic"
29
30[build.phases]
31# MOZBUILD_STATE_PATH: mach crea ahí su virtualenv de build. CADA fase es un bwrap aparte con
32# `--tmpfs /tmp`, así que un venv en /tmp NO sobrevive de configure a compile ("bin/python: No such
33# file or directory"). Lo anclamos a /src/.mozbuild (bind RW, persiste entre fases; es scratch, no
34# entra a /out ⇒ no afecta el artefacto). MOZ_NOSPAM calla la telemetría. Va en las tres fases.
35# Se construye en un obj-dir separado dentro de js/src (idioma de mozjs). CC/CXX=clang explícitos.
36# AR=llvm-ar: mozjs con clang quiere la suite binutils de LLVM (llvm-ar/llvm-objdump/llvm-profdata).
37# El rootfs las provee vía el paquete `llvm22` con symlinks en /usr/bin (bootstrap-devfs.sh); antes
38# faltaban (sólo estaba `clang`) y configure abortaba "Cannot find ar/llvm-objdump".
39# TRIPLE: mozjs exige que el --host de configure COINCIDA con el host que reporta rustc. El rustc del
40# rootfs (Alpine) es `x86_64-alpine-linux-musl` (vendor `alpine`, no `pc` ni `unknown`); con cualquier
41# otro, mozjs aborta ("rust compiler host ... not suitable for the configure host"). Fijamos ese triple
42# exacto — clang lo acepta (vendor genérico) y así C-host == rust-host, que es lo que mozjs valida.
43configure = "export MOZBUILD_STATE_PATH=/src/.mozbuild MOZ_NOSPAM=1 SHELL=/bin/sh PYTHON=python3 && cd js/src && mkdir -p obj && cd obj && CC=clang CXX=clang++ AR=llvm-ar ../configure --prefix=/usr --host=x86_64-alpine-linux-musl --target=x86_64-alpine-linux-musl --disable-debug --enable-optimize --enable-release --enable-hardening --disable-jemalloc --enable-shared-js --disable-tests --without-system-icu --with-system-nspr --with-system-zlib"
44compile = "export MOZBUILD_STATE_PATH=/src/.mozbuild MOZ_NOSPAM=1 && cd js/src/obj && make -j\"$(nproc)\""
45install = "export MOZBUILD_STATE_PATH=/src/.mozbuild MOZ_NOSPAM=1 && cd js/src/obj && make DESTDIR=/out install"
46
47[deps]
48# ⚠ DEP DE EJECUCIÓN, NO DE BUILD — Y NO ES DECORACIÓN (2026-09-06).
49# Este artefacto declara `NEEDED libstdc++.so.6` / `libgcc_s.so.1`, y hasta hoy NADIE en el corpus
50# las proveía: sólo existían en `.dev-fs/alpine`, o sea en el LAB. El binario sellaba, REPRODUCÍA
51# bit a bit, pasaba todos los guardianes… y no arrancaba fuera del lab. Se descubrió corriendo
52# `atuq` bajo un sway headless, no leyendo el grafo.
53# `runtime` NO entra en el ArtifactHash (igual que `license`), así que declararlo NO re-hashea:
54# lo que cambia es la CLAUSURA, que es lo que se hidrata en la imagen. Lo vigila
55# `scripts/vigia-sonames.py`, que corre en el latido y deja `docs/state/sonames.txt`.
56runtime = ["gcc-libs"]
57build = ["nspr", "nasm", "cbindgen", "python3", "make", "zlib", "pkgconf"]