# spidermonkey (mozjs 128 ESR) — el motor JavaScript de Mozilla. KEYSTONE del frente GNOME: gjs cuelga
# de él, y gnome-shell cuelga de gjs. Es de lo más DIFÍCIL que hay en cualquier distro.
#
# ⚠ PRIMER BORRADOR — NO va a sellar a la primera. mozjs sobre musl nunca compila de un saque; el
# sistema de build de Mozilla (mach/configure) NO es uno de los auto-detectados por el lab, así que las
# fases van A MANO y hay que ITERARLAS EN EL WORKER (ccx33 o mayor: el compile C++ come ~8GB+ y quiere
# swap; ccx23 va justo). Anclado al APKBUILD de mozjs128 de Alpine (misma libc musl). Decisiones:
#   · Fuente = tarball del SOURCE de Firefox 128.14.0esr (mozjs se construye desde js/src de ese árbol).
#   · clang (el rootfs trae LLVM 22); mozjs prefiere clang fuerte a gcc.
#   · icu IN-TREE (--without-system-icu): evita casar versiones de un icu del sistema (una dep menos).
#   · nspr y zlib del sistema (recetas nspr + zlib del corpus).
#   · shared-js (libmozjs-128.so) — lo que gjs enlaza.
# Cosas que MUY probablemente haya que tocar al iterar: el nombre exacto del build dir/mach vs configure,
# --enable-release/--enable-hardening, flags de linker (lld), y RUST/CBINDGEN en PATH. Cuando selle en
# el worker, se congela el hash y se promueve.
name    = "spidermonkey"
version = "128.14.0"
license = "MPL-2.0"

[source]
tarball          = "https://ftp.mozilla.org/pub/firefox/releases/128.14.0esr/source/firefox-128.14.0esr.source.tar.xz"
sha256           = "93b9ef6229f41cb22ff109b95bbf61a78395a0fe4b870192eeca22947cb09a53"
strip_components = 1

[build]
compiler = "clang"
target   = "x86_64-linux-musl"
link     = "dynamic"

[build.phases]
# MOZBUILD_STATE_PATH: mach crea ahí su virtualenv de build. CADA fase es un bwrap aparte con
# `--tmpfs /tmp`, así que un venv en /tmp NO sobrevive de configure a compile ("bin/python: No such
# file or directory"). Lo anclamos a /src/.mozbuild (bind RW, persiste entre fases; es scratch, no
# entra a /out ⇒ no afecta el artefacto). MOZ_NOSPAM calla la telemetría. Va en las tres fases.
# Se construye en un obj-dir separado dentro de js/src (idioma de mozjs). CC/CXX=clang explícitos.
# AR=llvm-ar: mozjs con clang quiere la suite binutils de LLVM (llvm-ar/llvm-objdump/llvm-profdata).
# El rootfs las provee vía el paquete `llvm22` con symlinks en /usr/bin (bootstrap-devfs.sh); antes
# faltaban (sólo estaba `clang`) y configure abortaba "Cannot find ar/llvm-objdump".
# TRIPLE: mozjs exige que el --host de configure COINCIDA con el host que reporta rustc. El rustc del
# rootfs (Alpine) es `x86_64-alpine-linux-musl` (vendor `alpine`, no `pc` ni `unknown`); con cualquier
# otro, mozjs aborta ("rust compiler host ... not suitable for the configure host"). Fijamos ese triple
# exacto — clang lo acepta (vendor genérico) y así C-host == rust-host, que es lo que mozjs valida.
configure = "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"
compile   = "export MOZBUILD_STATE_PATH=/src/.mozbuild MOZ_NOSPAM=1 && cd js/src/obj && make -j\"$(nproc)\""
install   = "export MOZBUILD_STATE_PATH=/src/.mozbuild MOZ_NOSPAM=1 && cd js/src/obj && make DESTDIR=/out install"

[deps]
build = ["nspr", "nasm", "cbindgen", "python3", "make", "zlib", "pkgconf"]
