diff --git a/docs/plan-botar-busybox.md b/docs/plan-botar-busybox.md index 1dbe0e87..de2f8d3c 100644 --- a/docs/plan-botar-busybox.md +++ b/docs/plan-botar-busybox.md @@ -1215,3 +1215,40 @@ repo que escribe la EXPECTATIVA (este applet debería venir de este paquete) con Es la misma forma que [[subcomando-sin-driver]]: el problema no se ve mirando el artefacto, se ve cruzándolo con lo que alguien prometió que tendría. + +## Segunda tanda: las dos piezas que el plan marcaba TRAER (2026-09-21) + +> **64 applets** sólo-busybox, desde 79. Cinco más, y otra vez sin escribir userland. + +| receta | applets | sello | +|---|---|---| +| `recipes/psmisc.toml` (23.7) | `killall pstree fuser` (+`prtstat pslog`) | `b3:b361bd04…` | +| `recipes/bc.toml` (gavinhoward/bc 7.0.3) | `bc dc` | `b3:050efb84…` | + +**`bc` es gavinhoward/bc y no el de GNU**, y la razón es de cadena: C99 sin dependencias, `bc` **y** +`dc` del mismo árbol, y es el bc de sistema de Alpine y FreeBSD. El de GNU arrastra `ed` y `flex` +como build-deps y su `dc` va en otro paquete. + +⚠ **`killall5` NO lo trae psmisc** — es de sysvinit. Acá lo cubre `arje-zero` por FUNCIÓN (es PID 1 +y apaga él), así que el applet se retira con los indultos en vez de reemplazarse. Son 3 de los 4 que +la tabla prometía, y decirlo así evita que vuelva a prometer lo que no hay. + +### Los dos pisones de psmisc, que enseñan más que el resultado + +**1 · `-lncurses` no existe en este corpus, y hay dos formas de no arreglarlo.** El `configure` de +psmisc busca `tgetent` por NOMBRE de librería (`-ltinfo`, `-lncurses`, `-ltermcap`) y la nuestra es +`--enable-widec`, o sea `libncursesw.a`. Falló primero con `LIBS=-lncursesw` —el `AC_CHECK_LIB` no +pregunta si el símbolo resuelve, **compila un programa de prueba con `-lncurses`**— y falló después +con `ac_cv_lib_ncurses_tgetent=yes` + `make TERMCAP_LIB=-lncursesw`, porque +`src_pstree_LDADD = @TERMCAP_LIB@` se sustituye **en tiempo de configure** y el Makefile queda con +`-lncurses` literal, no con una referencia a la variable. Lo que funciona es darle el nombre que +busca: un enlace `libncurses.a → libncursesw.a` en el scratch y un `-L` a ese directorio. + +**2 · Y ese `-L` se comió el `-static`.** Primera versión: `LDFLAGS="-L$PWD/.compat-ncurses"`. El +harness inyecta `LDFLAGS=-static` para las recetas `link = "static"` +(`takana-build/src/lib.rs:285`), así que reemplazarlo lo pierde. **Los seis binarios sellaron +DINÁMICOS y nada falló**: `killall --version` contestaba bien, y sólo `pstree` —el único que enlaza +ncurses— moría en ejecución con `Error relocating /lib/libncursesw.so.6`, tomando la librería del +anfitrión. Un `file` sobre los binarios lo dice en un segundo; ninguna prueba del build lo iba a +decir. Es [[cgo-sin-baseline-sigill]] otra vez: **redefinir una variable que el harness ya puebla +pierde en silencio lo que el harness había puesto**, y el síntoma aparece lejos. diff --git a/docs/state/busybox-applets.tsv b/docs/state/busybox-applets.tsv index e8b4a1c6..1b6afb3f 100644 --- a/docs/state/busybox-applets.tsv +++ b/docs/state/busybox-applets.tsv @@ -15,7 +15,7 @@ awk awk-DECISION — n/a DECIDIR — gawk (C) y goawk (Go) sellados sin perfil; base32 uutils sellada SIN perfil sin-verificar construida y no viaja en ninguna imagen BASE32 sigue coreutils,uutils 2026-09-21 coreutils,uutils 2026-09-21 base64 uutils sellada SIN perfil sin-verificar construida y no viaja en ninguna imagen BASE64 sigue coreutils,uutils 2026-09-21 coreutils,uutils 2026-09-21 basename uutils sellada SIN perfil sin-verificar construida y no viaja en ninguna imagen BASENAME sigue coreutils,uutils 2026-09-21 coreutils,uutils 2026-09-21 -bc bc-TRAER — n/a TRAER — no hay receta bc BC sigue SOLO-BUSYBOX 2026-09-21 SOLO-BUSYBOX 2026-09-21 +bc bc-TRAER — n/a TRAER — no hay receta bc BC sigue bc 2026-09-21 bc 2026-09-21 beep BORRAR — n/a BORRAR — sale del defconfig, no se reemplaza BEEP RETIRADO n/a (retirado) n/a (retirado) blkdiscard util-linux sellada+perfil sin-verificar base,cli,escritorio-cosmic,escritorio-gnome,escritorio-kde,escritorio-sway,servidor BLKDISCARD sigue util-linux 2026-09-21 util-linux 2026-09-21 blkid util-linux sellada+perfil sin-verificar base,cli,escritorio-cosmic,escritorio-gnome,escritorio-kde,escritorio-sway,servidor BLKID sigue e2fsprogs,util-linux 2026-09-21 e2fsprogs,util-linux 2026-09-21 @@ -51,7 +51,7 @@ cryptpw shadow sellada+perfil NO-drop-in shadow no lo trae CRYPTPW sigue SOLO-BU cttyhack getty-ESCRIBIR — n/a ESCRIBIR — hoy la card de getty ejecuta /bin/busybox (lib.rs:429) CTTYHACK sigue SOLO-BUSYBOX 2026-09-21 SOLO-BUSYBOX 2026-09-21 cut uutils sellada SIN perfil sin-verificar construida y no viaja en ninguna imagen CUT sigue coreutils,uutils 2026-09-21 coreutils,uutils 2026-09-21 date uutils sellada SIN perfil sin-verificar construida y no viaja en ninguna imagen DATE sigue coreutils,uutils 2026-09-21 coreutils,uutils 2026-09-21 -dc bc-TRAER — n/a TRAER — no hay receta bc DC sigue SOLO-BUSYBOX 2026-09-21 SOLO-BUSYBOX 2026-09-21 +dc bc-TRAER — n/a TRAER — no hay receta bc DC sigue bc 2026-09-21 bc 2026-09-21 dd uutils sellada SIN perfil sin-verificar construida y no viaja en ninguna imagen DD sigue coreutils,uutils 2026-09-21 coreutils,uutils 2026-09-21 deallocvt kbd sellada+perfil sin-verificar base,cli,escritorio-cosmic,escritorio-gnome,escritorio-kde,escritorio-sway,servidor DEALLOCVT sigue kbd 2026-09-21 kbd 2026-09-21 delgroup shadow sellada+perfil NO-drop-in shadow da groupdel DELGROUP sigue SOLO-BUSYBOX 2026-09-21 SOLO-BUSYBOX 2026-09-21 @@ -107,7 +107,7 @@ fsync BORRAR — n/a BORRAR — sale del defconfig, no se reemplaza FSYNC RETIRA ftpd BORRAR — n/a BORRAR — sale del defconfig, no se reemplaza FTPD RETIRADO n/a (retirado) n/a (retirado) ftpget BORRAR — n/a BORRAR — sale del defconfig, no se reemplaza FTPGET RETIRADO n/a (retirado) n/a (retirado) ftpput BORRAR — n/a BORRAR — sale del defconfig, no se reemplaza FTPPUT RETIRADO n/a (retirado) n/a (retirado) -fuser psmisc-TRAER — n/a TRAER — no hay receta psmisc; procps-ng NO trae killall/pstree FUSER sigue SOLO-BUSYBOX 2026-09-21 SOLO-BUSYBOX 2026-09-21 +fuser psmisc-TRAER — n/a TRAER — no hay receta psmisc; procps-ng NO trae killall/pstree FUSER sigue psmisc 2026-09-21 psmisc 2026-09-21 getopt util-linux sellada+perfil sin-verificar base,cli,escritorio-cosmic,escritorio-gnome,escritorio-kde,escritorio-sway,servidor GETOPT sigue util-linux 2026-09-21 util-linux 2026-09-21 getty getty-ESCRIBIR — n/a ESCRIBIR — hoy la card de getty ejecuta /bin/busybox (lib.rs:429) GETTY sigue SOLO-BUSYBOX 2026-09-21 SOLO-BUSYBOX 2026-09-21 grep grep-posix — n/a ESCRIBIR — CLI POSIX sobre grep-searcher/grep-regex de ripgrep; `grep` GNU (sellado, sin perfil) como puente GREP sigue grep 2026-09-21 grep 2026-09-21 @@ -154,7 +154,7 @@ iprule iproute2 sellada+perfil sin-verificar base,cli,escritorio-cosmic,escritor iptunnel iproute2 sellada+perfil sin-verificar base,cli,escritorio-cosmic,escritorio-gnome,escritorio-kde,escritorio-sway,servidor IPTUNNEL sigue SOLO-BUSYBOX 2026-09-21 SOLO-BUSYBOX 2026-09-21 kbd_mode kbd sellada+perfil sin-verificar base,cli,escritorio-cosmic,escritorio-gnome,escritorio-kde,escritorio-sway,servidor KBD_MODE sigue kbd 2026-09-21 kbd 2026-09-21 kill uutils sellada SIN perfil sin-verificar construida y no viaja en ninguna imagen KILL sigue coreutils,procps-ng,util-linux,uutils 2026-09-21 coreutils,procps-ng,util-linux,uutils 2026-09-21 -killall psmisc-TRAER — n/a TRAER — no hay receta psmisc; procps-ng NO trae killall/pstree KILLALL sigue SOLO-BUSYBOX 2026-09-21 SOLO-BUSYBOX 2026-09-21 +killall psmisc-TRAER — n/a TRAER — no hay receta psmisc; procps-ng NO trae killall/pstree KILLALL sigue psmisc 2026-09-21 psmisc 2026-09-21 killall5 psmisc-TRAER — n/a TRAER — no hay receta psmisc; procps-ng NO trae killall/pstree KILLALL5 sigue SOLO-BUSYBOX 2026-09-21 SOLO-BUSYBOX 2026-09-21 klogd hammerd sellada SIN perfil sin-verificar construida y no viaja en ninguna imagen KLOGD RETIRADO n/a (retirado) n/a (retirado) last util-linux sellada+perfil sin-verificar base,cli,escritorio-cosmic,escritorio-gnome,escritorio-kde,escritorio-sway,servidor LAST sigue util-linux 2026-09-21 util-linux 2026-09-21 @@ -247,7 +247,7 @@ printenv uutils sellada SIN perfil sin-verificar construida y no viaja en ningun printf uutils sellada SIN perfil sin-verificar construida y no viaja en ninguna imagen PRINTF sigue coreutils,uutils 2026-09-21 coreutils,uutils 2026-09-21 ps procps-ng sellada+perfil sin-verificar base,cli,escritorio-cosmic,escritorio-gnome,escritorio-kde,escritorio-sway,servidor PS sigue procps-ng 2026-09-21 procps-ng 2026-09-21 pscan BORRAR — n/a BORRAR — sale del defconfig, no se reemplaza PSCAN RETIRADO n/a (retirado) n/a (retirado) -pstree psmisc-TRAER — n/a TRAER — no hay receta psmisc; procps-ng NO trae killall/pstree PSTREE sigue SOLO-BUSYBOX 2026-09-21 SOLO-BUSYBOX 2026-09-21 +pstree psmisc-TRAER — n/a TRAER — no hay receta psmisc; procps-ng NO trae killall/pstree PSTREE sigue psmisc 2026-09-21 psmisc 2026-09-21 pwd uutils sellada SIN perfil sin-verificar construida y no viaja en ninguna imagen PWD sigue coreutils,uutils 2026-09-21 coreutils,uutils 2026-09-21 pwdx procps-ng sellada+perfil sin-verificar base,cli,escritorio-cosmic,escritorio-gnome,escritorio-kde,escritorio-sway,servidor PWDX sigue procps-ng 2026-09-21 procps-ng 2026-09-21 raidautorun BORRAR — n/a BORRAR — sale del defconfig, no se reemplaza RAIDAUTORUN RETIRADO n/a (retirado) n/a (retirado) diff --git a/docs/state/targets.toml b/docs/state/targets.toml index 60d5ad86..4cb5e37a 100644 --- a/docs/state/targets.toml +++ b/docs/state/targets.toml @@ -134,6 +134,13 @@ paquetes = [ # así que el único `xz` de la imagen era el applet de busybox. Ampliar la canónica re-hashearía # a sus 14 consumidores; va como variante, igual que `zstd-cli`. "xz-tools", + # `psmisc` y `bc` (2026-09-21): las dos piezas que el censo marcaba como TRAER, y ninguna estaba + # en el corpus. `psmisc` da `killall pstree fuser prtstat pslog` — y esto es lo que el plan daba + # por cubierto y no lo estaba: **`procps-ng` NO los trae**. procps-ng es `ps top free kill pgrep + # pkill pidof uptime vmstat w watch`; matar por NOMBRE y el árbol de procesos son de psmisc. + # `bc` es gavinhoward/bc: `bc` Y `dc` del mismo árbol, C99 sin dependencias, el que usan Alpine y + # FreeBSD. La alternativa de GNU arrastra `ed` y `flex`, y su `dc` va en otro paquete. + "psmisc", "bc", ] [perfil.cli] diff --git a/recipes/bc.toml b/recipes/bc.toml new file mode 100644 index 00000000..6cbcea0b --- /dev/null +++ b/recipes/bc.toml @@ -0,0 +1,39 @@ +# bc 7.0.3 (gavinhoward/bc) — la calculadora POSIX: `bc` Y `dc` en un solo árbol, sin dependencias. +# +# ── POR QUÉ ESTA IMPLEMENTACIÓN Y NO LA DE GNU ────────────────────────────────────────────────── +# El corpus no tenía ninguna: `bc` y `dc` eran dos de los applets que en toda la imagen sólo proveía +# busybox (medido con `scripts/busybox-censo-proveedores.py`, ver `docs/plan-botar-busybox.md`). +# Upstream hay dos candidatos reales: +# · GNU bc — arrastra `ed` y `flex` como build-deps, y `dc` es OTRO paquete (dc de GNU va aparte). +# · gavinhoward/bc — C99 puro, CERO dependencias, `bc` + `dc` del mismo árbol, y es el que usan +# Alpine y FreeBSD como su bc de sistema. Implementa POSIX bc + las extensiones de GNU. +# Para una cadena musl donde cada dep nueva es trabajo, la segunda gana sin discusión. +# +# ── BUILD ─────────────────────────────────────────────────────────────────────────────────────── +# No es autotools: `configure.sh` propio que escribe el Makefile. No acepta `--build`/`--host`, así +# que NO se le pasan (un `--host` a un configure que no lo entiende termina en la lista de +# argumentos ignorados o en un error, según el script). El cross a musl lo hace `zig cc` vía $CC. + +name = "bc" +version = "7.0.3" +license = "BSD-2-Clause" + +[source] +tarball = "https://github.com/gavinhoward/bc/releases/download/7.0.3/bc-7.0.3.tar.xz" +sha256 = "91eb74caed0ee6655b669711a4f350c25579778694df248e28363318e03c7fc4" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "static" +flags = [] + +[deps] +build = ["make"] + +[build.phases] +# `-p bc -p dc` NO existe acá: el binario es multicall por enlaces, como busybox. `PREFIX` en vez de +# `--prefix` porque así lo quiere su configure.sh. +configure = './configure.sh --prefix=/usr --disable-nls' +compile = 'make' +install = 'make DESTDIR=/out install' diff --git a/recipes/psmisc.toml b/recipes/psmisc.toml new file mode 100644 index 00000000..817f3c07 --- /dev/null +++ b/recipes/psmisc.toml @@ -0,0 +1,67 @@ +# 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'