# automake 1.17 — el generador de `Makefile.in`. La otra mitad de `autoreconf`. # # Con `autoconf` solo se puede regenerar el `configure` de un proyecto, pero no sus `Makefile.in`: # un árbol que trae `Makefile.am` necesita automake, y `autoreconf -fi` llama a los dos. Ver la nota # larga de `recipes/autoconf.toml` sobre por qué este hueco entra ahora. # # ⚠ **`aclocal` es la pieza que hace que esto sirva de verdad**, y es la que más fácil queda a # medias: recoge las macros de `autoconf`, de `libtool` y de `pkgconf` y las junta en el # `aclocal.m4` del proyecto. Si no encuentra los directorios de macros de sus vecinos, `autoreconf` # falla con un `possibly undefined macro` que no nombra la causa — el error más común y más # desconcertante de la cadena autotools. # # ⇒ Por eso `libtool` y `pkgconf` entran en `runtime` además de `perl`: no son deps de construir # automake, son de que `aclocal` tenga qué recoger cuando alguien lo use en la imagen. name = "automake" version = "1.17" license = "GPL-2.0-or-later" [source] tarball = "https://ftp.gnu.org/gnu/automake/automake-1.17.tar.xz" sha256 = "8920c1fc411e13b90bf704ef9db6f29d540e76d232cb3b2c9f4dc4cc599bd990" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" flags = [] [build.phases] configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc' compile = 'make -j"$(nproc)"' # Mismo criterio que autoconf: se EJECUTA, porque un script de perl con una ruta mal horneada se # sella igual de bien que uno que funciona. install = ''' set -e make install DESTDIR=/out for b in automake aclocal; do [ -x "/out/usr/bin/$b" ] || { echo "automake: falta /usr/bin/$b" >&2; ls /out/usr/bin 2>/dev/null >&2; exit 1; } done # Sus propios ficheros de apoyo (`install-sh`, `missing`, `compile`…): sin ellos, un # `automake --add-missing` no tiene qué copiar y el proyecto no construye. for f in install-sh missing compile depcomp; do [ -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; } done # ⚠ PRUEBA FUNCIONAL — Y ESTA VERSIÓN EXISTE PORQUE LA PRIMERA **SELLÓ UN FALLO**. # # Mi primer intento fue `v=$(… --version 2>&1 | head -1) || exit 1`, y no podía funcionar por dos # razones encadenadas, las dos mías: # # 1. **El estado de una tubería es el del ÚLTIMO comando.** `$(cmd | head -1)` devuelve el estado de # `head`, que siempre sale 0, así que el `||` NUNCA se dispara. Es EXACTAMENTE el error que # cometí horas antes leyendo `$?` después de un pipe y que ya está anotado en la memoria del # repo — repetido el mismo día, en una receta distinta. # 2. **El respaldo buscaba `1.17` y el MENSAJE DE ERROR contiene `1.17`**: el fallo era # `Can't locate Automake/Config.pm in @INC (@INC entries checked: # /usr/share/automake-1.17 …)`, así que el `grep` daba verde sobre el texto del error. # # Resultado: `automake` se selló mientras su propia prueba decía que no arrancaba. # # ⚠ Y la prueba además era INVÁLIDA, que es lo que el fallo escondía: el script hornea su ruta # absoluta (`unshift(@INC, '/usr/share/automake-1.17')`, línea 31) y durante el `install` los # ficheros todavía están en `/out/usr/share/…`, así que el módulo no resuelve **aunque el artefacto # esté perfecto**. Comprobado: `Config.pm` está donde corresponde en el artefacto. ⇒ para probarlo # desde el staging hay que apuntar `PERL5LIB` al directorio de `/out`. # # Las tres cosas arregladas: ejecución y truncado SEPARADOS, `PERL5LIB` puesto, y la versión # comprobada ANCLADA al principio de línea para que no coincida con una ruta dentro de un error. L="/out/usr/share/automake-1.17" [ -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; } sal=$(PERL5LIB="$L" PATH="/out/usr/bin:$PATH" /out/usr/bin/automake --version 2>&1) || { echo "automake: NO ARRANCA — el artefacto está completo y no funciona" >&2 printf '%s\n' "$sal" >&2; exit 1 } v=$(printf '%s\n' "$sal" | head -1) printf '%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; } sal=$(PERL5LIB="$L" PATH="/out/usr/bin:$PATH" /out/usr/bin/aclocal --version 2>&1) || { echo "automake: aclocal NO ARRANCA — es la pieza que junta las macros de autoconf, libtool y pkgconf" >&2 printf '%s\n' "$sal" >&2; exit 1 } a=$(printf '%s\n' "$sal" | head -1) printf '%s\n' "$a" | grep -qE '^aclocal \(GNU automake\) 1\.17' || { echo "automake: aclocal --version inesperado: $a" >&2; exit 1; } echo "automake: $v · $a" ''' [deps] build = ["make", "perl", "m4", "autoconf"] # `aclocal` recoge macros de estos al EJECUTARSE, no al construirse. Ver la nota de arriba. runtime = ["perl", "m4", "autoconf", "libtool", "pkgconf"]