From 032aa025828db9862d1aecbb370a3a1444d8a94a Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 3 Sep 2026 05:07:12 +0000 Subject: [PATCH] =?UTF-8?q?lua5.2=205.2.4:=20mpv=20gana=20el=20OSC=20?= =?UTF-8?q?=E2=80=94=20la=20barra,=20las=20estad=C3=ADsticas=20y=20la=20co?= =?UTF-8?q?nsola?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El OSC de mpv es `player/lua/osc.lua`: sin Lua el reproductor anda y responde al teclado pero NO DIBUJA NADA de interfaz. La `lua` del corpus no sirve — `meson.build:701` acepta 5.1, 5.2 o LuaJIT y el `lua.pc` genérico va acotado a `>=5.1.0, <5.3.0`; la nuestra es 5.4.8 y entró para wireplumber. CÓMO CONVIVEN LAS DOS SIN PISARSE, que es lo que hace legítimo tener dos Lua: esta receta instala **sólo la librería**. Sin `/usr/bin/lua`, sin `luac` y sin `lua.pc` genérico — que son exactamente los tres ficheros que colisionarían si una imagen hidratara las dos. Las `.so` no colisionan porque el SONAME lleva la versión, y los headers van a `/usr/include/lua5.2/` porque los de 5.2 y 5.4 se llaman igual y dicen cosas distintas. La diferencia con 5.4 que muerde: en 5.2.4 `luaconf.h:43-49` hace que `LUA_USE_LINUX` implique `LUA_USE_READLINE` (en 5.4 eso vive en el target `linux-readline` del Makefile). Se esquiva construyendo el target `a` —sólo `liblua.a`— en vez de `all`: `LUA_USE_READLINE` lo consume nada más que `lua.c`, el binario del REPL, que acá no se compila. Sale gratis y de paso es lo que hace que no haya `/usr/bin/lua` que colisione. `-Dlua=lua5.2` y no `auto`: auto recorre ocho nombres de `.pc` y se lleva el primero que encuentre en el sandbox ⇒ el artefacto dependería de qué otra cosa quedó montada en el lab. EVIDENCIA, del mpv re-sellado (b3:d9072a10): List of enabled features: … libass libplacebo **lua5.2** … wayland [cplayer] Set property: user-data/osc/visibility="auto" -> 1 [cplayer] Done loading scripts. o sea que el script del OSC no sólo compiló: se carga y corre. alsa-lib: se corrige el comentario, que decía que las pipewire iban con `-Dpipewire-alsa=disabled`. Ya no. Y queda escrito el gotcha que costó encontrarlo: el `alsa.conf` que instala carga `/var/lib/alsa/conf.d`, `/usr/etc/alsa/conf.d` y `/etc/alsa/conf.d`, NO `/usr/share/alsa/alsa.conf.d`, que es donde meson deja la config del plugin. --- recipes/alsa-lib.toml | 18 ++++++--- recipes/lua5.2.toml | 90 +++++++++++++++++++++++++++++++++++++++++++ recipes/mpv.toml | 34 +++++++++------- 3 files changed, 122 insertions(+), 20 deletions(-) create mode 100644 recipes/lua5.2.toml diff --git a/recipes/alsa-lib.toml b/recipes/alsa-lib.toml index dd66a27d..f83515d5 100644 --- a/recipes/alsa-lib.toml +++ b/recipes/alsa-lib.toml @@ -7,12 +7,18 @@ # ⇒ el cierre no cambia y `hammer hash` da el MISMO ArtifactHash a los cuatro ficheros. Un solo # artefacto en el store, hidrate quien hidrate. # -# ⚠ QUÉ SIGNIFICA ESTO PARA EL SONIDO DE VERDAD, que no es obvio: el servidor de audio de la distro -# es PipeWire (decisión del usuario, 2026-07-29), y las tres recetas de pipewire llevan HOY -# `-Dpipewire-alsa=disabled`. O sea que un cliente ALSA **no** desemboca en PipeWire: abre la tarjeta -# por su cuenta y compite con él. Mientras eso no se invierta, `mpv --ao=alsa` suena en una máquina -# sin PipeWire corriendo y choca en una con él. Está escrito en `recipes/mpv.toml` y es el próximo -# paso del frente, no un olvido. +# QUÉ SIGNIFICA ESTO PARA EL SONIDO DE VERDAD: el servidor de audio de la distro es PipeWire +# (decisión del usuario, 2026-07-29), y desde 2026-09-03 las tres recetas de pipewire van con +# `-Dpipewire-alsa=enabled` ⇒ **ALSA es la ABI de audio universal de esta distro**. Un cliente ALSA +# que abre "default" desemboca en PipeWire por el plugin `libasound_module_pcm_pipewire.so`, no le +# pelea la tarjeta. Eso es lo que hace que esta receta alcance para una app de audio del corpus sin +# tener que subir `libpipewire` (que vive en las tres colas de escritorio y arrastra glib). +# +# ⚠ OJO con el `alsa.conf` que instala: sus `@hooks` cargan `/var/lib/alsa/conf.d`, +# `/usr/etc/alsa/conf.d` y `/etc/alsa/conf.d` — **NO** `/usr/share/alsa/alsa.conf.d`, que es donde +# meson deja la config del plugin. Por eso las recetas de pipewire tienen que enlazarla a mano: sin +# ese enlace el plugin queda instalado y no lo usa nadie. (El `/usr/etc` sale de que acá el +# `./configure` no pasa `--sysconfdir=/etc`; cambiarlo re-hashearía alsa-lib y sus cuatro copias.) # alsa-lib 1.2.14 — API de audio del kernel Linux (libasound.so). Campaña KDE (ADR 0011): sustrato de # PulseAudio → pulseaudio-qt → plasma-pa (el applet de volumen). Primer eslabón de la cadena de AUDIO real # (hasta ahora el lab sólo tenía libcanberra con backend NULL, sin reproducción). diff --git a/recipes/lua5.2.toml b/recipes/lua5.2.toml new file mode 100644 index 00000000..b31a603d --- /dev/null +++ b/recipes/lua5.2.toml @@ -0,0 +1,90 @@ +# Lua 5.2.4 — el intérprete EMBEBIDO que necesita el OSC de mpv. No es el `lua` del corpus. +# +# ══ POR QUÉ DOS LUA Y NO UNA ═══════════════════════════════════════════════════════════════════ +# El corpus ya tiene `lua` 5.4.8, que entró para wireplumber (su política está escrita en Lua). mpv +# NO la puede usar: `meson.build:701` enumera las versiones aceptadas y son 5.1, 5.2 y LuaJIT — el +# `lua.pc` genérico va acotado a `>=5.1.0, <5.3.0`. No es una preferencia de upstream que se pueda +# forzar con una perilla: mpv 0.41 no compila contra la API de 5.3+. +# +# Sin Lua, mpv reproduce y responde al teclado pero NO DIBUJA NADA de interfaz: el OSC —la barra de +# búsqueda, el overlay de estadísticas, la consola— es `player/lua/osc.lua`. Es la diferencia entre +# "el video se ve" y "hay un reproductor". +# +# ══ CÓMO CONVIVEN SIN PISARSE, que es lo que hace legítimo tener las dos ═══════════════════════ +# Esta receta instala **sólo la librería**: sin `/usr/bin/lua`, sin `luac`, y sin un `lua.pc` +# genérico. Los tres son exactamente los ficheros que colisionarían con la 5.4 si una imagen +# hidratara las dos (mismas rutas, gana quien proyecte último — el cuadro de las dos glib). Las +# `.so` no colisionan porque el SONAME lleva la versión: `liblua-5.2.so.0` vs `liblua-5.4.so.0`. +# Los `.pc` que sí publica son los tres nombres versionados que mpv prueba: `lua5.2`, `lua-5.2`, +# `lua52`. Nadie que pida "lua" a secas se lleva ésta por error. +# +# ══ LO QUE HAY QUE INVENTAR, igual que en la receta de 5.4 ═════════════════════════════════════ +# El Makefile de Lua sólo produce `liblua.a` y los binarios: **no hay regla de `.so` ni fichero +# pkg-config**, los agrega cada distro. Acá se agregan a mano: `-fPIC` en MYCFLAGS (sin eso la `.a` +# no es reubicable), la `.so` enlazada con `--whole-archive` (de una estática el linker sólo se +# lleva lo referenciado y acá hay que llevárselo todo), y el `.pc` escrito a mano. +# +# ⚠ LA DIFERENCIA CON 5.4 QUE MUERDE: en 5.2.4 el `luaconf.h:43-49` hace que `LUA_USE_LINUX` +# implique **`LUA_USE_READLINE`** — en 5.4 eso se movió al target `linux-readline` del Makefile, así +# que la receta de 5.4 puede definir LUA_USE_LINUX sin arrastrar readline y ésta no. Se esquiva +# construyendo el target `a` (sólo `liblua.a`) en vez de `all`: `LUA_USE_READLINE` lo consume +# únicamente `lua.c`, el binario del REPL, que acá no se compila. Sale gratis y de paso es lo que +# hace que no haya `/usr/bin/lua` que colisione. El ncurses del catálogo es static-only y arrastra +# `-static` al link, así que traer readline habría sido el mismo muro que ya saltó `pw-top`. +name = "lua5.2" +version = "5.2.4" +license = "MIT" + +[source] +tarball = "https://www.lua.org/ftp/lua-5.2.4.tar.gz" +sha256 = "b9e2e4aad6789b3b63a056d442f7b39f0ecfca3ae0f1fc0ae4e9614401b69f4b" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = "true" +compile = ''' +set -e +# CC explícito: el Makefile de Lua lo fija a `gcc -std=gnu99` y ganaría sobre el del entorno. +# Target `a` y no `all`: sólo la librería (ver la nota de readline en la cabecera). +make -C src a CC="hammer-zig-cc -std=gnu99" \ + SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-ldl" MYCFLAGS="-fPIC" +hammer-zig-cc -shared -o src/liblua-5.2.so.0.0.0 \ + -Wl,-soname,liblua-5.2.so.0 \ + -Wl,--whole-archive src/liblua.a -Wl,--no-whole-archive -lm +''' +install = ''' +set -e +mkdir -p /out/usr/lib/pkgconfig /out/usr/include/lua5.2 +# Headers en un subdirectorio propio: los de 5.2 y los de 5.4 tienen los MISMOS nombres y contenido +# distinto. En /usr/include pelado se pisarían y el próximo que compile contra "lua" se llevaría los +# que hidrató último. El `.pc` apunta acá, así que quien use pkg-config no se entera. +install -m644 src/lua.h src/luaconf.h src/lualib.h src/lauxlib.h src/lua.hpp /out/usr/include/lua5.2/ +install -m644 src/liblua.a /out/usr/lib/liblua-5.2.a +install -m755 src/liblua-5.2.so.0.0.0 /out/usr/lib/ +ln -s liblua-5.2.so.0.0.0 /out/usr/lib/liblua-5.2.so.0 +ln -s liblua-5.2.so.0 /out/usr/lib/liblua-5.2.so +cat > /out/usr/lib/pkgconfig/lua5.2.pc <<'PC' +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include/lua5.2 + +Name: Lua +Description: Lua language engine (5.2, embebida — sin intérprete) +Version: 5.2.4 +Requires: +Libs: -L${libdir} -llua-5.2 -lm +Cflags: -I${includedir} +PC +# Los tres nombres versionados que prueba mpv (meson.build:701). NINGÚN `lua.pc` genérico: ése es +# de la 5.4 y confundirlos es justamente lo que esta receta evita. +ln -s lua5.2.pc /out/usr/lib/pkgconfig/lua-5.2.pc +ln -s lua5.2.pc /out/usr/lib/pkgconfig/lua52.pc +''' + +[deps] +build = ["make", "pkgconf"] diff --git a/recipes/mpv.toml b/recipes/mpv.toml index 027d4211..450ed0cf 100644 --- a/recipes/mpv.toml +++ b/recipes/mpv.toml @@ -54,20 +54,26 @@ # 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. +# Y ESO SÍ SUENA, desde 2026-09-03: las tres recetas de pipewire pasaron a `-Dpipewire-alsa=enabled` +# y cablean el plugin en `/etc/alsa/conf.d` (ver el bloque de install de cualquiera de las tres). Un +# cliente ALSA que abre "default" desemboca en PipeWire en vez de pelearle la tarjeta. La cadena es +# `mpv --ao=alsa` → `libasound` → `libasound_module_pcm_pipewire.so` → PipeWire, o sea PROTOCOLO en +# vez de ABI compartida — la misma figura que el ADR 0015 usa para cruzar el borde de la jaula. +# ⚠ 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: SIN OSC, Y NO ES UN OLVIDO ════════════════════════════════════════════════════════════ +# ══ 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. 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. +# 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 @@ -98,7 +104,7 @@ 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" +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=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" @@ -108,7 +114,7 @@ install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson ins [deps] build = [ "meson", "samurai", "python3", "pkgconf", "linux-headers", - "ffmpeg", "libplacebo", "libass", "libunibreak", + "ffmpeg", "libplacebo", "libass", "libunibreak", "lua5.2", "mesa", "libdrm", "wayland", "wayland-protocols", "libxkbcommon", "alsa-lib", "freetype", "fribidi", "harfbuzz", "fontconfig",