Cierra la decisión que quedó abierta anoche en `docs/plan-apps-usuario-final.md`: el corpus no tenía ningún cliente de audio salvo ALSA, y eso bloqueaba a toda app multimedia. GANA LA VARIANTE DE COSMIC y la promoción es GRATIS: era la única cuyo cierre ya resolvía entero contra el catálogo padre, así que `recipes/pipewire.toml` sella b3:e240653a — el mismo hash que tenía en la cola. Con ella suben `libsndfile` (las tres copias sellaban idéntico) y `dbus-shared` (gnome y cosmic, idénticas). Se jubilan 9 copias de cola. POR QUÉ ESTO NO REPITE EL EPISODIO DE LAS DOS GLIB — leído de los artefactos sellados, no razonado: **ningún pipewire de los tres enlaza glib.** Los NEEDED de las tres variantes son exactamente `libdbus-1.so.3`, `libpulse.so.0` y `libsndfile.so.1`; glib entraba sólo como Requires transitivo de pkg-config, en tiempo de build. ⇒ `libpipewire-0.3.so` es glib-free y se comparte entre las cuatro imágenes sin riesgo. ⚠ Y POR ESO `pulseaudio` NO SE PROMUEVE, aunque sea la dep de al lado. Ahí la objeción SÍ aplica y el número lo dice solo: `libpulse-mainloop-glib.so.0.0.6` mide **45.712 bytes** en la variante de GNOME (NEEDED `libglib-2.0.so.0`) y **2.455.600** en la del corpus, que se traga la glib ESTÁTICA del catálogo. Meter ésa en el proceso de gnome-shell —que ya carga la glib sombra dinámica— es literalmente el cuadro de colord. `incoming-kde/pulseaudio` e `incoming-gnome/pulseaudio` se quedan donde están: son variantes deliberadas, no duplicados. La copia del corpus existe sólo para que pipewire tenga contra qué enlazar `libpulse.so.0`, y ese enlace es por SONAME — en runtime lo sirve la libpulse de cada imagen, ABI-compatible (misma 0.24.3). Enlazar contra una variante y correr contra otra es legítimo cuando lo que cruza es un SONAME; lo que NO se puede es hidratar dos artefactos distintos en la misma ruta. Esa distinción es la que decide qué se promueve y qué no. mpv (b3:392e9690) pasa a `-Dpipewire=enabled`, con ALSA encendida detrás: prueba pipewire primero y cae a alsa si no hay demonio —KDE todavía no lista PipeWire entre sus raíces—. Evidencia: NEEDED … libasound.so.2 **libpipewire-0.3.so.0** libEGL.so.1 libc.so --ao=help → pipewire (PipeWire audio output), alsa, null Impacto medido antes de tocar, hasheando las 336 recetas de cola y comparando: 9 retiradas, **5 rebuilds** (wireplumber, xdg-desktop-portal ×2, kpipewire, spectacle) — los 5 sellados. Sin la salvedad de pulseaudio habrían sido 8, incluido gnome-shell. Perfiles: KDE 188/188, GNOME 132/132, sway 145/145. ⚠ COSMIC 105/106: `xdg-desktop-portal-cosmic` murió por OOM por TERCERA vez (7 G de RAM sin cgroups, con otro agente compilando Rust). Sigue siendo la máquina, no la receta.
126 lines
11 KiB
TOML
126 lines
11 KiB
TOML
# 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: PIPEWIRE NATIVO, CON ALSA DETRÁS ════════════════════════════════════════════════════
|
|
# El servidor de audio de la distro es PipeWire (decisión del usuario, 2026-07-29) y desde el
|
|
# 2026-09-03 `libpipewire-0.3` vive en el CORPUS, así que mpv le habla NATIVO: control por-stream,
|
|
# metadata de sesión, sin pasar por la emulación. La promoción se pudo hacer porque se midió que
|
|
# ningún pipewire enlaza glib (sus NEEDED son dbus/pulse/sndfile) ⇒ es compartible entre las cuatro
|
|
# imágenes sin repetir el episodio de las dos glib. Ver la cabecera de `recipes/pipewire.toml`.
|
|
#
|
|
# ALSA queda ENCENDIDA TAMBIÉN, y no es redundancia: mpv prueba `pipewire` primero y cae a `alsa` si
|
|
# no hay demonio con quien hablar. En una imagen sin PipeWire corriendo —KDE hoy no lo lista entre
|
|
# sus raíces— eso es la diferencia entre sonar y no sonar.
|
|
#
|
|
# Y el camino ALSA tampoco pelea con PipeWire: la receta de pipewire va con `-Dpipewire-alsa=enabled`
|
|
# y cablea el plugin en `/etc/alsa/conf.d`, así que un cliente ALSA que abre "default" desemboca en
|
|
# PipeWire. La cadena de respaldo es `--ao=alsa` → `libasound` → `libasound_module_pcm_pipewire.so`
|
|
# → PipeWire: protocolo en vez de ABI compartida.
|
|
# ⚠ El precio, que conviene tener escrito: con `99-pipewire-default.conf` puesto, `pcm.!default` ES
|
|
# PipeWire. En una máquina donde PipeWire NO esté corriendo, un cliente ALSA ya no cae a la tarjeta:
|
|
# no suena. Es el trato que hace toda distro con pipewire-alsa, y acá es coherente porque PipeWire
|
|
# es el servidor decidido; pero explica un silencio que sin esta nota se diagnostica mal.
|
|
#
|
|
# ══ LUA: EL OSC, Y POR QUÉ NO ES LA `lua` DEL CORPUS ═══════════════════════════════════════════
|
|
# 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.
|
|
#
|
|
# 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. Por eso existe
|
|
# `recipes/lua5.2.toml`, que instala SÓLO la librería —sin `/usr/bin/lua`, sin `luac` y sin `lua.pc`
|
|
# genérico— justamente para que las dos puedan convivir en una imagen sin pisarse.
|
|
# `-Dlua=lua5.2` y no `auto`: `auto` recorre ocho nombres de `.pc` y se lleva el primero que
|
|
# encuentre en el sandbox, o sea que el artefacto dependería de qué otra cosa quedó montada.
|
|
#
|
|
# ══ 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=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"
|
|
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", "lua5.2",
|
|
"pipewire", "alsa-lib",
|
|
"mesa", "libdrm", "wayland", "wayland-protocols", "libxkbcommon",
|
|
"freetype", "fribidi", "harfbuzz", "fontconfig",
|
|
"glib", "pcre2", "libffi", "expat", "libpng", "zlib", "zlib-shared",
|
|
]
|