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 1411Shell 141Markdown 84Rust 832898 Definiciones

gnome onda 3: 🏔 GNOME-SHELL SELLADO (b3:b6aec8a2) — LA CIMA

/usr/bin/gnome-shell construido desde fuente, con sus cuatro typelibs (St-16,
Shell-16, Gvc-1.0, Shew-0) y el NEEDED cerrando en artefactos sellados + libc.so:
cero fuga al sysroot de Alpine.

El draft estimaba "~10 recetas nuevas, dominadas por eds+icu". Fueron 13, pero
casi ninguna donde el mapa las esperaba. Lo que la última tanda destapó:

  dbus-shared    la cima enlaza atk-bridge-2.0, cuyo .pc Requires atspi-2 y ése
                 dbus-1 — el dbus canónico es estático no-PIC y el configure ni
                 llegaba a compilar. Cuarta variante -shared de la cadena, todas
                 por la misma raíz: el corpus se construyó para un userland
                 ESTÁTICO y el escritorio es dinámico por obligación.

  pulseaudio     la frontera llegó por el camino más indirecto de la campaña:
  + libsndfile   gnome-shell incluye el subproyecto gvc (el control de volumen)
                 SIN condicional (meson.build:256) y gvc pide libpulse duro.
                 Se construye SÓLO EL CLIENTE (-Ddaemon=false): gvc necesita
                 HABLAR el protocolo, no implementarlo, y el demonio de sonido de
                 esta distro es una decisión aparte todavía abierta (PulseAudio vs
                 PipeWire) que construir el daemon habría cerrado de prestado.
                 libsndfile con --disable-external-libs = una receta, no cinco.

Dos parches al árbol, ambos verificados antes de aplicarse:
  · subdir('po') fuera (:324). CUARTA vez que el msgfmt de gettext-tiny aborta
    con SIGABRT, acá en po/ar.po; ya pasó en iso-codes, gcr y eds. La deuda está
    clara: hace falta el gettext de GNU de verdad.
  · los #include <X11/Xlib.h> y <X11/Xatom.h> de src/shell-app-usage.c son
    VESTIGIALES — el fichero no usa un solo símbolo de X11. El código X11 real
    (el tray XEmbed) SÍ está cerrado por have_x11_client, que sale de mutter y
    acá es false. shell-app-usage.c quedó fuera del guard por olvido del upstream.

Y --undefined-version en pulseaudio: usa UN version-script para las tres libs
cliente, así que al enlazar libpulse.so el script nombra símbolos de
libpulse-simple y libpulse-mainloop-glib. GNU ld avisa; lld corta. Mismo flag que
libtiff-shared.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

794d9b595e548965bc16c905b28877c1e3072b53 · por sergio · (hace 2 meses) · padre 94f311177 · ver el árbol en este commit

Delta semántico

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

4 archivos · +197 −42

