Files
takana/recipes/lua.toml
T
SergioandClaude Opus 5 ca2c164512 sombras: CERO — promover las 6 compartidas al corpus y barrer sus 16 copias
Las 6 que quedaban (fuse3, hwdata, icu4c, libdisplay-info, libelogind, lua) no tenían copia en
el corpus, así que borrar una habría roto su cola: la resolución es sibling-first y después el
catálogo PADRE, nunca una cola hermana. Se promueve una y se barren las 16.

Las 16 eran byte a byte IDÉNTICAS entre sí, con el mismo ArtifactHash — medido con 'hammer hash',
no deducido del nombre. Cada una la comparten entre 2 y 4 imágenes, que es exactamente el
criterio que dejó escrito xkeyboard-config al promoverse: lo que comparten varias imágenes tiene
que vivir en el corpus o no lo alcanzan.

A diferencia de aquella, acá las copias SÍ se barren en el mismo movimiento: sin copia en el
corpus no había dónde caer, y dejarlas sería mantener hasta 4 ficheros que son el mismo hash.

Verificado con la huella de las 1167 recetas antes y después:
  ficheros de receta   1167 → 1157   (16 borradas, 6 promovidas)
  hashes supervivientes  ninguno se movió ⇒ CERO rebuilds
  los cinco grafos       deuda 0, huérfanas [], sellados == recetas
  static-audit           MIENTEN 0 de 690
  duplicados             SOMBRAS REDUNDANTES: 0   ← de 14

⚠ Y una lectura que casi publico mal: mi primera comparación de hashes dijo 'CAMBIÓ ✗' en las
seis. Era el grep de la comparación, que no casaba y dejaba el valor 'antes' vacío — los hashes
nuevos eran idénticos a los medidos minutos antes. Un instrumento roto que grita es tan malo
como uno mudo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 19:47:55 +00:00

107 lines
5.4 KiB
TOML

