Files
takana/recipes/lua5.2.toml
T
Sergio 032aa02582 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.
2026-09-03 05:07:12 +00:00

91 lines
4.9 KiB
TOML

# 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"]