diff --git a/recipes/incoming-gnome/dbus-shared.toml b/recipes/incoming-gnome/dbus-shared.toml
new file mode 100644
index 00000000..f139ed2b
--- /dev/null
+++ b/recipes/incoming-gnome/dbus-shared.toml
@@ -0,0 +1,40 @@
+# dbus-shared 1.16.2 — variante DINÁMICA (libdbus-1.so.3) para la isla dinámica de GNOME.
+#
+# El dbus canónico (recipes/dbus.toml) es `--prefer-static -Ddefault_library=static` y su
+# libdbus-1.a no es PIC. gnome-shell la alcanza por transitividad: enlaza atk-bridge-2.0, cuyo .pc
+# declara `Requires: atspi-2` y ése `Requires: dbus-1`, así que pkg-config la arrastra al enlace de
+# un binario dinámico. Sin la .so el configure ni siquiera llega a compilar — corta con
+# `Package 'dbus-1', required by 'atspi-2', not found` cuando el único dbus visible es estático.
+#
+# Es la cuarta variante -shared de esta cadena (zlib, sqlite, libxml2, libuuid + ésta) y todas por
+# la misma raíz: el corpus se construyó para un userland ESTÁTICO y el escritorio es dinámico por
+# obligación, no por gusto — la introspección de GObject exige .so reales.
+#
+# Se mantienen los apagados del canónico (systemd/x11-autolaunch/docs) y su misma versión: un solo
+# dbus en la distro, no dos protocolos conviviendo. -Dtools=true igual que el canónico para que el
+# artefacto siga trayendo dbus-daemon/dbus-run-session y pueda levantar un bus de verdad.
+name    = "dbus-shared"
+version = "1.16.2"
+
+[source]
+tarball = "https://dbus.freedesktop.org/releases/dbus/dbus-1.16.2.tar.xz"
+sha256  = "0ba2a1a4b16afe7bceb2c07e9ce99a8c2c3508e5dec290dbb643384bd6beb7e2"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+flags    = []
+
+[build.phases]
+configure = "PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release -Ddefault_library=shared -Dsystemd=disabled -Dx11_autolaunch=disabled -Ddoxygen_docs=disabled -Dxml_docs=disabled -Dtools=true -Dsystem_pid_file=/run/dbus/dbus.pid"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+install   = '''
+set -e
+PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install --no-rebuild -C output
+# can't install tmpfs
+rm -rf /out/run
+'''
+
+[deps]
+build = ["meson", "samurai", "python3", "pkgconf", "expat"]
diff --git a/recipes/incoming-gnome/gnome-shell.toml b/recipes/incoming-gnome/gnome-shell.toml
index a6b7f048..d8f348d6 100644
--- a/recipes/incoming-gnome/gnome-shell.toml
+++ b/recipes/incoming-gnome/gnome-shell.toml
@@ -1,9 +1,58 @@
-# gnome-shell 48.8 — la cima del frente GNOME: la UI del escritorio (top bar, overview, lock screen).
-# Cuelga de mutter (compositor) + gjs (su lógica está en JavaScript sobre spidermonkey). meson static.
-# sha256 REAL de curl|sha256sum.
+# gnome-shell 48.8 — LA CIMA del frente GNOME: la UI del escritorio (barra superior, overview,
+# pantalla de bloqueo). Su lógica está en JavaScript sobre gjs/spidermonkey y su compositor es
+# mutter; por eso es lo último que cae y por eso toda la onda 3 tuvo que ser una ISLA DINÁMICA —
+# el shell lee sus dependencias por typelib, y un typelib exige una .so real que gjs pueda dlopen().
+# Ver [[gnome-introspection-dinamica]].
 #
