Files
SergioandClaude Opus 5 466972e301 busybox: 79 → 69 applets sin otro dueño, y ninguno de los diez costó escribir userland
Cuatro artefactos sellados y el paso 2 del plan cerrado. Los diez applets que
dejan de depender de busybox salieron de arreglar recetas, no de escribir código:

  xz unxz xzcat lzma unlzma lzcat  → recipes/xz-tools.toml (nueva, b3:194c7d69…)
  vi                               → un symlink en recipes/vim.toml
  cpio                             → un symlink en recipes/libarchive.toml
  arch hostname                    → los trajo el feature de uutils (b3:614ff653…)

xz-tools es el TERCER caso de la familia de zstd-cli, y eso ya estaba escrito en
targets.toml: «la receta canónica construye sólo lib/ y su artefacto no tiene
usr/bin; declararla no habría arreglado nada». Igual que musl-shared, zlib-shared
y libffi-shared. Cuatro veces la misma forma — la receta publica la lib, la
imagen declara el paquete, y el binario no está. Va como variante porque ampliar
la canónica re-hashearía a sus 14 consumidores.

⚠ xz-tools selló DINÁMICO en la primera corrida pese al link = "static", y
funcionaba: comprimía y descomprimía sin una queja. Es el relink de libtool, que
libarchive.toml y bluez.toml ya documentan — hace falta LDFLAGS=-all-static en
compile Y en install. Lo delató el `file` del binario, no una prueba que fallara.

Paso 2 del plan: uutils, findutils, findutils-xargs, diffutils, gzip, grep y
xz-tools declarados en el perfil `base` — seis recetas que llevaban meses
`sealed` con `perfiles: []`. Hasta hoy, `find`, `xargs`, `diff`, `cmp`, `gzip`,
`zcat` y `grep` en una imagen de takana eran el applet de busybox, no porque
faltara escribirlos sino porque nadie los declaró. `grep` entra como PUENTE
declarado: ripgrep ya viaja pero publica `rg` y no es grep POSIX.

El censo gana modo --guardian, y vigila PÉRDIDAS, no un umbral: un umbral hay
que subirlo cada vez que se retira un applet y a la tercera nadie lo sube con
criterio; que un applet con proveedor medido deje de tenerlo es siempre una
regresión. Probado en los dos sentidos — rc=0 contra /store, rc=1 contra un store
mutilado, nombrando applet y proveedor perdido.

Los cuatro sellaron con el mismo hash en el store tirable y en /store: dos
work_root distintos, bytes idénticos.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 21:34:46 +00:00

64 lines
3.9 KiB
TOML

# xz 5.8.3 — VARIANTE que construye las HERRAMIENTAS de línea de comandos. NO sustituye a
# `recipes/xz.toml`.
#
# ── POR QUÉ EXISTE ──────────────────────────────────────────────────────────────────────────────
# La canónica pasa `--disable-xz --disable-xzdec --disable-lzmadec --disable-lzmainfo
# --disable-scripts`: es liblzma y NADA más, a propósito, porque de ella cuelgan 14 recetas que la
# enlazan. El problema es que `xz` figura en SEIS perfiles y su artefacto tiene el `usr/bin` VACÍO,
# así que **el único `xz` dentro de la imagen es el applet de busybox** — medido el 2026-09-21 con
# `scripts/busybox-censo-proveedores.py`, y es de los seis applets que hoy nadie más provee
# (`xz unxz xzcat lzma unlzma lzcat`). Ver `docs/plan-botar-busybox.md`, §censo de proveedores.
#
# ── POR QUÉ VARIANTE Y NO QUITARLE EL `--disable-xz` A LA CANÓNICA ──────────────────────────────
# Tocar `[build.phases] configure` de `xz.toml` re-hashea el artefacto y con él las 14 recetas que
# lo declaran dep (`appstream dwarves ripgrep-all swayimg maturin wasm-pack trunk fnm dprint dufs
# cargo-deb adwaita-hello sourceview-hello hammer-edit`). El coste no lo paga la funcionalidad que
# se gana. Mismo patrón que `elfutils-libdw` sobre `elfutils` y que `openssl-threads`.
#
# ── LO QUE INSTALA, Y LO QUE SE BORRA A PROPÓSITO ───────────────────────────────────────────────
# Sólo `usr/bin` + sus manpages. La lib y los headers se RETIRAN del artefacto aunque el `make
# install` los genere: si viajaran, al hidratar una imagen que ya lleva `xz` habría dos `liblzma.a`
# y dos `lzma.h` disputándose la misma ruta, y quién gana lo decide el orden de hidratación — que
# es exactamente la clase de cosa que no debe depender del orden. La lib la sigue publicando la
# canónica, que es su dueña.
name = "xz-tools"
version = "5.8.3"
license = "0BSD"
[source]
# Mismo tarball y mismo sha256 que la canónica: es el mismo upstream con otro `configure`.
tarball = "https://github.com/tukaani-project/xz/releases/download/v5.8.3/xz-5.8.3.tar.xz"
sha256 = "fff1ffcf2b0da84d308a14de513a1aa23d4e9aa3464d17e64b9714bfdd0bbfb6"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
[deps]
build = ["make"]
[build.phases]
# Las herramientas vienen habilitadas por defecto; lo que se apaga es lo de siempre (shared, doc) y
# `--disable-nls`, que en musl evita el <libintl.h> que no existe. `--enable-small` NO: cambia el
# rendimiento del descompresor y esto es la herramienta de uso general, no un initramfs.
configure = '''
./configure --build=$CBUILD --host=$CHOST --prefix=/usr \
--disable-shared --enable-static --disable-nls --disable-doc
'''
# ⚠ `LDFLAGS=-all-static` EN COMPILE **Y** EN INSTALL. xz enlaza con libtool, y libtool RELINKEA
# al instalar: sin el flag en las dos fases el `link = "static"` de la receta se ignora **en
# silencio** y los binarios salen dinámicos. Medido acá: la primera corrida selló un `xz` que
# funcionaba (comprime y descomprime) y era `interpreter /lib/ld-musl-x86_64.so.1`. Mismo pisón que
# ya documentan `recipes/libarchive.toml` y `recipes/bluez.toml`; lo verifica `scripts/static-audit.sh`.
compile = 'make LDFLAGS=-all-static'
# `install` completo y después se retiran lib/include/pkgconfig: es más robusto que un
# `make -C src/xz install`, que se saltaría `xzdec`, `lzmainfo` y los scripts (`xzgrep`, `xzdiff`,
# `xzless`, `xzmore`) — que son los que dan `lzcat`/`unlzma`/`unxz` por symlink.
install = '''
make LDFLAGS=-all-static DESTDIR=/out install
rm -rf /out/usr/lib /out/usr/include /out/usr/share/doc
'''