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…

TOML 1471Shell 173Rust 105Markdown 943545 Definitions

⎇ e852f4849157d026552008ad054cf4c31b8eb532 recipes/incoming-cosmic/libqalculate.toml TOML · 86 lines · 5.9 KB History raw

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

1# libqalculate — la calculadora que le falta al lanzador. El plugin `calc` de pop-launcher no calcula
2# nada por su cuenta: arma una línea y se la pasa al binario **`qalc`**, que es de este paquete. Sin
3# él, tecleando `=2+2` el lanzador contesta —correctamente y sin fallar— «qalc command is not
4# installed». Es el primer paquete del catálogo que existe para que una TECLA del escritorio dé un
5# resultado, no para que otra librería enlace.
6#
7# ── LA CADENA QUE NADIE ADIVINA MIRANDO ARRIBA ──────────────────────────────────────────────────
8# `Super` → cosmic-launcher → pop-launcher → plugin calc → qalc → libqalculate → **mpfr → gmp**.
9# Seis saltos desde una tecla hasta la aritmética de precisión arbitraria, y los dos últimos son
10# obligatorios: el configure corta con «libgmp not found» y «libmpfr not found or uses a different
11# ABI». Por eso [[gmp]] y [[mpfr]] entraron primero.
12#
13# ── LO QUE SE APAGA, Y POR QUÉ CADA UNO ─────────────────────────────────────────────────────────
14# · `--without-libcurl`: es para BAJARSE tipos de cambio de internet. Un paquete de una distro
15#   reproducible no tiene por qué traer un cliente HTTP para sumar; y la clausura se ahorra curl
16#   entero. Las tasas quedan las del fichero de definiciones, que es lo honesto: un dato con fecha.
17# · `--without-icu`: sólo aporta comparación de cadenas Unicode insensible a mayúsculas. Traería
18#   ICU —decenas de MB de tablas— para que `SIN` funcione igual que `sin`.
19# · `--disable-nls`: no hay locales en la imagen (los clientes ya avisan «failed to get system
20#   locale, falling back to en-US»), así que gettext sólo agregaría dependencia sin traducir nada.
21#
22# ── ⚠ READLINE NO ES OPCIONAL ACÁ, Y ESO SE MIDIÓ ───────────────────────────────────────────────
23# Yo había razonado que era indiferente «porque el plugin usa qalc de forma no interactiva». **Es
24# falso, y el código del plugin lo dice**: `Command::new("qalc")` sin expresión, con `stdin` en pipe,
25# le ESCRIBE la expresión por stdin y descarta las dos primeras líneas de stdout. O sea que lo usa en
26# modo INTERACTIVO con stdin redirigido — el modo en que `-t <expr>` no participa.
27# Sin readline ese modo no funciona: el binario imprime el prompt `>` y no evalúa nada, así que la
28# fila del lanzador sale VACÍA (no «no está instalado»: está, y no contesta). Con readline el bucle
29# de entrada es el que espera el plugin.
30# La lección es la de siempre en esta campaña, otra vez: **la dep no se deduce de para qué sirve el
31# paquete, se lee de cómo lo INVOCA quien lo usa.** «Es una calculadora, la llamarán con la cuenta
32# en argv» era una suposición, no una medición.
33name    = "libqalculate"
34version = "5.12.0"
35license = "GPL-2.0-or-later"
36
37[source]
38tarball = "https://github.com/Qalculate/libqalculate/releases/download/v5.12.0/libqalculate-5.12.0.tar.gz"
39sha256  = "f3dfdcf97d5a9e3a5bc0ebe66afd184721b606276eee3ba0ada8c92a5e71d44c"
40
41[build]
42# C++ de verdad (la librería entera lo es), y con `compiler = "zig-cc"` el sandbox pone
43# CXX=takana-zig-cxx, o sea `zig c++` con la libc++ de LLVM enlazada ESTÁTICA. Eso es lo que evita
44# que el artefacto pida `libstdc++.so.6`/`libgcc_s.so.1` de Alpine — la deuda que la campaña
45# «matar gcc» viene pagando en el resto del árbol.
46compiler = "zig-cc"
47target   = "x86_64-linux-musl"
48link     = "static"
49flags    = []
50
51[build.phases]
52configure = '''
53# ── ALIAS DE CURSES, PORQUE EL CORPUS SÓLO EMPAQUETA LA VARIANTE WIDE ───────────────────────────
54# El configure de libqalculate busca readline probando `-lreadline` junto a `-lncurses`, `-lcurses`,
55# `-ltermcap` y `-ltinfo`, en ese orden. Nuestro `ncurses` instala **sólo `libncursesw.a`** (la
56# variante de caracteres anchos, que es la correcta y la única que hace falta), así que las cuatro
57# pruebas fallan con «unable to find static system library» y el configure concluye —sin error— que
58# no hay readline. Que el paquete se llame `ncurses` no significa que provea `-lncurses`.
59# Los alias van en un directorio LOCAL y no tocando `/usr/lib`: la vista de deps del sandbox es la
60# evidencia de qué se declaró, y ensuciarla para que un test pase deja mintiendo justo al mecanismo
61# que existe para no mentir.
62mkdir -p .curses-compat
63for a in libncurses libcurses libtinfo libtermcap; do ln -sf /usr/lib/libncursesw.a ".curses-compat/$a.a"; done
64./configure \
65	--build=$CBUILD --host=$CHOST \
66	--prefix=/usr \
67	--disable-shared --enable-static \
68	--without-libcurl \
69	--without-icu \
70	--disable-nls \
71	LDFLAGS="$LDFLAGS -L$PWD/.curses-compat"
72'''
73# `-all-static` NO ES REDUNDANTE con `link = "static"`, y esa confusión costó todo un frente.
74# El harness inyecta `LDFLAGS=-static`, pero **libtool se lo come**: la línea de enlace real de `qalc`
75# salía dinámica contra `libc.so`. Y un musl DINÁMICO acá no es sólo «pesa distinto»: `stdin`,
76# `stdout` y `stderr` terminaron **en la misma dirección de BSS**, las tres compartiendo una única
77# ranura de copy-relocation, así que el `stdin` del programa era en realidad el `stdout`
78# (`fileno(stdin)` = 1). De ahí que `qalc` no leyera NADA de una tubería mientras `-f /dev/stdin`
79# —que abre el descriptor por ruta, sin tocar el FILE* roto— funcionaba perfecto.
80# `-all-static` es la forma de decírselo a libtool; `-no-pie` va con él (un estático PIE no tiene
81# sentido). Mismo par que usa `libxml2` en el corpus, por la misma razón.
82compile = 'make LDFLAGS="-all-static -no-pie -L$PWD/.curses-compat" -j"$(nproc)"'
83install = 'make DESTDIR=/out install LDFLAGS="-all-static -no-pie -L$PWD/.curses-compat"' 
84
85[deps]
86build = ["make", "gmp", "mpfr", "libxml2", "pkgconf", "readline", "ncurses"]