# htop 3.5.1 — monitor de procesos interactivo. Etapa G, tier-2 C. Consumidor TUI canónico de # ncurses: valida la capa CURSES real (ventanas/teclado/colores), no sólo el lookup de terminfo de less. # # Importada de Alpine aports (release tarball, trae configure). Ajustes: # - deps.build = ["ncurses", "linux-headers"]: htop usa la API de curses widec (-lncursesw) y headers # de Linux (taskstats/cgroup). Quito lm-sensors del makedepends de Alpine: el soporte de sensores # es OPCIONAL (libsensors auto-detectado) y no está en el corpus ⇒ `--disable-sensors` explícito. # - compiler=zig-cc (migrado de gcc, matar-gcc 2026-07-16) (gueto, igual que ncurses/less): zig-cc miscompila estos C clásicos. # - link=static + sin libtool en el link del binario ⇒ LDFLAGS=-static del lab basta (htop static-pie). # htop auto-detecta ncursesw (widec) para soporte unicode — la ncurses del corpus es widec. # # $CBUILD/$CHOST los da el lab (build==host ⇒ nativo). name = "htop" version = "3.5.1" license = "GPL-2.0-or-later" [source] tarball = "https://github.com/htop-dev/htop/releases/download/3.5.1/htop-3.5.1.tar.xz" sha256 = "526cecd62870aa8d14d2a79a35ea197e4e2b5317d275b567cee0574b2ddb2e9a" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" # Split de la info de depuración (SDD 23 etapa 4, tanda de HOJAS). Entra en `hash_inputs`. strip_debug = true # `AM_LDFLAGS=-static` en compile Y en install — la QUINTA causa de que `link = "static"` mienta, # y la única que NO es culpa de la receta: `Makefile.am:243` hace `AM_LDFLAGS += -rdynamic` bajo # `if HTOP_LINUX`, y el wrapper de cc del lab (`sandbox.rs:597`) quita el `-static` inyectado ante # `-rdynamic`/`--export-dynamic`/un `.so` en la línea. La regla del wrapper es correcta —`-static` # no puede sostenerse contra un link intrínsecamente dinámico—, pero acá el `-rdynamic` de upstream # es sólo para simbolizar el backtrace del manejador de fallos, no una necesidad de enlace. Con # `-static` el backtrace pierde nombres; es exactamente lo que `link = "static"` ya pedía. # Resultado sin esto: `-lncursesw` resolvía a la `libncursesw.so.6` DEL ROOTFS de Alpine — una # entrada no declarada, que es lo que el audit destapó (2026-08-31, 4 mintiendo). # En `install` no es opcional: si `make install` relinkea sin el override, devuelve el binario # dinámico y el arreglo se pierde (la lección de `parted`). # Seguro porque el ÚNICO `dlopen` del árbol está en `linux/LibSensors.c` y acá va `--disable-sensors`; # delayacct (que usaría libnl) queda en `no` por no estar libnl en `[deps]`. [build.phases] configure = "./configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --enable-cgroup --enable-taskstats --disable-sensors" compile = "make -j\"$(nproc)\" AM_LDFLAGS=-static" install = "make DESTDIR=/out install AM_LDFLAGS=-static" [deps] build = ["binutils", "ncurses", "linux-headers", "make"]