From 35f83748f965b609cebcf46e2c1418f1e74748b0 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Sep 2026 01:14:18 +0000 Subject: [PATCH] =?UTF-8?q?receta:=20cmus=20va=20`link=20=3D=20"dynamic"`?= =?UTF-8?q?=20=E2=80=94=20carga=20sus=20formatos=20por=20dlopen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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/- -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. --- recipes/cmus.toml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/recipes/cmus.toml b/recipes/cmus.toml index 5398e12d..c9f041ac 100644 --- a/recipes/cmus.toml +++ b/recipes/cmus.toml @@ -24,7 +24,14 @@ commit = "58d34cf9db5c29e01a985a48a9b6947855cb6cc9" [build] compiler = "zig-cc" target = "x86_64-linux-musl" -link = "static" +# ⚠ `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'