tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

⎇ 87b6c3020a5285cf1d41ccdf1c8070b53adbcb98 recipes/autoconf.toml TOML · 110 siq'ikuna · 6.4 KB Ñawpa willay ch'uya

autotools al corpus: no para TENERLO, para usarlo de forma REPRODUCIBLE 3bc0724db · Sergio ·

1# autoconf 2.72 — el generador de `configure`. Entra porque su AUSENCIA ya costó trabajo real.
2#
3# ══ POR QUÉ ENTRA AHORA, Y NO «algún día» ══════════════════════════════════════════════════════
4# El censo lo marca en «construcción C clásica», pero el argumento no es la fila del censo: es que
5# **este hueco se pisó tres veces en una sola tarde** (2026-10-20). Cada vez que un paquete publica
6# sólo `configure.ac` y no un tarball de release, el lab no puede construirlo:
7#
8#   · `pcaudiolib`         se salvó usando el asset del release en vez del archive del tag
9#   · `speech-dispatcher`  lo mismo
10#   · `brltty`             lo mismo
11#   · `dotconf`            **NO se salvó**: upstream no publica releases (el asset da 404), así que
12#                          hubo que compilar sus dos `.c` a mano. Funciona, pero es una receta que
13#                          no se parece a ninguna otra del repo
14#
15# O sea que la regla «mirá si publica un tarball de release antes de escribir el autoconf» es una
16# mitigación, no una solución: el día que haga falta un paquete que sólo tenga `configure.ac` y sea
17# más grande que dos ficheros, no hay salida. ⇒ con autoconf en el corpus, `autoreconf -fi` pasa a
18# ser una opción normal.
19#
20# ⚠ **Lo que NO cambia:** las recetas existentes que usan el tarball del release **se quedan como
21# están**. Usar el `configure` que upstream publicó es MÁS reproducible que regenerarlo —el nuestro
22# saldría de nuestra versión de autoconf/automake, que es un input más—, así que esto abre una
23# puerta, no manda rehacer nada.
24#
25# ══ ES BARATO PORQUE `perl` Y `m4` YA ESTÁN ════════════════════════════════════════════════════
26# autoconf es un puñado de scripts de perl más una biblioteca de macros m4; no compila nada. Los dos
27# ya están en el corpus, así que el coste es esta receta y nada más.
28#
29# ⚠ **`m4` y `perl` van también en `[deps] runtime`, y eso NO es redundancia.** autoconf los invoca
30# **al ejecutarse**, no al construirse: sin ellos en la imagen es un script que no puede trabajar —
31# la figura del «subcomando sin driver» que este repo tiene documentada. Un `[deps] build` solo los
32# pondría en el sandbox y los dejaría fuera de la clausura.
33name    = "autoconf"
34version = "2.72"
35license = "GPL-3.0-or-later"
36
37[source]
38tarball = "https://ftp.gnu.org/gnu/autoconf/autoconf-2.72.tar.xz"
39sha256  = "ba885c1319578d6c94d46e9b0dceb4014caafe2490e437a0dbca3f270a223f5a"
40
41[build]
42compiler = "zig-cc"
43target   = "x86_64-linux-musl"
44link     = "static"
45flags    = []
46
47[build.phases]
48configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc'
49compile   = 'make -j"$(nproc)"'
50# ⚠ EL GUARDIÁN CORRE LA HERRAMIENTA DE VERDAD, y es el punto de esta receta.
51#
52# autoconf no es un binario: son scripts de perl con rutas —a `perl`, a `m4`, a su propio
53# directorio de macros— **horneadas al configurar**. Un artefacto puede quedar completo, sellado y
54# reproducible, y ser un script que muere en la primera línea porque su intérprete no está donde
55# dice. Comprobar que los ficheros existen no distingue esos dos casos; ejecutarlo, sí.
56#
57# ⇒ Se genera un `configure` desde un `configure.ac` mínimo y se comprueba que SALGA y que sea un
58# script ejecutable de verdad. Es la prueba de extremo a extremo más corta posible.
59install = '''
60set -e
61make install DESTDIR=/out
62for b in autoconf autoreconf autoheader autom4te autoscan autoupdate ifnames; do
63  [ -x "/out/usr/bin/$b" ] || { echo "autoconf: falta /usr/bin/$b" >&2; ls /out/usr/bin 2>/dev/null >&2; exit 1; }
64done
65n=$(find /out/usr/share/autoconf -name '*.m4*' 2>/dev/null | wc -l)
66[ "$n" -gt 20 ] || { echo "autoconf: sólo $n fichero(s) de macros m4 — sin su biblioteca no puede expandir nada" >&2; exit 1; }
67
68# PRUEBA FUNCIONAL. `AC_INIT`+`AC_OUTPUT` es el `configure.ac` más corto que produce algo.
69#
70# ⚠⚠ **Y LA PRIMERA VERSIÓN DE ESTA PRUEBA ERA INVÁLIDA: usaba los datos DEL LAB.**
71# `bin/autoconf` resuelve su directorio de macros así (líneas 32 y 47-48):
72#
73#     my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '/usr/share/autoconf';
74#     my $autom4te   = $ENV{'AUTOM4TE'} || '/usr/bin/autom4te';
75#     my $trailer_m4 = $ENV{'trailer_m4'} || '/usr/share/autoconf/autoconf/trailer.m4';
76#
77# o sea rutas ABSOLUTAS al destino final. Yo sólo exportaba `AUTOCONF` y `PATH`, así que el script
78# leía `/usr/share/autoconf`… **que EXISTE en el lab**: la imagen base trae `autoconf`,
79# `automake-1.18` y sus macros (medido en `.dev-fs/alpine`). El `configure` que salió era correcto y
80# no probaba nada de NUESTRO artefacto — habría salido igual con `/out` vacío de macros.
81#
82# ⇒ Ahora cada ruta se apunta a `/out` explícitamente. Si el artefacto no es autosuficiente, falla.
83#
84# ⚠ **Y el corolario importa más que esta receta:** cualquier receta que invoque `autoreconf` o
85# `autoconf` SIN fijar estas variables usará **el autoconf del lab**, y el lab **no entra en
86# `hash_inputs`** — o sea que dos labs distintos sellarían bytes distintos y el build parecería
87# correcto en los dos. Es exactamente la razón por la que estas dos recetas entran al corpus: no
88# para «tener autoconf», sino para poder usarlo de forma reproducible.
89t=$(mktemp -d)
90printf 'AC_INIT([prueba],[1])\nAC_OUTPUT\n' > "$t/configure.ac"
91( cd "$t" && env \
92    PATH="/out/usr/bin:$PATH" \
93    AUTOCONF="/out/usr/bin/autoconf" \
94    AUTOM4TE="/out/usr/bin/autom4te" \
95    autom4te_perllibdir="/out/usr/share/autoconf" \
96    AC_MACRODIR="/out/usr/share/autoconf" \
97    trailer_m4="/out/usr/share/autoconf/autoconf/trailer.m4" \
98    /out/usr/bin/autoconf ) || {
99  echo "autoconf: NO PUDO generar un configure usando SÓLO sus propios datos — el artefacto está completo y no es autosuficiente" >&2
100  exit 1
101}
102[ -s "$t/configure" ] || { echo "autoconf: corrió sin error y no dejó ningún ./configure" >&2; ls -la "$t" >&2; exit 1; }
103head -1 "$t/configure" | grep -q '^#!' || { echo "autoconf: el configure generado no empieza por un shebang — no es un script ejecutable" >&2; head -3 "$t/configure" >&2; exit 1; }
104echo "autoconf: 7 herramientas + $n macro(s) + genera un configure de $(wc -l < "$t/configure") líneas"
105'''
106
107[deps]
108build = ["make", "perl", "m4"]
109# Ver la nota de arriba: autoconf los invoca al EJECUTARSE.
110runtime = ["perl", "m4"]