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 1574Shell 204Rust 111Markdown 993763 Definiciones

⎇ main recipes/ncurses-terminfo.toml TOML · 132 líneas · 8.0 KB Historia crudo

terminfo: la base de datos entra al corpus — sin ella el backspace de zsh no borra 3ea48d283 · Sergio ·

1# ncurses 6.5 — VARIANTE con la BASE DE DATOS terminfo: `/usr/share/terminfo` (~2900 entradas).
2# NO sustituye a `recipes/ncurses.toml` ni a `recipes/ncurses-tools.toml`.
3#
4# ── POR QUÉ EXISTE: la premisa de los fallbacks era una ETIQUETA, no un hecho ────────────────────
5# `ncurses-tools.toml` dice, en su propia cabecera, que omitir `install.data` es deliberado porque
6# los nueve `--with-fallbacks` COMPILADOS dentro de la librería —linux, vt100, vt220, xterm,
7# xterm-256color, screen, tmux, tmux-256color, ansi— cubren «la consola del metal, QEMU y cualquier
8# ssh desde un emulador moderno». La decisión era razonable; **la premisa es falsa, y está medida**
9# (anfitrión `takana`, 2026-09-23, antes de este cambio):
10#
11#     $ TERM=xterm-256color zsh -f -c 'zmodload zsh/terminfo; echo ${#terminfo}'
12#     0
13#
14# Cero capacidades para `xterm-256color`, que es UNO DE LOS NUEVE PINEADOS. O sea: el fallback
15# compilado NO llega. `strings /bin/zsh | grep -c '^xterm-256color$'` ⇒ **0**; la tabla de
16# fallbacks no viaja dentro del zsh estático. **La causa exacta NO está determinada** y conviene
17# decirlo así en vez de inventarla: lo medido es que la base no está y el fallback no suple.
18#
19# ── LO QUE ROMPÍA, QUE NO SE PARECE A «falta terminfo» ──────────────────────────────────────────
20# El síntoma no se lee como un problema de base de datos: se lee como una fuente rota y un teclado
21# roto. Reproducido byte a byte en un pty real contra el zsh del anfitrión:
22#
23#   · BACKSPACE. Sin `cub1`, zle no sabe mover el cursor a la izquierda. Al borrar emitía un
24#     ESPACIO SUELTO en vez de `\b \b`, así que el carácter no se borraba y el hueco se corría a
25#     la derecha:
26#
27#         hoy        echo hola + ' '        ⇒ un espacio que avanza, no borra
28#         con base   echo hola + \b \b      ⇒ borra
29#
30#   · EL PROMPT. Un `?` espurio pegado delante de cada glifo del tema (el `➜` de robbyrussell):
31#
32#         hoy        \x1b[01;32m ? \xe2\x9e\x9c     ⇒ se ve  ?➜
33#         con base   \x1b[01;32m   \xe2\x9e\x9c     ⇒ se ve   ➜
34#
35#   · Flechas, Home y TAB inertes: sin `kcuu1`/`khome` zle no tiene qué bindear.
36#
37# ⚠ **El CONTROL importa acá**, porque las dos causas plausibles se prueban a la vez y es fácil
38# acreditarle el arreglo a la equivocada (el anfitrión es musl y `LANG` viene VACÍO, así que «es el
39# locale» es la respuesta que uno quiere dar):
40#
41#     sólo LANG=C.UTF-8      ⇒ SIGUE ROTO: backspace ' ', prompt ?➜
42#     sólo la base terminfo  ⇒ ARREGLADO:  backspace \b \b, prompt ➜     ← es esto, y sólo esto
43#
44# Y el locale no era sospechoso sin motivo: musl contesta `CODESET=UTF-8` y `MULTIBYTE=on` aun con
45# `LANG` vacío, o sea que esa pista estaba bien desde el principio.
46#
47# ── POR QUÉ UNA RECETA NUEVA Y NO UN PARCHE A LA CANÓNICA ───────────────────────────────────────
48# `ncurses.toml` tiene **18 dependientes**: moverle el `install` los re-hashea a todos y a su
49# cascada, para agregar unos megas de datos que la mayoría no mira. Va como variante, que es el
50# patrón que el repo ya usa para esto mismo — `ncurses-tools` sobre `ncurses`, `xz-tools` sobre
51# `xz`, `zstd-cli` sobre `zstd`. Esta receta no re-hashea NADA.
52#
53# ── EL PESO, QUE ES EL ARGUMENTO HONESTO EN CONTRA ──────────────────────────────────────────────
54# Son ~7,5 M y ~2900 entradas, de las que cualquier máquina usa tres. Es mucho para lo que se usa, y
55# por eso la decisión original de omitirlo no era un descuido. Pero el recorte correcto es elegir
56# QUÉ entradas viajan (un `--with-fallbacks` que de verdad llegue, o instalar un subconjunto), no
57# quedarse sin ninguna: **sin base, una terminal interactiva no funciona**, y falla de una forma
58# que nadie asocia con ncurses. Recortar el set es su propia unidad de trabajo.
59
60# ── ⚠ PUNTO DE PARTIDA, NO SELLADA ────────────────────────────────────────────────
61# Escrita en el hub el 2026-09-23 y **NO CONSTRUIDA**: en este árbol `takana hash` muere con
62# `io: No such file or directory (os error 2)` para CUALQUIER receta, incluidas las ya selladas
63# (`zlib`, `bzip2`, `xz`, `ncurses-tools`), con y sin `TAKANA_LAB=/work/dev-fs`. O sea que el fallo
64# es del entorno de build del hub, no de esta receta — pero tampoco se pudo descartar por medición.
65# El primer build va en el worker, y las trampas que ya se conocen están anotadas arriba.
66#
67# Mientras tanto el anfitrión lleva la base COPIADA A MANO en `/usr/share/terminfo` (7,5 M, 2899
68# entradas, del rootfs Arch de la jaula). Eso está FUERA DEL STORE: se pierde si la imagen se
69# rehace, y nada va a fallar cuando se pierda — simplemente el backspace vuelve a romperse. Esta
70# receta existe para que ese parche deje de hacer falta.
71
72name    = "ncurses-terminfo"
73version = "6.5"
74license = "MIT"
75
76[source]
77tarball = "https://ftp.gnu.org/gnu/ncurses/ncurses-6.5.tar.gz"
78sha256  = "136d91bc269a9a5785e5f9e980bc76ab57428f604ce3e5a5a90cebc767971cc6"
79
80[build]
81compiler = "zig-cc"
82target   = "x86_64-linux-musl"
83link     = "static"
84
85# El artefacto son DATOS: no hay ELF que partir. Se deja en `true` igual que las hermanas porque
86# `strip_debug` entra en `hash_inputs` y divergir acá sólo agrega una diferencia sin motivo.
87strip_debug = true
88
89[deps]
90build = ["binutils"]
91
92[build.phases]
93# `configure` IDÉNTICO al de la canónica y al de `ncurses-tools`. No hace falta para los datos, pero
94# `install.data` corre el `tic` que este mismo árbol compila, y ese `tic` tiene que hablar la misma
95# librería que el resto: una perilla distinta acá haría una base compilada por un `tic` que no es el
96# que viaja en `ncurses-tools`.
97configure = "./configure --prefix=/usr --without-shared --with-normal --enable-widec --without-debug --without-ada --without-tests --enable-pc-files --with-pkg-config-libdir=/usr/lib/pkgconfig --with-fallbacks=linux,vt100,vt220,xterm,xterm-256color,screen,tmux,tmux-256color,ansi"
98compile   = "make"
99
100# `install.data` es el target que compila `misc/terminfo.src` con `tic` y lo deja en
101# `/usr/share/terminfo`, más `/usr/share/tabset`. Es lo ÚNICO que se pide: las librerías las da la
102# canónica y los binarios `ncurses-tools`; duplicarlos acá sería pisar a dos recetas selladas.
103install = '''
104_abuild_phase() {
105	set -e
106	make install.data DESTDIR=/out
107
108	# GUARDIÁN — regla 3 de CLAUDE.md, y acá es EL riesgo real de esta receta: `install.data` no
109	# compila código, ejecuta el `tic` recién construido sobre `terminfo.src`. Si ese `tic` no
110	# arranca (estático a medias, o sin la librería que espera), el target puede «terminar bien»
111	# y dejar el árbol de directorios CREADO y VACÍO. Y las fases corren con `/bin/sh -c` SIN
112	# `-e` desde el harness, así que un fallo a mitad no aborta: sólo cuenta el último comando.
113	# Un artefacto vacío no falla — llega hasta el final diciendo que todo fue bien y envenena
114	# la caché. Se pregunta por el CONTENIDO, no por el directorio.
115	n=$(find /out/usr/share/terminfo -type f 2>/dev/null | wc -l)
116	if [ "$n" -lt 1000 ]; then
117		echo "ncurses-terminfo: la base salió con $n entradas (se esperan ~2900) — ¿corrió tic? Mirar si install.data falló en silencio: el harness no usa 'sh -e'"
118		exit 1
119	fi
120
121	# Y que estén las que de verdad se usan. Una base de 2900 entradas a la que le falte
122	# `xterm-256color` es el mismo fallo con mejor disfraz: hay bulto, no hay servicio.
123	for t in x/xterm-256color x/xterm l/linux s/screen t/tmux-256color; do
124		if [ ! -f "/out/usr/share/terminfo/$t" ]; then
125			echo "ncurses-terminfo: falta la entrada $t en la base — la mayoría de las terminales reales pasan por ahí"
126			exit 1
127		fi
128	done
129	echo "ncurses-terminfo: $n entradas, con xterm-256color/xterm/linux/screen/tmux-256color presentes"
130}
131_abuild_phase
132'''