-# ⚠ DRAFT PARA EL MAPA: NO sella a la primera — es la cima, su cadena es la más profunda. Valor hoy =
-# la FRONTERA declarada. Feature-minimal: tests/man/docs off; sin networkmanager (opcional).
+# ── LA FRONTERA, YA CERRADA ─────────────────────────────────────────────────────────────────────
+# El draft de esta receta estimaba "~10 recetas nuevas, dominadas por eds+icu; es una campaña, no
+# una tanda". Fue una campaña, y el presupuesto se movió en las dos direcciones:
+#   · icu4c NO había que autorarla: ya estaba sellada por KDE y sólo depende de pkgconf+python3,
+#     o sea del corpus padre, así que copiarla a esta cola dio hash idéntico y cero rebuild.
+#   · libxml2 para libsoup NO hacía falta (libsoup 3.x la dejó de usar), ni para libical (sólo la
+#     enlaza un binario de build). Sí para eds, y ahí sí en .so ⇒ libxml2-shared.
+#   · NSS, en cambio, NO se pudo esquivar: el -DENABLE_SMIME=OFF de eds está roto en 3.56.2 porque
+#     camel.c incluye nss/nspr sin guardar. Se pagó, y selló a la primera (ver nss.toml).
+# Las deps de :71-89 verificadas contra el meson.build real están TODAS selladas hoy:
+#   atk-bridge-2.0 → at-spi2-core · libecal-2.0 + libedataserver-1.2 → evolution-data-server
+#   gcr-4 → gcr · polkit-agent-1 → polkit · libxml-2.0 → libxml2-shared · json-glib
+#   clutter/cogl/mtk/libmutter → mutter · gjs · gtk4 · gnome-desktop-4 · gsettings-desktop-schemas
+#
+# ── APAGADOS, y la receta que cada uno ahorra ───────────────────────────────────────────────────
+# Ojo que acá TODOS los defaults vienen en true (meson.options), así que no apagar es optar por la
+# frontera más cara:
+#   -Dnetworkmanager=false → libnm (NetworkManager entero). Es el applet de red del panel; el
+#                        escritorio arranca sin él. libsecret, la otra dep de esa rama, YA está
+#                        sellada (entró por eds), así que lo único que falta acá es NetworkManager.
+#   -Dportal_helper=false → el propio meson ERROREA si se deja en true sin networkmanager (:113).
+#   -Dcamera_monitor=false → libpipewire-0.3. Es el indicador de "cámara en uso"; PipeWire es una
+#                        campaña propia y no la pide nada más de esta onda.
+#   -Dsystemd=false     → libsystemd. Cuarta vez que la C-ABI de logind aparece en este frente y
+#                        cuarta que se esquiva; mutter sigue siendo la única sin salida (por eso
+#                        existe libelogind sobre arje-sdlogin-compat).
+#   -Dman=false         → rst2man (docutils). Mismo motivo que en mutter, donde hubo que sacar
+#                        subdir('doc/man') a mano.
+#   -Dtests=false -Dgtk_doc=false
+#   -Dextensions_app=false -Dextensions_tool=false → la app GTK4 de extensiones y su CLI. NO son el
+#                        shell: son herramientas aparte que se instalan al lado. Se dejan fuera de
+#                        la primera pasada para que la cima caiga con la superficie mínima; ambas
+#                        tienen todas sus deps ya selladas, así que encenderlas después es barato.
+#
+# El segundo sed borra `#include <X11/Xlib.h>` y `<X11/Xatom.h>` de src/shell-app-usage.c. NO es
+# una mutilación: son includes VESTIGIALES de la era X11 — el fichero no usa un solo símbolo de X11
+# (`grep X11\|XA_\|Display \*\|Atom ` devuelve exactamente esas dos líneas y nada más). El código X11
+# de verdad vive en src/tray/ (el tray XEmbed), y ÉSE sí está cerrado por `have_x11_client`, que sale
+# de mutter y acá es false porque nuestro mutter es Wayland puro. O sea que shell-app-usage.c es el
+# único que quedó fuera del guard, por olvido del upstream.
+#
+# El primer sed saca `subdir('po')` (:324). CUARTA vez en esta campaña que el msgfmt de gettext-tiny —lo
+# único que hay en el corpus— aborta con SIGABRT, acá en po/ar.po; ya pasó en iso-codes, gcr y eds.
+# La deuda está clara y anotada: hace falta autorar el gettext de GNU de verdad. Se pierden los
+# textos traducidos del shell, no el shell.
+#
+# ISLA DINÁMICA: link=dynamic y las variantes -shared de la cadena C (cairo/freetype/libpng/
+# libjpeg-turbo/libtiff/zlib/fontconfig), igual que gtk4 y mutter. Con las estáticas el linker corta
+# con `relocation R_X86_64_32 ... recompile with -fPIC` — es el muro que ya frenó a mutter.
 name    = "gnome-shell"
 version = "48.8"
 
@@ -14,46 +63,12 @@ sha256  = "cb9b7d86cf362530e648e68caaf109a32af4e832874a26791ca8789773efd233"
 [build]
 compiler = "zig-cc"
 target   = "x86_64-linux-musl"
-link     = "static"
+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 --prefer-static -Ddefault_library=static -Dtests=false -Dman=false -Ddocumentation=false -Dnetworkmanager=disabled -Dc_args=-Wno-error=date-time"
+configure = "sed -i \"/^subdir('po')$/d\" meson.build && sed -i '/^#include <X11\\/X\\(lib\\|atom\\).h>$/d' src/shell-app-usage.c && 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=shared -Dnetworkmanager=false -Dportal_helper=false -Dcamera_monitor=false -Dsystemd=false -Dman=false -Dtests=false -Dgtk_doc=false -Dextensions_app=false -Dextensions_tool=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"
 
