From 9665cc29d4438022c8d9a57e4578dc83d5300998 Mon Sep 17 00:00:00 2001 From: sergio Date: Tue, 4 Aug 2026 05:13:14 -0400 Subject: [PATCH] =?UTF-8?q?cosmic:=20la=20calculadora=20del=20lanzador=20A?= =?UTF-8?q?NDA=20=E2=80=94=20el=20stdin=20de=20qalc=20era=20el=20stdout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit =123*456 → 56088 en el lanzador. libqalculate re-sellado b3:edb8d14d. La causa del «no lee nada de la tubería» no era readline, ni el toolchain, ni la versión: el binario salía DINÁMICO pese a link="static", porque libtool se come el -static que inyecta el harness. Y en un musl dinámico stdin, stdout y stderr se resolvieron por copy relocation a UNA SOLA ranura de BSS compartida —las tres en la misma dirección—, así que fileno(stdin) daba 1: el stdin del programa era el stdout. Eso explica la asimetría que parecía absurda, que qalc -f /dev/stdin funcionara (abre el fd por RUTA, sin tocar el FILE* roto) y qalc leyendo stdin no. Fix: make LDFLAGS="-all-static -no-pie", el mismo par que ya usa libxml2. Con él los tres símbolos vuelven a tener direcciones distintas en .rodata. Regla para el runbook: link="static" en la receta NO garantiza un binario estático — readelf -d y nm -S | grep ' std' lo contestan en dos segundos. Segundo muro: qalc pregunta si activar autocalc antes de leer nada, el plugin le manda la expresión y cierra, la expresión se consume como respuesta y qalc nunca llega a guardar config ⇒ vuelve a preguntar siempre. Se siembra qalc.cfg desde cosmic-start, política de imagen como el color de fondo. Y hay que repetir el -L de los alias de curses en el make: el LDFLAGS del make pisa al del configure. Co-Authored-By: Claude Opus 5 (1M context) --- .../cosmic-calculadora-qemu-2026-08-04.png | Bin 0 -> 14240 bytes docs/runbooks/cosmic-desktop.md | 86 ++++++++++++------ docs/state/build-state-cosmic.json | 31 +++---- recipes/incoming-cosmic/libqalculate.toml | 13 ++- scripts/cosmic/cosmic-start-qemu.sh | 13 +++ 5 files changed, 95 insertions(+), 48 deletions(-) create mode 100644 docs/evidencia/cosmic-calculadora-qemu-2026-08-04.png diff --git a/docs/evidencia/cosmic-calculadora-qemu-2026-08-04.png b/docs/evidencia/cosmic-calculadora-qemu-2026-08-04.png new file mode 100644 index 0000000000000000000000000000000000000000..c45ad4ba5e66d1c2f0d41a3384505c39aa4e3866 GIT binary patch literal 14240 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 literal 0 HcmV?d00001 diff --git a/docs/runbooks/cosmic-desktop.md b/docs/runbooks/cosmic-desktop.md index 08efe24b..d4d0e7fa 100644 --- a/docs/runbooks/cosmic-desktop.md +++ b/docs/runbooks/cosmic-desktop.md @@ -108,7 +108,7 @@ Más `cosmic-settings-daemon` y `xdg-desktop-portal-cosmic` fuera de esa lista. | **`cosmic-applets`** (19 binarios en uno) | ✅ **sellado** (necesitó `dbus-shared`, ver gotcha 10) | `b3:3e53a325` | | `pop-launcher` 1.2.7 (otro repo, ver abajo) | ✅ sellado a la primera | `b3:64a5cbaa` | | `gmp` 6.3.0 · `mpfr` 4.2.2 (cadena de la calculadora) | ✅ sellados a la primera | `b3:d99a0a5d` · `b3:13982d20` | -| `libqalculate` 5.12.0 (`qalc`) | ✅ sellado — **pero el plugin del lanzador no lo puede usar, ver abajo** | `b3:6bb435a7` | +| `libqalculate` 5.12.0 (`qalc`) | ✅ sellado — la calculadora del lanzador ANDA (ver abajo) | `b3:edb8d14d` | **La cola está COMPLETA: 30 recetas, `escritorio-cosmic` 68/68.** @@ -481,38 +481,66 @@ plugin, que contesta «qalc command is not installed»**. Esa respuesta es la me disponible: el proceso hijo corrió, evaluó la consulta y devolvió una fila. Lo que falta ahora es `libqalculate` (el binario `qalc`), que es un paquete, no un problema. -### 🧮 `libqalculate`: empaquetado y andando, e inservible para el plugin +### 🧮 `libqalculate`: la calculadora del lanzador, y un `stdin` que era `stdout` -`qalc` está sellado y **funciona**: `qalc -t '2+2'` → `4`, `-f fichero`, y el modo interactivo sobre -una terminal calcula perfecto (`123 × 456 = 56088`). La cadena que baja desde una tecla —`Super` → -cosmic-launcher → pop-launcher → plugin `calc` → `qalc` → **mpfr → gmp**— está entera en el catálogo. +**`=123*456` → `56088` en el lanzador** (`cosmic-calculadora-qemu-2026-08-04.png`). La cadena entera +desde una tecla está en el catálogo: `Super` → cosmic-launcher → pop-launcher → plugin `calc` → +`qalc` → **mpfr → gmp**. -**Y aun así el lanzador sigue mostrando una fila vacía.** El plugin no le pasa la cuenta por argv: -arranca `qalc` SIN expresión, con stdin y stdout en tubería, le ESCRIBE la expresión y cierra. Ese -modo, en nuestro binario, no lee nada. Acotado con dos invocaciones que sólo difieren en cuándo llega -el EOF: +Pero el camino hasta ahí tuvo dos muros que vale la pena dejar escritos, porque ninguno se parecía a +lo que era. -```sh -{ printf '123*456\n'; sleep 3; } | qalc # LEE (aparece la pregunta de primer arranque) - printf '123*456\n' | qalc # NO lee NADA: imprime el prompt y sale con rc=0 +**1) `stdin` apuntaba al descriptor 1.** El plugin no le pasa la cuenta por argv: arranca `qalc` SIN +expresión, con stdin en tubería, le escribe la expresión y cierra. En ese modo el binario **no leía +nada** — ni error ni resultado, la fila del lanzador salía en blanco. El síntoma acusaba a readline, +al toolchain y a la versión, y no era ninguno: + +``` +DIAG-main isatty=0 feof=0 ferror=0 fd=1 ← fileno(stdin) == 1 +nm -S qalc | grep -E ' (stdin|stdout|stderr)$' + 1847148 8 B stderr + 1847148 8 B stdin ← las TRES en la misma dirección + 1847148 8 B stdout ``` -O sea: **con el EOF ya pendiente en un stdin que no es terminal, `readline()` devuelve NULL antes de -entregar la línea que sí está en el búfer** — y así es exactamente como lo invoca el plugin. +La causa: **el binario salía DINÁMICO aunque la receta dice `link = "static"`, porque libtool se come +el `-static` que inyecta el harness** ([[link-static-mentira-libtool]] otra vez, cuarto caso). Y en +un musl dinámico las tres variables de stdio se resolvieron por *copy relocation* a **una sola ranura +de BSS compartida**: la última que escribe el loader gana, así que el `stdin` del programa era el +`stdout`. De ahí la asimetría que parecía absurda: `qalc -f /dev/stdin` funcionaba —abre el +descriptor por RUTA, sin tocar el `FILE*` roto— y `qalc` leyendo `stdin` no. -Lo que ya se DESCARTÓ midiendo, para que nadie lo repita: -- **No es el toolchain.** Una sonda estática musl del propio sandbox (C y C++) lee la tubería sin - problema. El binario no tiene nada raro: un solo `NEEDED`, `libc.so`. -- **No es readline vs no-readline.** Sin readline es peor (no lee nunca, ni con la tubería abierta); - con readline al menos lee cuando el escritor no ha cerrado. -- **No es la versión de readline.** Se construyó una 8.3 como sombra de cola y el síntoma no se - movió; la sombra se descartó en vez de dejar una receta duplicada que no arregla nada. -- **No es el descriptor 0.** `qalc -f /dev/stdin` —el MISMO pipe, reabierto por ruta— sí funciona. - El que no sirve es el `FILE*` `stdin`. +El fix es el par que ya usa `libxml2`: `make LDFLAGS="-all-static -no-pie"`. Con él el binario queda +estático de verdad y los tres símbolos vuelven a tener direcciones distintas, en `.rodata`: -La pista que queda es justamente esa última asimetría. Y el aviso de método: **empaquetar el binario -que falta no garantiza que el consumidor lo pueda usar** — «qalc no está instalado» y «qalc está y no -contesta» son dos estados distintos, y el segundo se ve peor porque la fila sale en blanco. +``` + 11e71c8 8 R stderr + 11e71d0 8 R stdin + 11e71d8 8 R stdout +``` + +**La regla, y es de las caras: `link = "static"` en la receta no garantiza un binario estático.** +Cuando algo se comporta como si su `stdin`/`stdout` estuvieran cruzados, `readelf -d` y +`nm -S | grep ' std'` contestan en dos segundos lo que el log no dice nunca. + +**2) La pregunta de primer arranque se come la cuenta, SIEMPRE.** Antes de leer nada, `qalc` pregunta +si activar `autocalc`. El plugin le manda la expresión y cierra: la expresión se consume como +respuesta, no es un sí/no válido, y qalc **no llega a guardar config** ⇒ la próxima vez vuelve a +preguntar. No es «falla la primera vez»: no anda nunca. Se siembra +`~/.config/qalculate/qalc.cfg` con `calculate_as_you_type=0` desde `cosmic-start` — política de la +imagen, como el color de fondo; una distro de verdad lo pondría en `/etc/skel`. + +**Gotchas de empaquetado de la cadena:** +- **`gmp` va con `--disable-assembly`.** Elige rutinas en ensamblador mirando la CPU de quien + compila, o sea hornearía la ISA del laptop en el artefacto y el hash dejaría de significar lo mismo + en la granja. Es una calculadora de escritorio: la implementación en C portable sobra. +- **El configure de libqalculate no encuentra readline** porque prueba `-lreadline` junto a + `-lncurses`, `-lcurses`, `-ltermcap` y `-ltinfo`, y el corpus **sólo empaqueta `libncursesw.a`**. + Que el paquete se llame `ncurses` no significa que provea `-lncurses`. Los alias van en un + directorio LOCAL (`.curses-compat/`) y no en `/usr/lib`: esa vista es la evidencia de qué se + declaró, y ensuciarla para que pase un test deja mintiendo justo al mecanismo que existe para no + mentir. Ojo: hay que repetir el `-L` en el `make`, porque el `LDFLAGS` del `make` PISA al del + `configure`. ### ⏱ El panel tiene un DEADLINE de arranque: con 4 vCPU sale mutilado @@ -530,9 +558,9 @@ El número de procesos no distingue «arrancó» de «dibujó». El framebuffer ## Lo que falta, en orden -1. **Aplicaciones.** No hay ni una: los 20 `.desktop` de la imagen son `NoDisplay=true`. El primer - candidato barato es `libqalculate` (el binario `qalc`), que es lo único que le falta al plugin de - la calculadora para dar un resultado en vez de decir que no está. +1. **Aplicaciones con ventana.** Sigue sin haber ninguna: los 20 `.desktop` de la imagen son + `NoDisplay=true`, así que la biblioteca sale vacía y eso es correcto. La calculadora del lanzador + ya da resultados, pero es una fila de texto, no una app. `cosmic-term` sería la primera de verdad. 2. `xdg-desktop-portal-cosmic` — sin él no hay captura de pantalla, ni file-chooser, ni compartir. 3. `cosmic-settings` (el panel de control) y `cosmic-files`: la suite tiene aplicaciones y el catálogo todavía no. diff --git a/docs/state/build-state-cosmic.json b/docs/state/build-state-cosmic.json index c59ff535..6a312856 100644 --- a/docs/state/build-state-cosmic.json +++ b/docs/state/build-state-cosmic.json @@ -3,9 +3,8 @@ "totals": { "recipes": 800, "nodes": 800, - "sealed": 797, - "never": 2, - "debt": 1 + "sealed": 798, + "never": 2 }, "by_class": { "c": 160, @@ -15,7 +14,7 @@ "rust": 241 }, "debt_by_class": { - "c": 3 + "c": 2 }, "by_queue": { "corpus": { @@ -23,8 +22,7 @@ "never": 2 }, "incoming-cosmic": { - "sealed": 29, - "debt": 1 + "sealed": 30 } }, "by_profile": { @@ -41,8 +39,7 @@ "escritorio-cosmic": { "raices": 20, "clausura": 68, - "sealed": 67, - "debt": 1 + "sealed": 68 }, "escritorio-mirada": { "raices": 14, @@ -4898,7 +4895,7 @@ "hash": "b3:d99a0a5d6fb0e301523c3797d899e7c1002c58f282865df87e221b4e47fd0642", "state": "sealed", "blocked_by": [], - "unblocks": 1, + "unblocks": 0, "perfiles": [ "escritorio-cosmic" ], @@ -8228,8 +8225,8 @@ ], "cls": "c", "queue": "incoming-cosmic", - "hash": "b3:fcf9c6c097f9f37235319d52dbe64e42deaa012cc374aee206f9c5d2201ae3ac", - "state": "debt", + "hash": "b3:edb8d14db8e625168dea50e40073840b29a6800d7c5b027bbf01f17f15fd5b68", + "state": "sealed", "blocked_by": [], "unblocks": 0, "perfiles": [ @@ -8452,7 +8449,7 @@ "hash": "b3:c4c65c4b17b86211c4a7f076e6693aedb9168d72cc8e45a4a9022fdd75f79494", "state": "sealed", "blocked_by": [], - "unblocks": 1, + "unblocks": 0, "perfiles": [ "escritorio-cosmic", "escritorio-gnome" @@ -8804,7 +8801,7 @@ "hash": "b3:fbad44acdc76df4b081cccd3cc02666664b6d1a03cd6fa482f85791fa533a602", "state": "sealed", "blocked_by": [], - "unblocks": 2, + "unblocks": 1, "perfiles": [ "base", "cli", @@ -9471,7 +9468,7 @@ "hash": "b3:13982d20e404affb9ab825c157a50efc2f0370e1befe75cb7ce93b914d55d497", "state": "sealed", "blocked_by": [], - "unblocks": 1, + "unblocks": 0, "perfiles": [ "escritorio-cosmic" ], @@ -9695,7 +9692,7 @@ "hash": "b3:a3be97622d20cd8d831a25403e00eccb23f2585ed78670a4e12d6cbe519fb8ec", "state": "sealed", "blocked_by": [], - "unblocks": 1, + "unblocks": 0, "perfiles": [ "base", "cli", @@ -10617,7 +10614,7 @@ "hash": "b3:f0b5d0b1cb4321b3c61f24a871b9a58da3ebb7eb903af4015e35bd41a6465437", "state": "sealed", "blocked_by": [], - "unblocks": 1, + "unblocks": 0, "perfiles": [ "base", "cli", @@ -11053,7 +11050,7 @@ "hash": "b3:03c0eb9ccaf42a65d876c0778b7ee53695f6389bbe5c4c9bcf606f8aa328ec36", "state": "sealed", "blocked_by": [], - "unblocks": 1, + "unblocks": 0, "perfiles": [ "base", "cli", diff --git a/recipes/incoming-cosmic/libqalculate.toml b/recipes/incoming-cosmic/libqalculate.toml index 621a1dff..dd57e95c 100644 --- a/recipes/incoming-cosmic/libqalculate.toml +++ b/recipes/incoming-cosmic/libqalculate.toml @@ -69,8 +69,17 @@ for a in libncurses libcurses libtinfo libtermcap; do ln -sf /usr/lib/libncurses --disable-nls \ LDFLAGS="$LDFLAGS -L$PWD/.curses-compat" ''' -compile = 'make -j"$(nproc)"' -install = 'make DESTDIR=/out install' +# `-all-static` NO ES REDUNDANTE con `link = "static"`, y esa confusión costó todo un frente. +# El harness inyecta `LDFLAGS=-static`, pero **libtool se lo come**: la línea de enlace real de `qalc` +# salía dinámica contra `libc.so`. Y un musl DINÁMICO acá no es sólo «pesa distinto»: `stdin`, +# `stdout` y `stderr` terminaron **en la misma dirección de BSS**, las tres compartiendo una única +# ranura de copy-relocation, así que el `stdin` del programa era en realidad el `stdout` +# (`fileno(stdin)` = 1). De ahí que `qalc` no leyera NADA de una tubería mientras `-f /dev/stdin` +# —que abre el descriptor por ruta, sin tocar el FILE* roto— funcionaba perfecto. +# `-all-static` es la forma de decírselo a libtool; `-no-pie` va con él (un estático PIE no tiene +# sentido). Mismo par que usa `libxml2` en el corpus, por la misma razón. +compile = 'make LDFLAGS="-all-static -no-pie -L$PWD/.curses-compat" -j"$(nproc)"' +install = 'make DESTDIR=/out install LDFLAGS="-all-static -no-pie -L$PWD/.curses-compat"' [deps] build = ["make", "gmp", "mpfr", "libxml2", "pkgconf", "readline", "ncurses"] diff --git a/scripts/cosmic/cosmic-start-qemu.sh b/scripts/cosmic/cosmic-start-qemu.sh index def6091f..9a8815c4 100755 --- a/scripts/cosmic/cosmic-start-qemu.sh +++ b/scripts/cosmic/cosmic-start-qemu.sh @@ -157,6 +157,19 @@ RON say "fondo: color liso (el wallpaper por defecto vive en git-lfs y no se empaqueta)" fi +# ── SEMILLA DE CONFIG DE qalc, SIN LA CUAL LA CALCULADORA DEL LANZADOR NUNCA ANDA ──────────────── +# En el primer arranque `qalc` hace una PREGUNTA interactiva («¿activar autocalc?») antes de leer +# nada. El plugin `calc` de pop-launcher le escribe la expresión y cierra el pipe, así que la +# expresión se consume como respuesta, no es un sí/no válido, y qalc **no llega a guardar config** ⇒ +# la próxima vez vuelve a preguntar. O sea que sin sembrar esto no falla una vez: falla SIEMPRE. +# Es política de la imagen, no del paquete —igual que el color de fondo—: una distro de verdad lo +# pondría en el esqueleto de /etc/skel. +if [ ! -f "$HOME/.config/qalculate/qalc.cfg" ]; then + mkdir -p "$HOME/.config/qalculate" + printf '[General]\ncalculate_as_you_type=0\n' > "$HOME/.config/qalculate/qalc.cfg" + say "qalc: config sembrada (si no, la pregunta de primer arranque se come la cuenta)" +fi + # ── MODO: bare (default) o session ────────────────────────────────────────────────────────────── # `cosmic-session` es el camino de producción, pero HOY no se puede usar: llama a # `cosmic-settings-daemon` con `.expect("failed to start settings daemon")` (src/main.rs:255) y