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 1430Shell 145Markdown 87Rust 852973 Definiciones

⎇ 1ca210a311ecd2a8f8cd6db07b68853b34b27e99 recipes/bash.toml TOML · 85 líneas · 4.0 KB Historia crudo

takana etapa 5a: los comentarios de las 741 recetas e852f4849 · Sergio ·

1# Importada de Alpine aports por `takana import-alpine` (Etapa G). PUNTO DE PARTIDA — pero
2# YA trae los parches de musl de Alpine (lo que un import de nix pierde). Adaptada al tarball
3# limpio de GNU (5.3 base, sin los parches upstream), build estático musl.
4name    = "bash"
5version = "5.3"
6license = "GPL-3.0-or-later"
7
8[source]
9tarball = "https://ftp.gnu.org/gnu/bash/bash-5.3.tar.gz"
10sha256  = "0d5cd86965f869a26cf64f4b71be7b96f90a3ba8b3d74e27e8e9d9d5550f31ba"
11
12[build]
13compiler = "zig-cc"
14target   = "x86_64-linux-musl"
15link     = "static"
16
17# Split de la info de depuración (SDD 23 etapa 4, tanda de HOJAS). Entra en `hash_inputs`.
18strip_debug = true
19flags    = []
20
21# ── POR QUÉ ESTÁTICO, Y QUÉ CUESTA (audit 2026-08-31) ─────────────────────────────────────────
22# La receta decía `link = "static"` y el binario salía DINÁMICO contra `libncursesw.so.6` y
23# `libc.so`. No era purismo: **NINGÚN artefacto del corpus provee esas dos** —el de `ncurses` sólo
24# empaqueta `.a`— así que el bash sellado sólo corría dentro del sandbox de Alpine y **no dentro de
25# una imagen de takana**, estando en los perfiles `base`, `cli`, `escritorio-cosmic` y
26# `escritorio-sway`. Un shell del sistema base que no arranca en el sistema base.
27#
28# EVIDENCIA de que no arrancaba, ejecutando el binario sellado anterior en el host:
29#     Error relocating /lib/libncursesw.so.6: __vfprintf_chk: symbol not found
30# El mismo síntoma que curl en su día. El nuevo sale `statically linked`, dice
31# `5.3.0(1)-release (x86_64-pc-linux-musl)` y pasa arrays, asociativos, aritmética, sustitución
32# de comandos y `=~`.
33#
34# ⚠ EL PRECIO, medido: **el artefacto pasa de 122 a 16 ficheros**. No es una pérdida accidental
35# sino el acoplamiento de upstream: `configure.ac:981` salta `AC_CHECK_LIB(dl, dlopen)` y
36# `AC_CHECK_FUNCS(dlopen …)` cuando `opt_static_link=yes`, y sin `HAVE_DLOPEN` bash no construye
37# ni instala los ~40 cargables de `usr/lib/bash/` (`enable -f`), sus 62 headers de
38# `usr/include/bash/`, ni `usr/lib/pkgconfig/bash.pc`. Es correcto: **un binario estático no puede
39# `dlopen`**, así que instalarlos sería publicar una capacidad que no existe — el fallo silencioso
40# de CLAUDE.md §3. Y lo que se pierde no funcionaba igual: dinámico no eran «cargables que
41# funcionan», era «un bash que no arranca».
42# Nadie depende de ellos: `yupana radio bash` da 0 dependientes directos y 0 transitivos.
43# Si algún día se quieren de vuelta, la decisión es de imagen —bash dinámico + hidratar la `.so`
44# de ncurses— y no de esta línea.
45#
46# Es la misma causa que htop y e2fsprogs, y NO es libtool: es el `-rdynamic` de upstream contra la
47# regla del wrapper. Ver la nota en `compile`.
48[build.phases]
49# de build() de Alpine (traducido; el lab provee $CBUILD/$CHOST — Etapa G Fase 3):
50compile = '''
51_abuild_phase() {
52	./configure \
53		--build=$CBUILD \
54		--host=$CHOST \
55		--prefix=/usr \
56		--bindir=/bin \
57		--mandir=/usr/share/man \
58		--infodir=/usr/share/info \
59		--disable-nls \
60		--enable-readline \
61		--without-bash-malloc \
62		--without-installed-readline \
63		--enable-static-link
64	# parallel build workarounds
65	# `LOCAL_LDFLAGS=`: `configure.ac:1223` pone `LOCAL_LDFLAGS=-rdynamic` en linux*, y el wrapper
66	# de cc del lab (`sandbox.rs:597`) tira el `-static` inyectado ante `-rdynamic` ⇒ bash salía
67	# DINÁMICO contra `libncursesw.so.6` y `libc.so`. **`--enable-static-link` SOLO NO ALCANZA**:
68	# pone `STATIC_LD=-static` (`Makefile.in:170`) pero queda en la misma línea que el `-rdynamic`
69	# de `BASE_LDFLAGS`, y el wrapper mira la línea entera. Van los dos.
70	make y.tab.c && make builtins/libbuiltins.a && make LOCAL_LDFLAGS=
71}
72_abuild_phase
73'''
74# de package() de Alpine (traducido $pkgdir→/out); sin bashrc/profile (ficheros ausentes):
75install = '''
76_abuild_phase() {
77	mkdir -p "/out"/etc/bash
78	make DESTDIR="/out" install LOCAL_LDFLAGS=
79	rm -rf "/out"/usr/share/locale
80}
81_abuild_phase
82'''
83
84[deps]
85build = ["binutils", "ncurses", "readline", "linux-headers", "make"]