tawasuyu

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…

TOML 1371Shell 128Rust 79Markdown 712422 Definiciones

gnome onda 2: cola driver aislada incoming-gnome-onda2

Cola de build para el worker (patrón onda1): SÓLO los 5 targets listos
(gjs/graphene/pango/gdk-pixbuf/gtk4) + su cierre de deps que vive en
incoming-gnome/ (islas glib/glib-introspected/g-i/py3-setuptools + la cadena
spidermonkey/nspr/nasm/cbindgen). Todas las deps ya selladas ⇒ cache-hit; el
worker sólo mide los 5. Excluye mutter/gnome-shell/gdm (deps no listas) para
no quemar compute en builds condenados. Byte-idénticas al corpus/incoming-gnome
⇒ hashes idénticos (resolver sibling→parent auto-consistente).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

328c7219aab08e151868dc3d9e67363a0e465d0e · por sergio · (hace 2 meses) · padre 4ecfa2ab0 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

13 archivos · +429 −0

diff --git a/recipes/incoming-gnome-onda2/cbindgen.toml b/recipes/incoming-gnome-onda2/cbindgen.toml
new file mode 100644
index 00000000..cc78a993
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/cbindgen.toml
@@ -0,0 +1,23 @@
+# cbindgen — genera headers C/C++ desde código Rust. Herramienta de BUILD de mozjs (el build de
+# SpiderMonkey invoca cbindgen para los bindings de sus crates Rust). Binario Rust; el lab lo detecta
+# como BuildSys::Cargo (hay Cargo.toml + Cargo.lock en el tarball de GitHub) y hace `cargo vendor` en el
+# fetch + `cargo build --release --locked --offline` en el sandbox. Sin sys-crates C ⇒ no necesita el
+# wrapper de AR (ver cargo-recipe-ar-wrapper). Firefox 128 pide cbindgen >= 0.26; 0.27 cumple.
+name    = "cbindgen"
+version = "0.27.0"
+
+[source]
+tarball          = "https://github.com/mozilla/cbindgen/archive/refs/tags/0.27.0.tar.gz"
+sha256           = "dd813d37325d21cd6be807be4f902a5ef130567cb4da17ea743206a3ebeb6303"
+strip_components = 1
+
+[build]
+compiler = "gcc"        # convención de las CLIs Rust: gcc = toolchain del link zig-cc
+target   = "x86_64-linux-musl"
+link     = "static"
+# cbindgen expone lib + bin homónimos ⇒ `cargo rustc -- <crt-static/reloc>` es ambiguo ("extra
+# arguments to rustc can only be passed to one target"). --bin cbindgen fija el target del bin final.
+flags    = ["--bin", "cbindgen"]
+
+[deps]
+build = []
diff --git a/recipes/incoming-gnome-onda2/gdk-pixbuf.toml b/recipes/incoming-gnome-onda2/gdk-pixbuf.toml
new file mode 100644
index 00000000..0ad086a8
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/gdk-pixbuf.toml
@@ -0,0 +1,26 @@
+# gdk-pixbuf 2.44.6 — VARIANTE ISLA DINÁMICA (SHADOW de recipes/gdk-pixbuf.toml estática).
+# Carga/escala de imágenes (loader de GTK4). gtk4 declara GdkPixbuf-2.0 en su introspección ⇒ el scan
+# de gtk4 debe resolver GdkPixbuf-2.0.typelib + libgdk_pixbuf-2.0.so. Ver [[gnome-introspection-dinamica]].
+#
+# vs corpus: link=dynamic, default_library=both, introspection=ENABLED, SIN --prefer-static.
+# Mantengo el resto de flags de la corpus (leaf PNG-only, -Dgio_sniffing=false esquiva shared-mime-info).
+name    = "gdk-pixbuf"
+version = "2.44.6"
+
+[source]
+tarball = "https://download.gnome.org/sources/gdk-pixbuf/2.44/gdk-pixbuf-2.44.6.tar.xz"
+sha256  = "140c2d0b899fcf853ee92b26373c9dc228dbcde0820a4246693f4328a27466fa"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=both -Dpng=enabled -Djpeg=disabled -Dtiff=disabled -Dothers=disabled -Dglycin=disabled -Dbuiltin_loaders=png -Dgio_sniffing=false -Dman=false -Dintrospection=enabled -Dtests=false -Dinstalled_tests=false -Dgtk_doc=false -Dc_args=-Wno-error=date-time"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+# glib(isla) + glib-introspected (GObject-2.0.gir) + gobject-introspection (tools) + libpng (loader PNG).
+[deps]
+build = ["meson", "samurai", "python3", "pkgconf", "glib", "glib-introspected", "gobject-introspection", "libpng", "libffi", "pcre2", "zlib"]
diff --git a/recipes/incoming-gnome-onda2/gjs.toml b/recipes/incoming-gnome-onda2/gjs.toml
new file mode 100644
index 00000000..a5eeeb39
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/gjs.toml
@@ -0,0 +1,37 @@
+# gjs 1.84.2 — los bindings JavaScript de GNOME (GNOME 48). gnome-shell cuelga de gjs, y gjs cuelga de
+# spidermonkey (mozjs-128), que YA está sellado en este repo (recipes/incoming-gnome/spidermonkey.toml,
+# provee mozjs-128.pc). gjs 1.84 requiere mozjs 128 ✓ — coincide con el spidermonkey sellado.
+#
+# ⚠ PRIMER BORRADOR feature-minimal — NO garantiza sellar a la primera. Notas de diseño:
+#   · Build = meson (idioma GNOME, auto-detectado por el lab; calcado de gtk4/glib/libadwaita).
+#   · compiler = zig-cc (como todo el stack meson GNOME del corpus). gjs es cpp+c; zig lo cubre.
+#   · link = DYNAMIC (NO static como gtk4/glib): spidermonkey sólo provee libmozjs-128.so (shared-js);
+#     no hay .a de mozjs contra la que enlazar estáticamente, así que gjs enlaza la .so ⇒ dynamic.
+#   · Feature-minimal: sin instalar tests, sin profiler (evita la dep sysprof-capture), tests de
+#     DBus/GTK saltados, sin x11 (gjs no tiene backend x11 propio; cairo-xlib es `required: false`).
+#     readline SÍ (la receta readline existe y da la shell interactiva/depurador).
+name    = "gjs"
+version = "1.84.2"
+
+[source]
+tarball = "https://download.gnome.org/sources/gjs/1.84/gjs-1.84.2.tar.xz"
+sha256  = "35142edf345705636300291ec3a7d583f14969ff3fae0ff30f4a95b1e6740166"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Dinstalled_tests=false -Dprofiler=disabled -Dskip_dbus_tests=true -Dskip_gtk_tests=true -Dreadline=enabled -Dc_args=-Wno-error=date-time"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+[deps]
+# spidermonkey → mozjs-128.pc (sellado); glib → glib-2.0/gobject-2.0/gio-2.0/gthread-2.0; cairo →
+# cairo + cairo-gobject; libffi, readline, pkgconf existen en el corpus. meson/samurai/python3 = tooling.
+# gobject-introspection: g-ir-scanner ⇒ typelib GjsPrivate + gobject-introspection-1.0.pc en link.
+# glib-introspected: gjs escanea GjsPrivate, que referencia GObject/GLib ⇒ el scan necesita los .gir
+# CORE (GObject-2.0.gir/GLib-2.0.gir) que SÓLO produce glib-introspected. hammer hidrata deps DIRECTAS,
+# no transitivas de g-i ⇒ hay que declararla aquí (misma lección del keystone [[gnome-introspection-dinamica]]).
+build = ["spidermonkey", "glib", "glib-introspected", "cairo", "libffi", "readline", "gobject-introspection", "meson", "samurai", "python3", "pkgconf"]
diff --git a/recipes/incoming-gnome-onda2/glib-introspected.toml b/recipes/incoming-gnome-onda2/glib-introspected.toml
new file mode 100644
index 00000000..df027c31
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/glib-introspected.toml
@@ -0,0 +1,27 @@
+# glib 2.88.1 — GATE TEST de la isla: glib con introspection=ENABLED (produce GLib/GObject/Gio.typelib
+# usando g-ir-scanner+compiler sobre GLib misma). Es el test definitivo del keystone: si sella,
+# g-ir-compiler sirve para los typelibs CORE bajo musl (el SIGSEGV era sólo los .gir X11); si revienta,
+# el tool está roto. Rompe el ciclo glib↔g-i: deps la g-i YA sellada (que usa la glib-stage1 sin
+# introspección, también sellada) ⇒ glib-introspected → g-i → glib(stage1), sin ciclo.
+# Ver [[gnome-introspection-dinamica]].
+name    = "glib-introspected"
+version = "2.88.1"
+
+[source]
+tarball = "https://download.gnome.org/sources/glib/2.88/glib-2.88.1.tar.xz"
+sha256  = "51ab804c56f6eab3e5045c774d1290ac5e4c923d4f9a3d8e33123bee45c1840e"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release -Ddefault_library=both -Dtests=false -Dnls=disabled -Dlibmount=disabled -Dselinux=disabled -Dman-pages=disabled -Dintrospection=enabled -Dglib_debug=disabled -Dglib_assert=false -Dglib_checks=false"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+# glib (stage1, sin introspección) hidrata libglib-2.0.so.0 para que g-ir-scanner (que _giscanner.so
+# dlopea) CORRA al configure. hammer hidrata deps DIRECTAS, no transitivas de g-i ⇒ hay que declararla.
+[deps]
+build = ["meson", "samurai", "python3", "py3-setuptools", "pkgconf", "gobject-introspection", "glib", "libffi", "pcre2", "zlib"]
diff --git a/recipes/incoming-gnome-onda2/glib.toml b/recipes/incoming-gnome-onda2/glib.toml
new file mode 100644
index 00000000..f300b261
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/glib.toml
@@ -0,0 +1,43 @@
+# glib 2.88.1 — VARIANTE DINÁMICA de la ISLA GNOME (SHADOW de recipes/glib.toml estática).
+#
+# Por qué existe: el shell de GNOME (gjs/gnome-shell) usa GObject-introspection en RUNTIME — un
+# typelib mapea cada tipo a una biblioteca COMPARTIDA que gjs `dlopen`ea. g-ir-scanner exige lo mismo
+# al BUILDear: `can't resolve libraries to shared libraries: glib-2.0` si glib es sólo `.a`. Ergo la
+# isla GNOME necesita glib como `.so` real (libglib/gobject/gio/gmodule-2.0.so.0 con SONAME).
+#
+# Por qué NO tocar recipes/glib.toml: la estática la consume el árbol entero (KDE, corpus). Cambiarla
+# re-hashearía cientos de sellados. En su lugar esta variante vive en la cola GNOME y, por el orden
+# del resolver (hermano incoming-gnome/ → padre recipes/), SOMBREA la corpus SÓLO para las recetas
+# GNOME; el resto del árbol sigue con la estática. Ver [[gnome-introspection-dinamica]].
+#
+# Deps internas (libffi/pcre2/zlib) estáticas: el .so las embebe (self-contained para ésas).
+# Runtime: el rootfs de la imagen GNOME necesitará el loader musl (ld-musl-x86_64.so.1) — paso de
+# ensamblado de imagen, no del build (el sandbox ya lo tiene).
+#
+# default_library=BOTH (no shared): la isla necesita AMBOS. El `.so` (con SONAME) es lo que
+# g-ir-scanner resuelve para la introspección y lo que gjs dlopea en runtime; el `.a` es para el
+# link ESTÁTICO INTERNO de los consumidores (el propio g-i compila binarios que hacen `-static
+# -lglib-2.0` — sin el `.a` zig falla "unable to find static system library glib-2.0"). Con ambos,
+# el consumidor estático encuentra el `.a` y el scanner encuentra el `.so`.
+name    = "glib"
+version = "2.88.1"
+
+[source]
+tarball = "https://download.gnome.org/sources/glib/2.88/glib-2.88.1.tar.xz"
+sha256  = "51ab804c56f6eab3e5045c774d1290ac5e4c923d4f9a3d8e33123bee45c1840e"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+# default_library=both ⇒ libglib-2.0.{a,so.0} &co. introspection=disabled a propósito: los typelibs
+# de GLib/GObject los produce gobject-introspection escaneando este .so (externo), no glib a sí misma
+# (evita el ciclo glib↔g-i en el bootstrap).
+configure = "PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release -Ddefault_library=both -Dtests=false -Dnls=disabled -Dlibmount=disabled -Dselinux=disabled -Dman-pages=disabled -Dintrospection=disabled -Dglib_debug=disabled -Dglib_assert=false -Dglib_checks=false"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+[deps]
+build = ["meson", "samurai", "python3", "pkgconf", "libffi", "pcre2", "zlib"]
diff --git a/recipes/incoming-gnome-onda2/gobject-introspection.toml b/recipes/incoming-gnome-onda2/gobject-introspection.toml
new file mode 100644
index 00000000..1de8dfbe
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/gobject-introspection.toml
@@ -0,0 +1,46 @@
+# gobject-introspection 1.84.0 — el escáner de metadata de GNOME (g-ir-scanner + typelibs).
+# Es dep de casi toda lib GNOME (gtk4/libadwaita/etc. lo declaran cuando -Dintrospection=enabled).
+# meson static, backend feature-minimal: doctool/gtk_doc/tests off, PERO build_introspection_data=true
+# (los .gir/.typelib SON su razón de ser).
+#
+# BORRADOR PARA EL MAPA — dificultad conocida: g-ir-scanner NO es puro metadata. Para cada lib
+# COMPILA y EJECUTA un pequeño binario "dumper" enlazado contra el target para volcar los GTypes en
+# runtime. En un lab cross/hermetico static-musl esto es el palo largo del stack GNOME:
+#   1) ejecutar un binario del target dentro del sandbox (aquí target==host x86_64-linux-musl, así que
+#      NO hay emulación — a favor nuestro; el escenario cross real necesitaría qemu/exe_wrapper).
+#   2) el dumper enlaza estático contra glib+libffi; el scanner invoca al compilador (CC/zig-cc) y al
+#      linker en runtime ⇒ necesita el toolchain + el cierre .pc COMPLETO visible en PKG_CONFIG_PATH.
+#   3) suele pelear con -static / musl (símbolos de introspección, gi-dump). PROBABLEMENTE NO selle a
+#      la primera — dejar como frontera medida, no como sellado asumido.
+name    = "gobject-introspection"
+version = "1.84.0"
+
+[source]
+tarball = "https://download.gnome.org/sources/gobject-introspection/1.84/gobject-introspection-1.84.0.tar.xz"
+sha256  = "945b57da7ec262e5c266b89e091d14be800cc424277d82a02872b7d794a84779"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+# ISLA DINÁMICA: g-i es parte de la isla GNOME y linkea la glib dinámica. link=dynamic para que sus
+# binarios internos (g-ir-compiler, dumper) tomen libglib-2.0.so CONSISTENTEMENTE — no mezclar el .a
+# (estático) con la glib que ya trae libgirepository-2.0.so (dinámica): esa mezcla da DOS copias del
+# estado de GType ⇒ g-ir-compiler SIGSEGV. Ver [[gnome-introspection-dinamica]].
+link     = "dynamic"
+
+[build.phases]
+# build_introspection_data=FALSE: g-i 1.84 sólo genera aquí los typelibs EXTERNOS de X11/cairo
+# (cairo/xlib/xft/xrandr/xfixes/win32) — que NO queremos (Wayland-only) y sobre los que g-ir-compiler
+# hace SIGSEGV bajo musl. Los typelibs CORE (GLib/GObject/Gio) los produce glib (absorbió girepository).
+# g-i aquí = las TOOLS (g-ir-scanner/compiler) que usan gtk4 &co. default_library=both (isla dinámica).
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=both -Ddoctool=disabled -Dgtk_doc=false -Dtests=false -Dbuild_introspection_data=false -Dcairo=disabled -Dc_args=-Wno-error=date-time"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+[deps]
+# glib + su cierre .pc estático (pkgconf resuelve Requires.private: pcre2, zlib, libffi).
+# flex/bison: el parser de anotaciones del scanner. libffi: además lo enlaza el dumper.
+# py3-setuptools: meson.build:29 exige `python3 (setuptools)` importable (instala giscanner como
+# paquete python) — el python3 del rootfs NO trae setuptools; se lo damos como módulo sellado.
+build = ["meson", "samurai", "python3", "py3-setuptools", "pkgconf", "flex", "bison", "glib", "libffi", "pcre2", "zlib"]
+# FRONTERA: cairo omitida a propósito (-Dcairo=disabled) — feature-minimal, evita el typelib Cairo-1.0.
diff --git a/recipes/incoming-gnome-onda2/graphene.toml b/recipes/incoming-gnome-onda2/graphene.toml
new file mode 100644
index 00000000..1348035f
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/graphene.toml
@@ -0,0 +1,30 @@
+# graphene 1.10.8 — VARIANTE ISLA DINÁMICA (SHADOW de recipes/graphene.toml estática).
+# Tipos/álgebra de vectores y matrices (GTK4/GSK). La isla GNOME la necesita como .so real CON
+# typelib: gtk4 declara Graphene-1.0 en su introspección (Gsk expone tipos graphene) ⇒ el scan de
+# gtk4 tiene que resolver Graphene-1.0.typelib + libgraphene-1.0.so. Ver [[gnome-introspection-dinamica]].
+#
+# vs corpus: link=dynamic (no static), default_library=both (.a p/ consumidores estáticos internos +
+# .so p/ el scanner/gjs), introspection=ENABLED (produce el typelib). SIN --prefer-static (queremos el
+# .so). Sombrea la corpus SÓLO para la cola GNOME (resolver hermano→padre); el resto del árbol sigue
+# con la estática.
+name    = "graphene"
+version = "1.10.8"
+
+[source]
+tarball = "https://download.gnome.org/sources/graphene/1.10/graphene-1.10.8.tar.xz"
+sha256  = "a37bb0e78a419dcbeaa9c7027bcff52f5ec2367c25ec859da31dfde2928f279a"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=both -Dtests=false -Dinstalled_tests=false -Dgtk_doc=false -Dintrospection=enabled"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+# glib(isla dinámica) + glib-introspected (GObject-2.0.gir que referencia el typelib) +
+# gobject-introspection (g-ir-scanner/compiler). Graphene-1.0 referencia GObject ⇒ necesita el .gir CORE.
+[deps]
+build = ["meson", "samurai", "python3", "pkgconf", "glib", "glib-introspected", "gobject-introspection", "libffi", "pcre2", "zlib"]
diff --git a/recipes/incoming-gnome-onda2/gtk4.toml b/recipes/incoming-gnome-onda2/gtk4.toml
new file mode 100644
index 00000000..6ca9294a
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/gtk4.toml
@@ -0,0 +1,36 @@
+# gtk4 4.18.6 — VARIANTE ISLA DINÁMICA (SHADOW de recipes/gtk4.toml estática).
+# El toolkit. gnome-shell/mutter lo usan y su JS (gjs) dlopea Gtk-4.0/Gdk-4.0/Gsk-4.0.typelib en runtime
+# ⇒ gtk4 DEBE producir esos typelibs + libgtk-4.so real. Es la receta más dura de onda 2: introspection
+# arrastra el cierre transitivo entero (wayland/libdrm/mesa/libepoxy). Ver [[gnome-introspection-dinamica]].
+#
+# vs corpus (mundo estático), REVERTIDO:
+#  · SIN el sed `libgtk_dep→libgtk_static_dep`: en la isla las tools linkean libgtk-4.so (natural).
+#  · SIN el fat-archive de install: era un hack para que `-static -lgtk-4` linkeara; los consumidores de
+#    la isla (mutter/gnome-shell) toman la .so. meson instala libgtk-4.so directo.
+#  · link=dynamic, default_library=both, introspection=ENABLED, SIN --prefer-static.
+#  · deps pango/gdk-pixbuf/graphene resuelven a las ISLAS (shadow) ⇒ sus typelibs+.so visibles al scan.
+#
+# ⚠ ITERATIVA: el scanner construye un dumper que linkea libgtk-4.so + todo su cierre. Las libs C del
+# corpus (cairo/harfbuzz/wayland/libdrm/mesa/libepoxy) siguen ESTÁTICAS embebidas — si el scan falla por
+# símbolo/estado duplicado, escalar la lib culpable a su propia isla. Esperar walls en el worker.
+name    = "gtk4"
+version = "4.18.6"
+
+[source]
+tarball = "https://download.gnome.org/sources/gtk/4.18/gtk-4.18.6.tar.xz"
+sha256  = "e1817c650ddc3261f9a8345b3b22a26a5d80af154630dedc03cc7becefffd0fa"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=both -Dwayland-backend=true -Dx11-backend=false -Dbroadway-backend=false -Dwin32-backend=false -Dmacos-backend=false -Dvulkan=disabled -Dintrospection=enabled -Dbuild-demos=false -Dbuild-testsuite=false -Dbuild-tests=false -Dbuild-examples=false -Dmedia-gstreamer=disabled -Dprint-cups=disabled -Dprint-cpdb=disabled -Dcloudproviders=disabled -Dsysprof=disabled -Dtracker=disabled -Dcolord=disabled -Df16c=disabled -Ddocumentation=false -Dman-pages=false -Dc_args=-Wno-error=date-time"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+# glib-introspected + gobject-introspection = la maquinaria de typelibs. pango/gdk-pixbuf/graphene =
+# ISLAS (shadow) con sus typelibs. El resto = cierre C estático del corpus (wayland/mesa/libdrm/etc.).
+[deps]
+build = ["meson", "samurai", "python3", "pkgconf", "glib", "glib-introspected", "gobject-introspection", "cairo", "pango", "gdk-pixbuf", "graphene", "libepoxy", "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "fontconfig", "harfbuzz", "fribidi", "libpng", "pixman", "freetype", "expat", "libffi", "pcre2", "zlib", "libjpeg-turbo", "libtiff", "mesa"]
diff --git a/recipes/incoming-gnome-onda2/nasm.toml b/recipes/incoming-gnome-onda2/nasm.toml
new file mode 100644
index 00000000..f047e0aa
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/nasm.toml
@@ -0,0 +1,22 @@
+# nasm — ensamblador x86. Herramienta de BUILD de mozjs (algunas rutas de código generan .asm) y de
+# varias libs de media más adelante. No está en el rootfs Alpine ni tenía receta. C plano, autotools.
+name    = "nasm"
+version = "2.16.03"
+
+[source]
+tarball          = "https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/nasm-2.16.03.tar.xz"
+sha256           = "1412a1c760bbd05db026b6c0d1657affd6631cd0a63cddb6f73cc6d4aa616148"
+strip_components = 1
+
+[build]
+compiler = "gcc"
+target   = "x86_64-linux-musl"
+link     = "static"     # binario de herramienta: estático, sin runtime que arrastrar
+
+[build.phases]
+configure = "./configure --build=$CBUILD --host=$CHOST --prefix=/usr"
+compile   = "make -j\"$(nproc)\""
+install   = "make DESTDIR=/out install"
+
+[deps]
+build = ["make"]
diff --git a/recipes/incoming-gnome-onda2/nspr.toml b/recipes/incoming-gnome-onda2/nspr.toml
new file mode 100644
index 00000000..703b7669
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/nspr.toml
@@ -0,0 +1,24 @@
+# nspr — Netscape Portable Runtime. Dep dura de mozjs/spidermonkey (hilos, IO, atómicos portables).
+# Build autotools clásico. El tarball extrae a nspr-4.36/nspr/configure ⇒ con strip_components=1 queda
+# `nspr/`, así que las fases entran a ese subdir. Alternativa si molesta: mozjs puede construir su nspr
+# in-tree (--enable-nspr-build); acá lo hacemos aparte porque NSS y otros también lo van a querer.
+name    = "nspr"
+version = "4.36"
+
+[source]
+tarball          = "https://ftp.mozilla.org/pub/nspr/releases/v4.36/src/nspr-4.36.tar.gz"
+sha256           = "55dec317f1401cd2e5dba844d340b930ab7547f818179a4002bce62e6f1c6895"
+strip_components = 1
+
+[build]
+compiler = "gcc"        # C plano con gcc-ismos en el configure; sigue el patrón de linux-pam
+target   = "x86_64-linux-musl"
+link     = "dynamic"    # mozjs detecta libnspr4.so vía nspr-config/pkg-config
+
+[build.phases]
+configure = "cd nspr && ./configure --build=$CBUILD --host=$CHOST --prefix=/usr --libdir=/usr/lib --enable-optimize --disable-debug --enable-64bit"
+compile   = "cd nspr && make -j\"$(nproc)\""
+install   = "cd nspr && make DESTDIR=/out install"
+
+[deps]
+build = ["make"]
diff --git a/recipes/incoming-gnome-onda2/pango.toml b/recipes/incoming-gnome-onda2/pango.toml
new file mode 100644
index 00000000..75ea5889
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/pango.toml
@@ -0,0 +1,32 @@
+# pango 1.57.1 — VARIANTE ISLA DINÁMICA (SHADOW de recipes/pango.toml estática).
+# Layout/render de texto i18n (base de GTK4). gtk4 declara Pango-1.0 en su introspección ⇒ el scan de
+# gtk4 debe resolver Pango-1.0.typelib + libpango-1.0.so. Ver [[gnome-introspection-dinamica]].
+#
+# vs corpus: link=dynamic, default_library=both, introspection=ENABLED, SIN --prefer-static.
+#
+# ALCANCE (deuda declarada): sus sub-deps (cairo/harfbuzz/fribidi/freetype/fontconfig/pixman/libpng/
+# expat) siguen siendo corpus ESTÁTICAS — se embeben en libpango-1.0.so vía default_library=both. Riesgo
+# a medir en el worker: si dos .so de la isla embeben la MISMA lib estática (p.ej. cairo en libpango Y en
+# libgtk-4), hay doble estado en runtime (misma clase de bug que el SIGSEGV de glib). Si aparece, se
+# escala cairo/etc. a su propia isla dinámica. NO persigo el cierre dinámico transitivo completo a ciegas.
+name    = "pango"
+version = "1.57.1"
+
+[source]
+tarball = "https://download.gnome.org/sources/pango/1.57/pango-1.57.1.tar.xz"
+sha256  = "e65d6d117080dc3aeeb7d8b4b3b518f7383aa2e6cfce23117c623cd624764c2f"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=both -Dc_args=-Wno-error=date-time -Dintrospection=enabled -Dgtk_doc=false -Dbuild-testsuite=false -Dbuild-examples=false"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
+
+# glib(isla) + glib-introspected (GObject-2.0.gir) + gobject-introspection (tools). El resto = cierre .pc
+# estático del corpus (cairo/harfbuzz/fribidi/freetype/fontconfig/pixman/libpng/expat).
+[deps]
+build = ["meson", "samurai", "python3", "pkgconf", "glib", "glib-introspected", "gobject-introspection", "cairo", "harfbuzz", "fribidi", "freetype", "fontconfig", "pixman", "libpng", "expat", "libffi", "pcre2", "zlib"]
diff --git a/recipes/incoming-gnome-onda2/py3-setuptools.toml b/recipes/incoming-gnome-onda2/py3-setuptools.toml
new file mode 100644
index 00000000..f556f544
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/py3-setuptools.toml
@@ -0,0 +1,36 @@
+# py3-setuptools 75.8.2 — setuptools como MÓDULO importable de python3, para las recetas cuyo
+# meson.build exige `python3 (setuptools)` (gobject-introspection:29, y todo el stack GUI-python
+# que instala giscanner/entry-points). Python PURO: no se compila, se COPIA a site-packages.
+#
+# Mismo patrón que meson.toml: hammer evita el camino wheel/pip/gpep517 de Alpine (recetas que no
+# tiene); la fuente ES el árbol Python sellado y se instala copiando los paquetes tal cual. Hermético
+# (sin pip ni red). El `.pth` de precedencia de distutils replica lo que hace `pip install setuptools`
+# para que `_distutils_hack` se active y setuptools gane sobre el distutils del stdlib.
+name    = "py3-setuptools"
+version = "75.8.2"
+
+[source]
+tarball = "https://files.pythonhosted.org/packages/source/s/setuptools/setuptools-75.8.2.tar.gz"
+sha256  = "4880473a969e5f23f2a2be3646b2dfd84af9028716d398e46192f84bc36900d2"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "static"
+
+[build.phases]
+# Python puro: nada que compilar.
+compile = "true"
+install = '''
+set -e
+SP=/out/usr/lib/python3.12/site-packages
+mkdir -p "$SP"
+cp -r setuptools pkg_resources _distutils_hack "$SP/"
+# Replica el distutils-precedence.pth de pip: activa el shim que da precedencia a setuptools.
+printf '%s\n' "import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim();" \
+  > "$SP/distutils-precedence.pth"
+'''
+
+# python3 es dep de RUNTIME (lo importa quien use setuptools como build-dep).
+[deps]
+runtime = ["python3"]
diff --git a/recipes/incoming-gnome-onda2/spidermonkey.toml b/recipes/incoming-gnome-onda2/spidermonkey.toml
new file mode 100644
index 00000000..784dedd8
--- /dev/null
+++ b/recipes/incoming-gnome-onda2/spidermonkey.toml
@@ -0,0 +1,47 @@
+# 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"
+
+[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"]