-# Resolubles: stack gtk4/libadwaita + gjs (ya en incoming-gnome/) y su cierre .pc.
-# FRONTERA (deps REQUERIDAS sin receta alcanzable — la cadena de la cima):
-#   mutter               → YA en incoming-gnome/ (draft); es la dep dura (libmutter).
-#   gjs                  → YA en incoming-gnome/ (motor JS del shell).
-#   gobject-introspection→ YA en incoming-gnome/ (typelibs).
-#   gsettings-desktop-schemas, gnome-desktop → YA en incoming-gnome/.
-#
-# ⚠ LISTA CORREGIDA CONTRA EL meson.build REAL (2026-07-28). La de abajo se escribió de memoria y
-# tenía dos errores: sobraban `ibus` y `startup-notification` (no aparecen en el meson.build de
-# 48.8), y FALTABA la más cara de todas. Las verdaderas, TODAS incondicionales y de nivel superior
-# (gnome-shell-48.8/meson.build:71-89):
-#   atk-bridge-2.0       :71  → at-spi2-core  — SIN RECETA. Ojo: la at-spi2-core moderna trae
-#                              ADENTRO el atk que autoramos suelto ⇒ chocan por atk-1.0.pc (ver atk.toml).
-#   libecal-2.0          :72  ┐ **evolution-data-server** — SIN RECETA, y es la pieza cara: arrastra
-#   libedataserver-1.2   :73  ┘ libical, libsoup, nss e icu, ninguna en el corpus. Es el calendario
-#                              del panel superior. NO hay opción para apagarlo, y NO es cosa de la
-#                              versión: verificado que 50.3 (la serie más nueva) lo sigue pidiendo
-#                              igual, así que subir de versión no lo esquiva.
-#   gcr-4                :74  → gcr — SIN RECETA (keyring/prompt; arrastra p11-kit y libgcrypt).
-#   libxml-2.0           :81  → YA en el corpus, sellada.
-#   polkit-agent-1       :86  → polkit — SIN RECETA (elevación de privilegios).
-#   json-glib                 → CERRADA esta sesión (b3:1b90c876).
-# Condicionales (las evitamos): x11/xext/xfixes sólo si mutter trae X11 (no lo trae); libnm+libsecret
-# sólo con networkmanager; libpipewire sólo con screencast; libsystemd sólo con la opción systemd.
-#
-# COSTO REAL DE LA CIMA: ~10 recetas nuevas, dominadas por eds+icu. Es una campaña, no una tanda.
-#
-# (lista original, conservada para ver en qué se equivocó el mapa de memoria:)
-#   gcr, libsecret       — REQUERIDA (keyring/prompt).
-#   polkit               — REQUERIDA (elevación de privilegios).
-#   ibus                 — REQUERIDA (input methods).
-#   startup-notification — REQUERIDA.
-#   at-spi2-core, atk    — REQUERIDA (accesibilidad).
-#   json-glib            — REQUERIDA.
 [deps]
