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 188Rust 55Shell 30Markdown 281211 Definiciones

lua5.2 5.2.4: mpv gana el OSC — la barra, las estadísticas y la consola

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.

032aa025828db9862d1aecbb370a3a1444d8a94a · por Sergio · (hace 1 mes) · padre 5b8247407 · ver el árbol en este commit

Delta semántico

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

3 archivos · +122 −20

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",