gioser

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 1373Shell 116Rust 74Markdown 641915 Sutichaykuna

⎇ 4148ba4e02310090bb3c844c5942fe7e0251f106 recipes/mpv.toml TOML · 155 siq'ikuna · 12.6 KB Ñawpa willay ch'uya

takana etapa 5a: los comentarios de las 741 recetas e852f4849 · Sergio ·

1# mpv 0.41.0 — reproductor de video. LA PRIMERA APP GRÁFICA DE USUARIO FINAL DEL CORPUS.
2#
3# Contexto: el corpus cierra cuatro escritorios (KDE 171/171, GNOME 119/119, COSMIC 90/90,
4# sway 129/129) y de apps tenía doce cosas, ninguna capaz de abrir un video. El ADR 0015 ordenó los
5# montones y puso a mpv primero del montón A —lo que no tiene ningún muro estructural, sólo falta
6# escribirlo—; éste es ese primer paso.
7#
8# ══ POR QUÉ VIVE EN EL CORPUS Y NO EN UNA COLA ══════════════════════════════════════════════════
9# Un reproductor lo quieren las cuatro imágenes. Una receta resuelve sus deps SIBLING-FIRST (su
10# propia cola) y después el catálogo PADRE, nunca una cola hermana: desde `incoming-kde/` mpv no
11# alcanzaría `incoming-cosmic/`, y al revés tampoco. En el corpus lo alcanzan las cuatro. El precio
12# fue subir cinco recetas de sistema (nasm, alsa-lib, ffmpeg, vulkan-headers y las de Python), TODAS
13# con ArtifactHash idéntico al de su cola de origen ⇒ cero rebuild y un solo artefacto por nombre.
14#
15# ══ LAS DOS DEPS QUE NO SE PUEDEN NEGOCIAR ═════════════════════════════════════════════════════
16# `meson.build:29` (libplacebo >= 6.338.2) y `:32` (libass >= 0.12.2) no llevan `required:` ⇒ son
17# duras. No hay mpv sin escribir esas dos recetas antes, y libplacebo a su vez arrastró glad+jinja2.
18#
19# ══ -Dbuild-date=false NO ES COSMÉTICO ═════════════════════════════════════════════════════════
20# Su default es `true` y estampa la fecha de compilación DENTRO del binario. Con eso, dos builds del
21# mismo commit dan bytes distintos y el artefacto deja de reproducir — la promesa que sostiene el
22# store entero. Es el mismo tipo de fuga que `-ffile-prefix-map` cierra para las rutas `/src` en
23# `.debug_*`, pero ésta no hace falta perseguirla: upstream trae la perilla.
24#
25# ══ TODO EXPLÍCITO, NADA EN `auto` ═════════════════════════════════════════════════════════════
26# mpv trae ~90 opciones y casi todas nacen `auto`, o sea que MIRAN EL SANDBOX y se prenden si
27# encuentran el `.pc`. Eso hace que el artefacto dependa de qué otra cosa quedó montada en el lab,
28# que es la misma trampa que la receta de ffmpeg cierra con `--disable-autodetect`. Van todas
29# escritas, y lo que se apaga se apaga por una razón:
30#
31#   x11, gl-x11, egl-x11, xv, x11-clipboard, vdpau   la distro es Wayland-only (decisión firme; ver
32#                                                    la memoria del frente GNOME). No es "todavía no".
33#   vulkan, shaderc, spirv-cross                     nuestra libplacebo va `pl_has_vulkan=0`: el
34#                                                    loader arrastra el stack X11 por los WSI.
35#   vaapi-drm                                        exige `features['drm']` de mpv, apagado abajo.
36#   vaapi-x11                                        Wayland-only.
37#   drm, gbm, dmabuf-wayland                         `vo=drm` quiere `libdisplay-info`, que no está.
38#                                                    El camino de salida es EGL/Wayland, que sí está.
39#   pipewire, pulse, jack, sndio, oss, openal        ver el bloque de AUDIO.
40#   lua                                              ver el bloque de LUA.
41#   cdda, dvdnav, dvbin, libbluray, libarchive,      cada una es una lib más en el cierre y ninguna
42#   lcms2, uchardet, rubberband, zimg, vapoursynth,  hace falta para reproducir un fichero. Se
43#   libavdevice, javascript, jpeg, caca, sixel,      prenden cuando alguien las pida, no antes.
44#   sdl2-*, cplugins, openal
45#   manpage-build                                    exige docutils (rst2man); no está en el corpus.
46#   libmpv                                           nadie la consume todavía. Se prende el día que
47#                                                    entre un frontend (celluloid y compañía).
48#
49# ══ vaapi: DECODIFICACIÓN POR HARDWARE, Y POR QUÉ PIDE `libva-wayland` ═════════════════════════
50# Era el último hueco de esta receta. `libva` vivía sólo en `incoming-kde/` y el corpus no alcanza una
51# cola hermana; el 2026-09-04 subió al corpus (mudanza de hash IDÉNTICO, medida con `takana hash`) y
52# la copia de la cola se jubiló.
53#
54# `-Dvaapi=enabled` A SECAS NO HABILITA NADA, y esto es lo que hay que saber antes de tocarlo:
55# `meson.build:1464` requiere el feature contra `vaapi-drm or vaapi-wayland or vaapi-x11 or
56# vaapi-win32`. Sin backend, la perilla se evalúa a falso — y con `enabled` eso es un error de
57# configure, no un apagado silencioso, que al menos falla ruidoso. De los cuatro backends: x11 y
58# win32 fuera (Wayland-only), y `vaapi-drm` exige además `features['drm']`, apagado porque `vo=drm`
59# pide `libdisplay-info`, que no está. Queda `vaapi-wayland`, que pide `libva-wayland.pc` ⇒ por eso
60# libva se reconstruyó con `-Dwith_wayland=yes`.
61#
62# Lo que entra al binario con el feature prendido: `video/vaapi.c`, `hwdec_vaapi.c`, el filtro
63# `vf_vavpp.c` y `dmabuf_interop_pl.c` — el interop es por libplacebo (el mismo que ya usa el vo), no
64# por GL: `dmabuf-interop-gl` es un feature aparte.
65#
66# ⚠ EL DRIVER ES RUNTIME. libva es sólo la capa de despacho; quien decodifica es
67# `intel-media-driver` o el gallium VA de mesa, cargados por `dlopen` según la GPU. Que esto selle y
68# que `--hwdec=vaapi` funcione en una máquina son dos cosas distintas: en un equipo sin driver VA
69# instalado, mpv cae a decodificación por software y no lo dice fuerte. Comprobar con
70# `mpv --hwdec=vaapi -v` y buscar la línea del driver, nunca asumirlo por el sello.
71
72# ══ AUDIO: PIPEWIRE NATIVO, CON ALSA DETRÁS ════════════════════════════════════════════════════
73# El servidor de audio de la distro es PipeWire (decisión del usuario, 2026-07-29) y desde el
74# 2026-09-03 `libpipewire-0.3` vive en el CORPUS, así que mpv le habla NATIVO: control por-stream,
75# metadata de sesión, sin pasar por la emulación. La promoción se pudo hacer porque se midió que
76# ningún pipewire enlaza glib (sus NEEDED son dbus/pulse/sndfile) ⇒ es compartible entre las cuatro
77# imágenes sin repetir el episodio de las dos glib. Ver la cabecera de `recipes/pipewire.toml`.
78#
79# ALSA queda ENCENDIDA TAMBIÉN, y no es redundancia: mpv prueba `pipewire` primero y cae a `alsa` si
80# no hay demonio con quien hablar. En una imagen sin PipeWire corriendo —KDE hoy no lo lista entre
81# sus raíces— eso es la diferencia entre sonar y no sonar.
82#
83# Y el camino ALSA tampoco pelea con PipeWire: la receta de pipewire va con `-Dpipewire-alsa=enabled`
84# y cablea el plugin en `/etc/alsa/conf.d`, así que un cliente ALSA que abre "default" desemboca en
85# PipeWire. La cadena de respaldo es `--ao=alsa` → `libasound` → `libasound_module_pcm_pipewire.so`
86# → PipeWire: protocolo en vez de ABI compartida.
87# ⚠ El precio, que conviene tener escrito: con `99-pipewire-default.conf` puesto, `pcm.!default` ES
88# PipeWire. En una máquina donde PipeWire NO esté corriendo, un cliente ALSA ya no cae a la tarjeta:
89# no suena. Es el trato que hace toda distro con pipewire-alsa, y acá es coherente porque PipeWire
90# es el servidor decidido; pero explica un silencio que sin esta nota se diagnostica mal.
91#
92# ══ LUA: EL OSC, Y POR QUÉ NO ES LA `lua` DEL CORPUS ═══════════════════════════════════════════
93# El OSC (la barra de búsqueda, el overlay de estadísticas, la consola) es Lua: `player/lua/osc.lua`.
94# Sin Lua, mpv reproduce y responde al teclado pero no dibuja NADA de interfaz.
95#
96# La `lua` del corpus NO sirve: `meson.build:701` sólo acepta 5.1, 5.2 o LuaJIT (el `lua.pc` genérico
97# va acotado a `>=5.1.0, <5.3.0`) y la nuestra es 5.4.8, que entró para wireplumber. Por eso existe
98# `recipes/lua5.2.toml`, que instala SÓLO la librería —sin `/usr/bin/lua`, sin `luac` y sin `lua.pc`
99# genérico— justamente para que las dos puedan convivir en una imagen sin pisarse.
100# `-Dlua=lua5.2` y no `auto`: `auto` recorre ocho nombres de `.pc` y se lleva el primero que
101# encuentre en el sandbox, o sea que el artefacto dependería de qué otra cosa quedó montada.
102#
103# ══ EL ffmpeg QUE HEREDA — YA CON SIMD (2026-09-04) ════════════════════════════════════════════
104# El ffmpeg del corpus venía de la campaña KDE (entró para que kpipewire grabara un stream) y traía
105# `--disable-x86asm`: para grabar un stream daba igual, para un reproductor era decodificar sin SIMD.
106# Acá decía que NO se arreglaba porque produciría un ffmpeg distinto al de `incoming-kde/` y habría
107# dos peleando por las mismas rutas en una imagen KDE.
108#
109# Esa condición ya no se cumple: `incoming-kde/ffmpeg.toml` fue jubilada y hoy hay UNA sola receta
110# ffmpeg en todo el disco, que la cola resuelve por caída al catálogo padre. Con el duplicado fuera,
111# encender x86asm dejó de tener precio y se encendió — radio medido: 4 dependientes (mpv,
112# wf-recorder, kpipewire, spectacle). Ver la cabecera de `recipes/ffmpeg.toml`.
113#
114# La lección, que vale más que el flag: **un comentario que prohíbe algo por una condición del mundo
115# envejece hacia la mentira cuando la condición se levanta**, y nadie lo revisa porque leerlo suena a
116# que ya está decidido. Al jubilar un duplicado, buscar quién lo citaba como razón.
117#
118# Fuente por commit git (ADR 0006): los `/archive/` de GitHub los genera la forge al vuelo y su
119# sha256 cambia cuando el servidor actualiza git/gzip. `v0.41.0` es un tag ANOTADO ⇒ esto es el
120# `^{}` pelado, no el sha del tag.
121name    = "mpv"
122version = "0.41.0"
123license = "GPL-2.0-or-later"
124
125[source]
126repo   = "https://github.com/mpv-player/mpv.git"
127commit = "41f6a645068483470267271e1d09966ca3b9f413"
128
129[build]
130compiler = "zig-cc"
131target   = "x86_64-linux-musl"
132# Dinámico como foot: el cierre gráfico de abajo ya es dinámico y no es negociable —mesa expone
133# EGL/GL como `.so`, ffmpeg va `--enable-shared --disable-static` y libplacebo lleva C++ adentro.
134# Las libs que sí son `.a` (libass, freetype, harfbuzz, fribidi, fontconfig) entran igual: quien las
135# consume es un EJECUTABLE, no un objeto compartido, así que la regla del `.a` no-PIC no aplica.
136link  = "dynamic"
137flags = []
138
139[build.phases]
140configure = "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=enabled -Dvaapi-wayland=enabled -Dvaapi-drm=disabled -Dvaapi-x11=disabled -Ddrm=disabled -Dgbm=disabled -Ddmabuf-wayland=disabled -Dpipewire=enabled -Dpulse=disabled -Djack=disabled -Dsndio=disabled -Doss-audio=disabled -Dopenal=disabled -Dsdl2-audio=disabled -Dsdl2-video=disabled -Dsdl2-gamepad=disabled -Dlua=lua5.2 -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"
141compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
142install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
143
144# `.pc Requires` → `[deps].build`, el patrón del corpus: freetype2 pide zlib+libpng, fontconfig pide
145# expat, harfbuzz pide glib-2.0 (arrastra pcre2+libffi), wayland-client pide libffi, y mesa pone
146# egl/gl/wayland-egl. linux-headers va porque el sandbox no los da solos.
147[deps]
148build = [
149  "meson", "samurai", "python3", "pkgconf", "linux-headers",
150  "ffmpeg", "libplacebo", "libass", "libunibreak", "lua5.2", "libva",
151  "pipewire", "alsa-lib",
152  "mesa", "libdrm", "wayland", "wayland-protocols", "libxkbcommon",
153  "freetype", "fribidi", "harfbuzz", "fontconfig",
154  "glib", "pcre2", "libffi", "expat", "libpng", "zlib", "zlib-shared",
155]