# ══ PROMOVIDA AL CORPUS DESDE LAS COLAS (2026-09-08) ═══════════════════════════════════════════
# Existía IDÉNTICA byte a byte en 2 colas de escritorio (cosmic,gnome), con el MISMO
# ArtifactHash en todas — verificado con `hammer hash` antes de mover, no deducido del nombre.
# Sube al corpus por la razón que ya escribió `xkeyboard-config`: una receta resuelve sibling-first
# y después el catálogo PADRE, nunca una cola hermana, así que **lo que comparten varias imágenes
# tiene que vivir acá o no lo alcanzan**. Aquí lo comparten 2.
#
# A diferencia de aquella, las copias de las colas SÍ se barren en el mismo movimiento: sin copia en
# el corpus no había dónde caer, y dejarlas sería mantener 2 ficheros que son el mismo hash.
# Cero rebuilds: el hash no se mueve, sólo cambia de dónde lo resuelve cada consumidor.
# lua 5.4.8 — el intérprete y **la librería compartida**, que es lo que hace falta acá.
#
# POR QUÉ ENTRA: `wireplumber` —el gestor de sesión de PipeWire, sin el cual PipeWire acepta clientes
# pero no enumera ni enruta dispositivos— tiene su política escrita EN LUA y embebe un intérprete
# (`lib/wplua`). Su `subprojects/lua.wrap` DESCARGA Lua 5.5 de lua.org, cosa imposible en el sandbox
# hermético (`--wrap-mode=nodownload`), así que va con `-Dsystem-lua=true` y el sistema tiene que
# tener Lua. Su meson acepta 5.5, 5.4 o 5.3 (meson.build:91-95); se elige **5.4**, la serie estable
# larga que usan las distros, en vez de la 5.5 del wrap.
#
# ══ LO QUE ESTA RECETA TIENE QUE INVENTAR, porque upstream no lo da ═════════════════════════════
# 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 las dos cosas, y a mano, porque no hay dónde
# copiarlas de:
#
# 1. `-fPIC` en `MYCFLAGS`. Sin esto la `.a` no es reubicable y `libwplua` —que es un objeto
# compartido— no linkea: es la regla del corpus sobre `.a` no-PIC dentro de un `.so`
# («relocation R_X86_64_32 … recompile with -fPIC»), la misma que obligó a las variantes
# `-shared` de zlib, sqlite, libxml2, libuuid y dbus.
# 2. La `.so` se enlaza a mano desde la `.a` con `--whole-archive`, porque una librería estática sólo
# aporta los objetos que alguien referencia y acá hay que llevárselos TODOS. SONAME
# `liblua-5.4.so.0`, que es el que graba quien enlace.
# 3. El `.pc` se escribe acá. El nombre importa: wireplumber prueba `lua-5.4`, `lua5.4` y `lua54` en
# ese orden, así que el fichero se llama `lua5.4.pc` y ADEMÁS se deja `lua-5.4.pc` y `lua.pc` como
# enlaces — es más barato satisfacer las tres convenciones que adivinar cuál buscará el próximo
# consumidor.
#
# `-DLUA_USE_LINUX` es lo que activa `dlopen` y el resto de POSIX; sin él Lua se compila en modo ANSI
# genérico y `require` de módulos C no funciona. **SIN readline a propósito**: sólo lo usa el REPL
# interactivo, y el ncurses del catálogo es static-only y arrastra `-static` al link (el mismo
# problema que hizo saltar `pw-top` en la receta de pipewire).
#
# `SYSLIBS` pierde el `-Wl,-E` de upstream: exportar todos los símbolos del EJECUTABLE sirve para que
# módulos C cargados por `require` vean la API de Lua, y acá el que exporta es la `.so`.
name = "lua"
version = "5.4.8"
license = "MIT"
[source]
tarball = "https://www.lua.org/ftp/lua-5.4.8.tar.gz"
sha256 = "4f18ddae154e793e46eeab727c59ef1c0c0c2b744e7b94219710d76f530629ae"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
[build.phases]
configure = "true"
compile = '''
set -e
# CC se pasa explícito: el Makefile de Lua lo fija a `gcc -std=gnu99` en la línea 9 y ganaría sobre el
# del entorno.
make -C src all CC="hammer-zig-cc -std=gnu99" \
SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-ldl" MYCFLAGS="-fPIC"
# La .so que upstream no construye. --whole-archive porque de una estática el linker sólo se lleva lo
# referenciado, y acá hay que llevárselo todo.
hammer-zig-cc -shared -o src/liblua-5.4.so.0.0.0 \
-Wl,-soname,liblua-5.4.so.0 \
-Wl,--whole-archive src/liblua.a -Wl,--no-whole-archive -lm
'''
install = '''
set -e
mkdir -p /out/usr/bin /out/usr/lib/pkgconfig /out/usr/include /out/usr/share/man/man1
install -m755 src/lua /out/usr/bin/lua5.4
install -m755 src/luac /out/usr/bin/luac5.4
ln -s lua5.4 /out/usr/bin/lua
ln -s luac5.4 /out/usr/bin/luac
install -m644 src/lua.h src/luaconf.h src/lualib.h src/lauxlib.h src/lua.hpp /out/usr/include/
install -m644 src/liblua.a /out/usr/lib/liblua-5.4.a
install -m755 src/liblua-5.4.so.0.0.0 /out/usr/lib/
ln -s liblua-5.4.so.0.0.0 /out/usr/lib/liblua-5.4.so.0
ln -s liblua-5.4.so.0 /out/usr/lib/liblua-5.4.so
ln -s liblua-5.4.so /out/usr/lib/liblua.so
cat > /out/usr/lib/pkgconfig/lua5.4.pc <<'PC'
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
INTERPRETER=${exec_prefix}/bin/lua5.4
COMPILER=${exec_prefix}/bin/luac5.4
Name: Lua
Description: Lua language engine
Version: 5.4.8
Requires:
Libs: -L${libdir} -llua-5.4 -lm
Cflags: -I${includedir}
PC
# Las tres convenciones de nombre que se usan por ahí; wireplumber prueba lua-5.4, lua5.4 y lua54.
ln -s lua5.4.pc /out/usr/lib/pkgconfig/lua-5.4.pc
ln -s lua5.4.pc /out/usr/lib/pkgconfig/lua54.pc
ln -s lua5.4.pc /out/usr/lib/pkgconfig/lua.pc
'''
[deps]
build = ["make", "pkgconf"]