# psmisc 23.7 — `killall`, `pstree`, `fuser`, `prtstat`, `pslog`, `peekfd`. # # ── POR QUÉ ENTRA ─────────────────────────────────────────────────────────────────────────────── # **`procps-ng` NO los trae**, y eso era lo que el plan de botar busybox daba por supuesto hasta que # se midió: `killall killall5 pstree fuser` eran cuatro de los applets que sólo proveía busybox, con # procps-ng declarado en los 7 perfiles. procps-ng da `ps top free kill pgrep pkill pidof uptime # vmstat w watch` — matar por NOMBRE y el árbol de procesos son de este paquete, no de aquél. # # ⚠ `killall5` NO lo trae psmisc: es de sysvinit (`/sbin/killall5`, el «mata todo menos PID 1» que # usan los guiones de apagado). Acá lo cubre arje-zero por FUNCIÓN —es PID 1 y apaga él— así que el # applet se retirará con los indultos, no se reemplaza. Son 3 de los 4, y decirlo así evita que la # tabla vuelva a prometer lo que no hay. # # ── EL DETALLE QUE MUERDE: `-lncurses` no existe acá ──────────────────────────────────────────── # `pstree` pide `tgetent`, y el `configure` la busca por NOMBRE DE LIBRERÍA: `-ltinfo`, `-lncurses`, # `-ltermcap`. Nuestra ncurses es `--enable-widec`, o sea **`libncursesw.a`**, y ninguno de los tres # nombres existe ⇒ `configure: error: Cannot find tinfo, ncurses or termcap libraries`. # # Se probaron dos caminos que NO sirven, y conviene dejarlos escritos para no repetirlos: # · `LIBS=-lncursesw` — el `AC_CHECK_LIB` no pregunta «¿resuelve tgetent?»: **compila un programa # de prueba con `-lncurses`** y mira si enlaza. Otra librería en LIBS no cambia eso. # · `ac_cv_lib_ncurses_tgetent=yes` + `make TERMCAP_LIB=-lncursesw` — la variable de caché sí # salta la prueba, pero después falla el enlace igual: `src_pstree_LDADD = @LIBINTL@ # @TERMCAP_LIB@` se SUSTITUYE en tiempo de configure, así que el Makefile queda con `-lncurses` # LITERAL, no con una referencia a `$(TERMCAP_LIB)`. Sobreescribir esa variable en la línea de # `make` no toca nada. (Medido: `error: unable to find static system library 'ncurses'`.) # # Lo que sí funciona es darle el nombre que busca: un enlace `libncurses.a → libncursesw.a` en un # directorio propio del árbol, y `-L` a ese directorio. Así el `AC_CHECK_LIB` pasa de verdad —sin # mentirle a la caché— y el enlace resuelve contra la ncursesw real. El enlace vive en el scratch # del build, no viaja al artefacto. # # ⚠ Y el `-L` se AÑADE a `$LDFLAGS`, no lo reemplaza. El harness inyecta `LDFLAGS=-static` para las # recetas `link = "static"` (`takana-build/src/lib.rs:285`), así que un `LDFLAGS="-L…"` a secas se # lo come y los seis binarios salen DINÁMICOS sin que nada falle — medido acá: sellaron, `killall` # corría, y `pstree` moría con `Error relocating /lib/libncursesw.so.6` al tomar la librería del # sistema anfitrión. Es la misma forma que [[cgo-sin-baseline-sigill]]: redefinir una variable que # el harness ya puebla pierde en silencio lo que el harness había puesto. name = "psmisc" version = "23.7" license = "GPL-2.0-or-later" [source] tarball = "https://downloads.sourceforge.net/project/psmisc/psmisc/psmisc-23.7.tar.xz" sha256 = "58c55d9c1402474065adae669511c191de374b0871eec781239ab400b907c327" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" flags = [] [deps] build = ["ncurses", "make", "pkgconf"] [build.phases] # `--disable-nls`: musl no trae , y es lo que hace el resto del corpus. # SELinux viene apagado por defecto en este configure (lo dice su configure.ac), no hace falta flag. configure = ''' mkdir -p "$PWD/.compat-ncurses" ln -sf /usr/lib/libncursesw.a "$PWD/.compat-ncurses/libncurses.a" ./configure --build=$CBUILD --host=$CHOST --prefix=/usr \ --disable-nls LDFLAGS="$LDFLAGS -L$PWD/.compat-ncurses" ''' compile = 'make' install = 'make DESTDIR=/out install'