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 1181Shell 82Rust 62Markdown 521515 Definiciones

mpv 0.41.0: la primera app gráfica de usuario final del corpus

Cuatro escritorios que cierran y ninguna forma de abrir un video. El ADR 0015 ordenó los montones
y puso a mpv primero del A —lo que no tiene muro estructural, sólo falta escribirlo—. Éste es.

Sellada b3:8e6ab4e7. Evidencia de que ANDA, no sólo de que sella:
  · `mpv --version` corre con el loader musl → v0.41.0, libplacebo v7.360.1, FFmpeg 7.1
  · decodifica un h264 640x480 + AAC de prueba, 75 frames, `Exiting... (End of file)`
  · `--vo=help` → `gpu-next` (libplacebo) y `gpu`; `--ao=help` → `alsa`
  · `--gpu-context=help` → SÓLO `wayland` (Wayland/EGL). Ni un contexto X11 en el binario.
  · NEEDED: libav*, libplacebo, libasound, libEGL, libc. Cero glibc, cero X11.

En el corpus y no en una cola: un reproductor lo quieren las cuatro imágenes, y una receta resuelve
sibling-first + catálogo padre, nunca una cola hermana.

`-Dbuild-date=false` no es cosmético: su default estampa la fecha de compilación DENTRO del binario
⇒ dos builds del mismo commit darían bytes distintos y el artefacto dejaría de reproducir.

`-Dprefer_static=true` (como foot) porque sin él meson resuelve los `.pc` sin `Libs.private` y el
link muere con símbolos `XML_*` sin definir «en libfontconfig.a» — culpando a fontconfig cuando lo
que falta es propagar expat.

Las ~90 opciones van EXPLÍCITAS: casi todas nacen `auto`, o sea que miran el sandbox y se prenden
con lo que encuentren. Misma trampa que ffmpeg cierra con `--disable-autodetect`.

TRES HUECOS CONOCIDOS, escritos en la receta para que no se descubran en la mano del usuario:
  1. audio ALSA, y las tres pipewire llevan `-Dpipewire-alsa=disabled` ⇒ hoy no suena en un
     escritorio con PipeWire vivo. Radio de darlo vuelta: 4/3/2. Es el próximo paso.
  2. sin Lua ⇒ sin OSC. mpv 0.41 sólo acepta 5.1/5.2/LuaJIT y la del corpus es 5.4.8 (wireplumber).
  3. sin vaapi ⇒ sin decodificación por hardware (libva está sólo en incoming-kde), y el ffmpeg
     heredado va `--disable-x86asm` ⇒ tampoco SIMD.

16e2be84d4e4f22ba4f7eb5b15fdcefdc4b7090b · por Sergio · (hace 1 mes) · padre 2a84b8252 · ver el árbol en este commit

Delta semántico

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

1 archivos · +116 −0