-build = ["meson", "samurai", "python3", "pkgconf", "mutter", "gjs", "gobject-introspection", "gsettings-desktop-schemas", "gnome-desktop", "gtk4", "libadwaita", "glib", "pango", "cairo", "graphene", "libepoxy", "wayland", "wayland-protocols", "libdrm", "harfbuzz", "fribidi", "libpng", "pixman", "freetype", "expat", "libffi", "pcre2", "zlib", "gdk-pixbuf", "libjpeg-turbo", "libtiff", "mesa", "fontconfig"]
+build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "py3-setuptools", "gi-foreign-girs", "gobject-introspection", "glib", "glib-introspected", "gjs", "mutter", "gtk4", "gnome-desktop", "gsettings-desktop-schemas", "at-spi2-core", "dbus-shared", "gcr", "polkit", "evolution-data-server", "json-glib", "libxml2-shared", "libsecret", "pulseaudio", "libsndfile", "spidermonkey", "graphene", "pango", "gdk-pixbuf", "mesa", "libdrm", "libepoxy", "pixman", "harfbuzz", "fribidi", "wayland", "wayland-protocols", "libinput", "libxkbcommon", "cairo-shared", "libpng-shared", "freetype-shared", "libjpeg-turbo-shared", "libtiff-shared", "fontconfig-shared", "zlib-shared", "expat", "libffi", "pcre2", "sqlite-shared", "libsoup", "libical", "icu4c", "nspr", "nss", "libgcrypt-shared", "libgpg-error-shared", "libuuid-shared", "nghttp2", "libpsl", "p11-kit", "lcms2", "libdisplay-info", "hwdata", "colord", "libgudev", "libudev-zero", "libgusb", "libusb", "libei", "libevdev", "xkeyboard-config", "iso-codes", "libseccomp", "libelogind", "udev-pc", "libxcvt"]
diff --git a/recipes/incoming-gnome/libsndfile.toml b/recipes/incoming-gnome/libsndfile.toml
new file mode 100644
index 00000000..453e06af
--- /dev/null
+++ b/recipes/incoming-gnome/libsndfile.toml
@@ -0,0 +1,46 @@
+# libsndfile 1.2.2 — lectura/escritura de ficheros de audio (WAV, AIFF, AU…). Entra al frente GNOME
+# por debajo de pulseaudio: `sndfile` es dep INCONDICIONAL de su meson.build:615 (top-level, sin
+# `required:` que la ablande), así que ni siquiera `-Ddaemon=false` la esquiva. Cadena de la cima:
+# gnome-shell → subprojects/gvc → libpulse → libsndfile.
+#
+# --disable-external-libs es lo que hace que esta receta sea UNA y no CINCO: por defecto libsndfile
+# enlaza FLAC, Ogg y Vorbis, ninguna en el corpus. Apagándolos queda una librería C autocontenida
+# que no depende de nada fuera de libc. Lo que se pierde es leer .flac/.ogg; lo que consume el
+# escritorio de acá son los sonidos de sistema en WAV, que es el formato nativo de libsndfile.
+# --disable-mpeg apaga LAME/mpg123 por lo mismo.
+#
+# --disable-alsa: ALSA sólo la usa el programa de ejemplo sndfile-play, no la librería.
+# --disable-sqlite: sólo la usa la utilidad sndfile-regtest.
+# --disable-full-suite: no instala los ~10 binarios de utilería (sndfile-info, sndfile-convert…);
+# lo que gvc necesita es libsndfile.so y su .pc.
+#
+# ISLA DINÁMICA: shared, porque libpulse y todo lo que cuelga de gnome-shell son .so.
+name    = "libsndfile"
+version = "1.2.2"
+
+[source]
+tarball = "https://github.com/libsndfile/libsndfile/releases/download/1.2.2/libsndfile-1.2.2.tar.xz"
+sha256  = "3799ca9924d3125038880367bf1468e53a1b7e3686a934f098b7e1d286cdb80e"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "dynamic"
+
+[build.phases]
+configure = '''
+./configure \
+	--build=$CBUILD --host=$CHOST \
+	--prefix=/usr \
+	--enable-shared --disable-static \
+	--disable-external-libs \
+	--disable-mpeg \
+	--disable-alsa \
+	--disable-sqlite \
+	--disable-full-suite
+'''
+compile = 'make -j"$(nproc)"'
+install = 'make DESTDIR=/out install'
+
+[deps]
+build = ["make", "pkgconf"]
diff --git a/recipes/incoming-gnome/pulseaudio.toml b/recipes/incoming-gnome/pulseaudio.toml
new file mode 100644
index 00000000..edd7c3ba
--- /dev/null
+++ b/recipes/incoming-gnome/pulseaudio.toml
@@ -0,0 +1,54 @@
+# pulseaudio 17.0 — pero SÓLO las librerías cliente (libpulse, libpulse-simple,
+# libpulse-mainloop-glib). No el demonio de sonido.
+#
+# POR QUÉ ENTRA: gnome-shell incluye el subproyecto `gvc` (el control de volumen del panel) de forma
+# INCONDICIONAL — meson.build:256 lo llama sin `if`, y no hay opción para apagarlo — y gvc pide
+# `libpulse` y `libpulse-mainloop-glib` duros (subprojects/gvc/meson.build:58). Es la última
+# frontera de la cima y llega por el camino más indirecto de toda la campaña:
+# gnome-shell → gvc → libpulse → libsndfile.
+#
+# ── SÓLO CLIENTE, Y POR QUÉ ESO ES LA DECISIÓN CORRECTA ─────────────────────────────────────────
+# -Ddaemon=false -Dclient=true. Lo que gvc necesita es hablar el protocolo de PulseAudio, no
+# IMPLEMENTARLO: el demonio de sonido de esta distro es una decisión aparte y todavía abierta
+# (PulseAudio vs PipeWire), y construir el demonio acá la cerraría de prestado — además de arrastrar
+# alsa-lib, orc, speex, soxr y webrtc-audio-processing. Con sólo el cliente, el shell muestra y
+# mueve el volumen contra CUALQUIER servidor que hable el protocolo, incluido pipewire-pulse.
+#
+# -Dglib=enabled NO es opcional: `libpulse-mainloop-glib` es justamente la integración con el bucle
+# de eventos de GLib, y es la segunda de las dos .pc que pide gvc.
+#
+# sndfile sigue haciendo falta pese a -Ddaemon=false: `dependency('sndfile')` está en el top-level
+# del meson.build (:615) sin `required:` que la ablande. De ahí la receta libsndfile de esta cola,
+# que con --disable-external-libs queda autocontenida (una receta, no cinco).
+#
+# -Ddatabase=simple: el default es 'tdb' y arrastraría tdb entero. 'simple' es el backend interno.
+# Ni siquiera lo usa el cliente, pero el meson lo evalúa igual.
+#
+# --undefined-version: PulseAudio usa UN SOLO version-script (map-file) con la etiqueta PULSE_0 para
+# las tres librerías cliente, así que al enlazar libpulse.so el script nombra símbolos que viven en
+# libpulse-simple (pa_simple_new…) y en libpulse-mainloop-glib (pa_glib_mainloop_new…). GNU ld lo
+# tolera con un warning; lld lo trata como ERROR. Mismo flag y mismo motivo que en libtiff-shared.
+#
+# El resto de los `disabled` son backends del demonio y su ecosistema (alsa, bluez5, jack, avahi,
+# lirc, x11, orc, soxr, speex, fftw, openssl, systemd, udev, gtk, gsettings, webrtc-aec, tcpwrap,
+# asyncns) — cada uno una receta que no hay que autorar. -Delogind=disabled sigue la misma línea que
+# el resto de la onda: la C-ABI de logind se esquiva salvo en mutter.
+name    = "pulseaudio"
+version = "17.0"
+
+[source]
+tarball = "https://freedesktop.org/software/pulseaudio/releases/pulseaudio-17.0.tar.xz"
+sha256  = "053794d6671a3e397d849e478a80b82a63cb9d8ca296bd35b73317bb5ceb87b5"
+
+[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=shared -Ddaemon=false -Dclient=true -Dglib=enabled -Ddatabase=simple -Ddoxygen=false -Dman=false -Dtests=false -Dgcov=false -Dalsa=disabled -Dasyncns=disabled -Davahi=disabled -Dbluez5=disabled -Ddbus=disabled -Delogind=disabled -Dfftw=disabled -Dgsettings=disabled -Dgtk=disabled -Djack=disabled -Dlirc=disabled -Dopenssl=disabled -Dorc=disabled -Dsamplerate=disabled -Dsoxr=disabled -Dspeex=disabled -Dsystemd=disabled -Dtcpwrap=disabled -Dudev=disabled -Dwebrtc-aec=disabled -Dx11=disabled -Dc_args=-Wno-error=date-time -Dc_link_args=-Wl,--undefined-version"
+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", "gettext-tiny", "glib", "libsndfile", "libffi", "pcre2", "zlib-shared"]