`targets.toml` declaraba `chrony`, `cronie` y `logrotate` como raíces del perfil `servidor` con el
motivo escrito al lado, y ninguna tenía receta: el grafo las contaba como `wanted` y ésa era toda la
deuda que le quedaba al perfil. Ahora sellan las cuatro (popt es la hoja que `logrotate` exige:
incluye `<popt.h>` en la primera pantalla y su configure aborta sin él).
servidor 97/97 → 101/101 listo, falta 0. `wanted` desaparece de los totales.
Lo que se midió, no se supuso:
· logrotate estático, CERO NEEDED, corre, y las rutas de gzip quedan en `/bin` — que es donde
busybox las deja de verdad; el default de upstream en Linux es `/usr/bin/gzip`, que en esta
distro NO EXISTE y habría fallado en runtime diciendo «no se pudo comprimir».
· chrony `+CMDMON +REFCLOCK +RTC +PRIVDROP +IPV6`; `cap_set_proc` está en el ELF, o sea que
libcap entró de verdad y chronyd suelta privilegios. Sale `-NTS -SECHASH` a propósito: NTS
necesita nettle o gnutls y ninguna está en el corpus.
· cronie los cuatro binarios estáticos sin NEEDED, con inotify dentro, y `/bin/vi` pineado.
**El hilo que recorre las tres recetas es el mismo, y es el que valía la pena escribir:** los tres
`configure` DECIDEN MIRANDO EL LAB. `logrotate` trae `--with-selinux/--with-acl` en `[default=check]`;
`chrony` prueba nettle, gnutls, libcap, seccomp y editline; `cronie` resuelve el editor de
`crontab -e` con `AC_PATH_PROG([vi])` y lo graba en el binario. El lab NO entra en `hash_inputs` ⇒
dos labs distintos sellarían bytes distintos en la MISMA dirección del store y nada lo notaría.
Cada palanca va fijada en la receta —que sí entra en el hash— para que sea una decisión y no un
accidente del entorno.
Y una anotada en vez de tapada: cronie no reemplaza al `crond` de busybox por reflejo (busybox ya lo
pone en `/sbin`); agrega `@reboot`, crontabs por usuario, `/etc/cron.d` y anacron. Cuál va en cada
imagen es decisión de perfil — lo que faltaba era que la opción existiera en el corpus.
40 lines
1.8 KiB
TOML
40 lines
1.8 KiB
TOML
# popt 1.19 — el parser de opciones de línea de comando de rpm. Entra por UNA razón y sólo una:
|
|
# `logrotate` lo exige. Su `logrotate.c` hace `#include <popt.h>` en la primera pantalla y su
|
|
# `configure` aborta sin él; no hay flag para sacarlo ni fallback interno a getopt.
|
|
#
|
|
# Es la hoja de la cadena `logrotate` del perfil `servidor`, que el grafo pedía como `wanted` desde
|
|
# que se escribió `targets.toml` y que nadie había puesto.
|
|
#
|
|
# Tarball de release y no git: el árbol de git NO trae `configure` (lo genera `autoreconf`) y el
|
|
# corpus no tiene autoconf/automake — el mismo motivo por el que entran libmnl, jq y gmp.
|
|
#
|
|
# `--disable-nls`: popt traduce sus mensajes de error con gettext, y el corpus tiene `gettext-tiny`,
|
|
# cuyo `msgfmt` muere con SIGILL en algunos catálogos (los plurales del árabe). No vale la pena
|
|
# arriesgar eso por los mensajes de error de un parser de flags que sólo ve `logrotate`.
|
|
#
|
|
# `link = "static"` y `--disable-shared`: el consumidor es un binario de sistema que queremos
|
|
# monolítico (la estrategia de hidratación primaria). Publicar sólo `.a` evita además que
|
|
# `logrotate` salga con un NEEDED de `libpopt.so.0` que después nadie provea — la familia de fallos
|
|
# de `needed-colgante`.
|
|
name = "popt"
|
|
version = "1.19"
|
|
license = "MIT"
|
|
|
|
[source]
|
|
tarball = "http://ftp.rpm.org/popt/releases/popt-1.x/popt-1.19.tar.gz"
|
|
sha256 = "c25a4838fc8e4c1c8aacb8bd620edb3084a3d63bf8987fdad3ca2758c63240f9"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "static"
|
|
flags = []
|
|
|
|
[build.phases]
|
|
configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --disable-shared --enable-static --disable-nls --disable-rpath'
|
|
compile = 'make -j"$(nproc)"'
|
|
install = "make install DESTDIR=/out && find /out -name '*.la' -delete"
|
|
|
|
[deps]
|
|
build = ["binutils", "busybox", "make", "pkgconf"]
|