cmus b3:9a540d4270674ec74679dffbeed11d98796c51801663bde88e87affc041213ab
La primera versión decía `static` y era MENTIRA MEDIBLE: el audit del cron
(docs/state/static-audit.txt, medido 2026-09-12T21:04Z) la marcó — «dice static, es DINÁMICO →
libncursesw.so.6 libc.so» — y dejó el veredicto global en rojo. 715 honestas y las dos nuevas de
ayer mintiendo.
Pero el arreglo NO es hacerlo estático: **cmus no puede serlo**. El artefacto trae cinco plugins
—usr/lib/cmus/ip/{wav,cue,ffmpeg}.so y usr/lib/cmus/op/{alsa,oss}.so— y los abre por dlopen. Un
binario estático no puede abrirlos: quedaría un reproductor que no reproduce nada. Es la misma
razón por la que `sway` va dinámico (dlopea los drivers DRI de mesa).
⇒ `dynamic` es la declaración CORRECTA, no una concesión. Una declaración que el build ignora es
peor que no declarar, porque las herramientas río abajo la creen.
La prueba que decide, y cuesta dos segundos:
find store/<hash>-<nombre> -name '*.so' | wc -l
0 plugins → se puede y se debe ser estático. N plugins → dynamic es lo honesto.
Comprobadas las NEEDED de los plugins contra el corpus con scripts/provee.py, que es la otra mitad:
libasound.so.2 (alsa-lib), libavformat/libavcodec/libswresample .so (ffmpeg) y libncursesw.so.6
(ncurses-shared) los publica el corpus ⇒ no hay NEEDED colgante. Las tres primeras llegan por
[deps] build; ncurses-shared va declarada en runtime desde el commit anterior.
49 lines
3.0 KiB
TOML
49 lines
3.0 KiB
TOML
# cmus 2.12.0 — reproductor de música en terminal. C, con un `configure` PROPIO (no autotools).
|
|
#
|
|
# ── POR QUÉ ENTRA ──────────────────────────────────────────────────────────────────────────────
|
|
# El catálogo cerró el vídeo con `mpv` y no tenía nada para escuchar música: ni reproductor ni
|
|
# gestor de biblioteca. cmus lo cubre en las cuatro imágenes sin tocar ninguna decisión de
|
|
# escritorio — es una TUI, no depende del compositor.
|
|
#
|
|
# ── EL `configure` NO ES AUTOTOOLS, Y ESO CAMBIA LA SINTAXIS ──────────────────────────────────
|
|
# Toma asignaciones `clave=valor`, no `--flags`: `prefix=/usr`, `CONFIG_ALSA=y`. Pasarle
|
|
# `--prefix=/usr` no da un error, lo IGNORA — y el paquete acabaría en /usr/local sin que nada
|
|
# falle. Es el modo de fallo silencioso de siempre, así que va anotado.
|
|
#
|
|
# `CONFIG_PULSE=n`: el corpus tiene `pipewire` (promovida el 2026-09-03) y su capa ALSA
|
|
# (`-Dpipewire-alsa=enabled`), así que la salida ALSA desemboca en PipeWire igual que hace `mpv`.
|
|
# `libpulse` del corpus es la variante con la glib ESTÁTICA adentro y no se quiere en un cliente.
|
|
name = "cmus"
|
|
version = "2.12.0"
|
|
license = "GPL-2.0-only"
|
|
|
|
[source]
|
|
repo = "https://github.com/cmus/cmus"
|
|
commit = "58d34cf9db5c29e01a985a48a9b6947855cb6cc9"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
# ⚠ `dynamic` Y NO ES UNA CONCESIÓN: cmus CARGA SUS FORMATOS POR `dlopen`. El artefacto trae cinco
|
|
# plugins —`usr/lib/cmus/ip/{wav,cue,ffmpeg}.so` y `usr/lib/cmus/op/{alsa,oss}.so`— y un binario
|
|
# estático no puede abrirlos: quedaría un reproductor que no reproduce nada. Es la misma razón por
|
|
# la que `sway` va dinámico (dlopea los drivers DRI de mesa).
|
|
# La primera versión decía `static` y era MENTIRA MEDIBLE: `scripts/static-audit.sh` la marcó
|
|
# («dice static, es DINÁMICO → libncursesw.so.6 libc.so») y dejó el audit del cron en rojo. Una
|
|
# declaración que el build ignora es peor que no declarar, porque las herramientas río abajo la creen.
|
|
link = "dynamic"
|
|
|
|
[build.phases]
|
|
configure = './configure prefix=/usr CONFIG_ALSA=y CONFIG_PULSE=n CONFIG_JACK=n CONFIG_AO=n CONFIG_SNDIO=n CONFIG_ROAR=n CONFIG_FFMPEG=y CONFIG_CDIO=n CONFIG_MPRIS=n'
|
|
compile = 'make'
|
|
install = 'make DESTDIR=/out install'
|
|
|
|
# ⚠ `ncurses-shared` EN RUNTIME, Y SE DESCUBRIÓ CORRIENDO EL BINARIO. El artefacto sale
|
|
# `NEEDED libncursesw.so.6` (el resto —ffmpeg, alsa— sí entra estático, son `.a`), y la `ncurses`
|
|
# canónica del corpus es `--without-shared`: sin declarar la variante `-shared`, la imagen no lleva
|
|
# ese `.so` y cmus muere en el loader. Es exactamente la fuga que el perfil de sway ya pagó con
|
|
# zlib/expat/libffi, y no la ve ningún auditor de recetas — sólo `readelf -d` sobre el artefacto.
|
|
[deps]
|
|
build = ["ncurses", "ffmpeg", "alsa-lib", "pkgconf"]
|
|
runtime = ["ncurses-shared"]
|