gioser

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…

⎇ main recipes/automake.toml TOML · 88 lines · 4.9 KB History raw

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

1# automake 1.17 — el generador de `Makefile.in`. La otra mitad de `autoreconf`.
2#
3# Con `autoconf` solo se puede regenerar el `configure` de un proyecto, pero no sus `Makefile.in`:
4# un árbol que trae `Makefile.am` necesita automake, y `autoreconf -fi` llama a los dos. Ver la nota
5# larga de `recipes/autoconf.toml` sobre por qué este hueco entra ahora.
6#
7# ⚠ **`aclocal` es la pieza que hace que esto sirva de verdad**, y es la que más fácil queda a
8# medias: recoge las macros de `autoconf`, de `libtool` y de `pkgconf` y las junta en el
9# `aclocal.m4` del proyecto. Si no encuentra los directorios de macros de sus vecinos, `autoreconf`
10# falla con un `possibly undefined macro` que no nombra la causa — el error más común y más
11# desconcertante de la cadena autotools.
12#
13# ⇒ Por eso `libtool` y `pkgconf` entran en `runtime` además de `perl`: no son deps de construir
14# automake, son de que `aclocal` tenga qué recoger cuando alguien lo use en la imagen.
15name    = "automake"
16version = "1.17"
17license = "GPL-2.0-or-later"
18
19[source]
20tarball = "https://ftp.gnu.org/gnu/automake/automake-1.17.tar.xz"
21sha256  = "8920c1fc411e13b90bf704ef9db6f29d540e76d232cb3b2c9f4dc4cc599bd990"
22
23[build]
24compiler = "zig-cc"
25target   = "x86_64-linux-musl"
26link     = "static"
27flags    = []
28
29[build.phases]
30configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc'
31compile   = 'make -j"$(nproc)"'
32# Mismo criterio que autoconf: se EJECUTA, porque un script de perl con una ruta mal horneada se
33# sella igual de bien que uno que funciona.
34install = '''
35set -e
36make install DESTDIR=/out
37for b in automake aclocal; do
38  [ -x "/out/usr/bin/$b" ] || { echo "automake: falta /usr/bin/$b" >&2; ls /out/usr/bin 2>/dev/null >&2; exit 1; }
39done
40# Sus propios ficheros de apoyo (`install-sh`, `missing`, `compile`…): sin ellos, un
41# `automake --add-missing` no tiene qué copiar y el proyecto no construye.
42for f in install-sh missing compile depcomp; do
43  [ -n "$(find /out/usr/share -name "$f" 2>/dev/null | head -1)" ] || { echo "automake: falta el fichero de apoyo '$f' — un --add-missing no tendría qué copiar" >&2; exit 1; }
44done
45# ⚠ PRUEBA FUNCIONAL — Y ESTA VERSIÓN EXISTE PORQUE LA PRIMERA **SELLÓ UN FALLO**.
46#
47# Mi primer intento fue `v=$(… --version 2>&1 | head -1) || exit 1`, y no podía funcionar por dos
48# razones encadenadas, las dos mías:
49#
50# 1. **El estado de una tubería es el del ÚLTIMO comando.** `$(cmd | head -1)` devuelve el estado de
51#    `head`, que siempre sale 0, así que el `||` NUNCA se dispara. Es EXACTAMENTE el error que
52#    cometí horas antes leyendo `$?` después de un pipe y que ya está anotado en la memoria del
53#    repo — repetido el mismo día, en una receta distinta.
54# 2. **El respaldo buscaba `1.17` y el MENSAJE DE ERROR contiene `1.17`**: el fallo era
55#    `Can't locate Automake/Config.pm in @INC (@INC entries checked:
56#    /usr/share/automake-1.17 …)`, así que el `grep` daba verde sobre el texto del error.
57#
58# Resultado: `automake` se selló mientras su propia prueba decía que no arrancaba.
59#
60# ⚠ Y la prueba además era INVÁLIDA, que es lo que el fallo escondía: el script hornea su ruta
61# absoluta (`unshift(@INC, '/usr/share/automake-1.17')`, línea 31) y durante el `install` los
62# ficheros todavía están en `/out/usr/share/…`, así que el módulo no resuelve **aunque el artefacto
63# esté perfecto**. Comprobado: `Config.pm` está donde corresponde en el artefacto. ⇒ para probarlo
64# desde el staging hay que apuntar `PERL5LIB` al directorio de `/out`.
65#
66# Las tres cosas arregladas: ejecución y truncado SEPARADOS, `PERL5LIB` puesto, y la versión
67# comprobada ANCLADA al principio de línea para que no coincida con una ruta dentro de un error.
68L="/out/usr/share/automake-1.17"
69[ -f "$L/Automake/Config.pm" ] || { echo "automake: falta $L/Automake/Config.pm — es el módulo que el script añade a @INC" >&2; find /out -name 'Config.pm' >&2; exit 1; }
70sal=$(PERL5LIB="$L" PATH="/out/usr/bin:$PATH" /out/usr/bin/automake --version 2>&1) || {
71  echo "automake: NO ARRANCA — el artefacto está completo y no funciona" >&2
72  printf '%s\n' "$sal" >&2; exit 1
73}
74v=$(printf '%s\n' "$sal" | head -1)
75printf '%s\n' "$v" | grep -qE '^automake \(GNU automake\) 1\.17' || { echo "automake: --version no empieza por 'automake (GNU automake) 1.17': $v" >&2; exit 1; }
76sal=$(PERL5LIB="$L" PATH="/out/usr/bin:$PATH" /out/usr/bin/aclocal --version 2>&1) || {
77  echo "automake: aclocal NO ARRANCA — es la pieza que junta las macros de autoconf, libtool y pkgconf" >&2
78  printf '%s\n' "$sal" >&2; exit 1
79}
80a=$(printf '%s\n' "$sal" | head -1)
81printf '%s\n' "$a" | grep -qE '^aclocal \(GNU automake\) 1\.17' || { echo "automake: aclocal --version inesperado: $a" >&2; exit 1; }
82echo "automake: $v · $a"
83'''
84
85[deps]
86build = ["make", "perl", "m4", "autoconf"]
87# `aclocal` recoge macros de estos al EJECUTARSE, no al construirse. Ver la nota de arriba.
88runtime = ["perl", "m4", "autoconf", "libtool", "pkgconf"]