diff --git a/recipes/mpv.toml b/recipes/mpv.toml
new file mode 100644
index 00000000..027d4211
--- /dev/null
+++ b/recipes/mpv.toml
@@ -0,0 +1,116 @@
+# mpv 0.41.0 — reproductor de video. LA PRIMERA APP GRÁFICA DE USUARIO FINAL DEL CORPUS.
+#
+# Contexto: el corpus cierra cuatro escritorios (KDE 171/171, GNOME 119/119, COSMIC 90/90,
+# sway 129/129) y de apps tenía doce cosas, ninguna capaz de abrir un video. El ADR 0015 ordenó los
+# montones y puso a mpv primero del montón A —lo que no tiene ningún muro estructural, sólo falta
+# escribirlo—; éste es ese primer paso.
+#
+# ══ POR QUÉ VIVE EN EL CORPUS Y NO EN UNA COLA ══════════════════════════════════════════════════
+# Un reproductor lo quieren las cuatro imágenes. Una receta resuelve sus deps SIBLING-FIRST (su
+# propia cola) y después el catálogo PADRE, nunca una cola hermana: desde `incoming-kde/` mpv no
+# alcanzaría `incoming-cosmic/`, y al revés tampoco. En el corpus lo alcanzan las cuatro. El precio
+# fue subir cinco recetas de sistema (nasm, alsa-lib, ffmpeg, vulkan-headers y las de Python), TODAS
+# con ArtifactHash idéntico al de su cola de origen ⇒ cero rebuild y un solo artefacto por nombre.
+#
+# ══ LAS DOS DEPS QUE NO SE PUEDEN NEGOCIAR ═════════════════════════════════════════════════════
+# `meson.build:29` (libplacebo >= 6.338.2) y `:32` (libass >= 0.12.2) no llevan `required:` ⇒ son
+# duras. No hay mpv sin escribir esas dos recetas antes, y libplacebo a su vez arrastró glad+jinja2.
+#
+# ══ -Dbuild-date=false NO ES COSMÉTICO ═════════════════════════════════════════════════════════
+# Su default es `true` y estampa la fecha de compilación DENTRO del binario. Con eso, dos builds del
+# mismo commit dan bytes distintos y el artefacto deja de reproducir — la promesa que sostiene el
+# store entero. Es el mismo tipo de fuga que `-ffile-prefix-map` cierra para las rutas `/src` en
+# `.debug_*`, pero ésta no hace falta perseguirla: upstream trae la perilla.
+#
+# ══ TODO EXPLÍCITO, NADA EN `auto` ═════════════════════════════════════════════════════════════
+# mpv trae ~90 opciones y casi todas nacen `auto`, o sea que MIRAN EL SANDBOX y se prenden si
+# encuentran el `.pc`. Eso hace que el artefacto dependa de qué otra cosa quedó montada en el lab,
+# que es la misma trampa que la receta de ffmpeg cierra con `--disable-autodetect`. Van todas
+# escritas, y lo que se apaga se apaga por una razón:
+#
+#   x11, gl-x11, egl-x11, xv, x11-clipboard, vdpau   la distro es Wayland-only (decisión firme; ver
+#                                                    la memoria del frente GNOME). No es "todavía no".
+#   vulkan, shaderc, spirv-cross                     nuestra libplacebo va `pl_has_vulkan=0`: el
+#                                                    loader arrastra el stack X11 por los WSI.
+#   vaapi (+ -drm/-wayland)                          libva vive sólo en `incoming-kde/`. ⇒ HOY NO HAY
+#                                                    DECODIFICACIÓN POR HARDWARE. Es el pendiente más
+#                                                    caro de esta receta, junto con el de abajo.
+#   drm, gbm, dmabuf-wayland                         `vo=drm` quiere `libdisplay-info`, que no está.
+#                                                    El camino de salida es EGL/Wayland, que sí está.
+#   pipewire, pulse, jack, sndio, oss, openal        ver el bloque de AUDIO.
+#   lua                                              ver el bloque de LUA.
+#   cdda, dvdnav, dvbin, libbluray, libarchive,      cada una es una lib más en el cierre y ninguna
+#   lcms2, uchardet, rubberband, zimg, vapoursynth,  hace falta para reproducir un fichero. Se
+#   libavdevice, javascript, jpeg, caca, sixel,      prenden cuando alguien las pida, no antes.
+#   sdl2-*, cplugins, openal
+#   manpage-build                                    exige docutils (rst2man); no está en el corpus.
+#   libmpv                                           nadie la consume todavía. Se prende el día que
+#                                                    entre un frontend (celluloid y compañía).
+#
+# ══ AUDIO: ALSA, Y HAY QUE DECIR LO QUE ESO SIGNIFICA HOY ══════════════════════════════════════
+# El servidor de audio de la distro es PipeWire (decisión del usuario, 2026-07-29), pero mpv no
+# puede hablarle nativo desde acá: `libpipewire-0.3` existe en las TRES colas de escritorio y en
+# ninguna está el corpus, y subirla no es gratis (su cierre trae glib, y `incoming-kde/glib-shared`
+# y `incoming-gnome/glib` producen bytes distintos — el episodio de las dos glib). Queda ALSA, que
+# es la ABI del kernel y no depende de ninguna cola.
+#
+# ⚠ Y ASÍ COMO ESTÁ HOY, ESO NO SUENA EN UN ESCRITORIO CON PIPEWIRE CORRIENDO: las tres recetas de
+# pipewire llevan `-Dpipewire-alsa=disabled`, o sea que NO instalan el plugin ALSA que redirige a
+# PipeWire. Un cliente ALSA abre la tarjeta por su cuenta y compite con el servidor. El arreglo no
+# es de esta receta: es dar vuelta esa perilla en las tres pipewire, que es lo que convierte a ALSA
+# en la ABI de audio universal de la distro y sirve a TODA app ALSA, no sólo a mpv. Radio medido con
+# `yupana radio pipewire`: 4 en cosmic, 3 en gnome, 2 en kde. Barato. Es el próximo paso del frente
+# y está escrito acá para que no se descubra con un video mudo.
+#
+# ══ LUA: SIN OSC, Y NO ES UN OLVIDO ════════════════════════════════════════════════════════════
+# El OSC (la barra de búsqueda, el overlay de estadísticas, la consola) es Lua: `player/lua/osc.lua`.
+# Sin Lua, mpv reproduce y responde al teclado pero no dibuja NADA de interfaz. Y la lua del corpus
+# no sirve: `meson.build:701` sólo acepta 5.1, 5.2 o LuaJIT (el `lua.pc` genérico va acotado a
+# `>=5.1.0, <5.3.0`) y la nuestra es 5.4.8, que entró para wireplumber. Prenderlo pide una receta
+# `lua5.2` o `luajit` nueva — trabajo acotado y con premio visible, el siguiente ticket del frente.
+#
+# ══ EL PRECIO DEL ffmpeg QUE HEREDA ════════════════════════════════════════════════════════════
+# El ffmpeg del corpus viene de la campaña KDE, donde entró para que kpipewire grabara un stream, y
+# lleva `--disable-x86asm`. Para eso daba igual; para un reproductor es decodificar sin SIMD. NO se
+# arregla desde acá: tocar esa receta produciría un ffmpeg con hash distinto al de `incoming-kde/` y
+# entonces habría DOS ffmpeg peleando por las mismas rutas en una imagen KDE. El arreglo correcto es
+# promover una sola ffmpeg con x86asm y jubilar la de la cola. `nasm` ya está en el corpus para eso.
+#
+# Fuente por commit git (ADR 0006): los `/archive/` de GitHub los genera la forge al vuelo y su
+# sha256 cambia cuando el servidor actualiza git/gzip. `v0.41.0` es un tag ANOTADO ⇒ esto es el
+# `^{}` pelado, no el sha del tag.
+name    = "mpv"
+version = "0.41.0"
+license = "GPL-2.0-or-later"
+
+[source]
+repo   = "https://github.com/mpv-player/mpv.git"
+commit = "41f6a645068483470267271e1d09966ca3b9f413"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+# Dinámico como foot: el cierre gráfico de abajo ya es dinámico y no es negociable —mesa expone
+# EGL/GL como `.so`, ffmpeg va `--enable-shared --disable-static` y libplacebo lleva C++ adentro.
+# Las libs que sí son `.a` (libass, freetype, harfbuzz, fribidi, fontconfig) entran igual: quien las
+# consume es un EJECUTABLE, no un objeto compartido, así que la regla del `.a` no-PIC no aplica.
+link  = "dynamic"
+flags = []
+
+[build.phases]
+configure = "PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release -Dprefer_static=true -Dbuild-date=false -Dcplayer=true -Dlibmpv=false -Dtests=false -Dmanpage-build=disabled -Dhtml-build=disabled -Dpdf-build=disabled -Dwayland=enabled -Degl=enabled -Degl-wayland=enabled -Dgl=enabled -Dplain-gl=disabled -Dalsa=enabled -Dzlib=enabled -Diconv=enabled -Dvector=enabled -Dx11=disabled -Dgl-x11=disabled -Degl-x11=disabled -Dxv=disabled -Dx11-clipboard=disabled -Dvdpau=disabled -Dvulkan=disabled -Dshaderc=disabled -Dspirv-cross=disabled -Dvaapi=disabled -Dvaapi-drm=disabled -Dvaapi-wayland=disabled -Dvaapi-x11=disabled -Ddrm=disabled -Dgbm=disabled -Ddmabuf-wayland=disabled -Dpipewire=disabled -Dpulse=disabled -Djack=disabled -Dsndio=disabled -Doss-audio=disabled -Dopenal=disabled -Dsdl2-audio=disabled -Dsdl2-video=disabled -Dsdl2-gamepad=disabled -Dlua=disabled -Djavascript=disabled -Dcdda=disabled -Ddvdnav=disabled -Ddvbin=disabled -Dlibbluray=disabled -Dlibarchive=disabled -Dlibavdevice=disabled -Dlcms2=disabled -Duchardet=disabled -Drubberband=disabled -Dzimg=disabled -Dvapoursynth=disabled -Djpeg=disabled -Dcaca=disabled -Dsixel=disabled -Dcplugins=disabled -Dcuda-hwaccel=disabled -Dcuda-interop=disabled"
+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"
+
+# `.pc Requires` → `[deps].build`, el patrón del corpus: freetype2 pide zlib+libpng, fontconfig pide
+# expat, harfbuzz pide glib-2.0 (arrastra pcre2+libffi), wayland-client pide libffi, y mesa pone
+# egl/gl/wayland-egl. linux-headers va porque el sandbox no los da solos.
+[deps]
+build = [
+  "meson", "samurai", "python3", "pkgconf", "linux-headers",
+  "ffmpeg", "libplacebo", "libass", "libunibreak",
+  "mesa", "libdrm", "wayland", "wayland-protocols", "libxkbcommon",
+  "alsa-lib",
+  "freetype", "fribidi", "harfbuzz", "fontconfig",
+  "glib", "pcre2", "libffi", "expat", "libpng", "zlib", "zlib-shared",
+]