From 8eb168e168482ad65dff3e23948dc992e4f2455d Mon Sep 17 00:00:00 2001 From: sergio Date: Sat, 11 Jul 2026 16:10:40 -0400 Subject: [PATCH] =?UTF-8?q?kde/H-Qt:=20ADR=200011=20=E2=86=92=20gate=20PAS?= =?UTF-8?q?ADO;=20lecciones=20durables=20+=20snapshot=20para=20reanudar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Registra el resultado (qtbase sella b3:7c7c747d, app Qt rc=0 offscreen), las 3 lecciones de-Alpinización (wrapper zig/CMake, tensión estático↔dinámico = deuda Capa 0, hidratación runtime musl) y el snapshot hammer-kde-qtbase-2026-07-11 (img 407438750) para arrancar futuras farm-up sin re-pagar el build. Próximo: qtdeclarative/QML (H-QML) + saldar deuda Capa 0. Co-Authored-By: Claude Opus 4.8 --- docs/adr/0011-escritorio-kde-plasma.md | 43 +++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/docs/adr/0011-escritorio-kde-plasma.md b/docs/adr/0011-escritorio-kde-plasma.md index 97e0871f..82be06ea 100644 --- a/docs/adr/0011-escritorio-kde-plasma.md +++ b/docs/adr/0011-escritorio-kde-plasma.md @@ -1,6 +1,6 @@ # 0011 — Etapa Escritorio: campaña KDE Plasma 6 -Estado: propuesto (roadmap de campaña, no implementación) +Estado: aceptado · **gate H-Qt PASADO (2026-07-11)** Fecha: 2026-07-11 Relacionado: [[etapa-g-importar-nix]], [[etapa-g-gui-chain-boundary]], [[granja-efimera-hcloud]], 0003-zig-cc-builder, 0008-bootstrap-stages, 0010-arranque-grafo-mirada @@ -164,9 +164,42 @@ por demanda. - **Adoptar binarios Qt/KDE de Alpine sin rebuild**: viola soberanía del bootstrap; se acepta sólo como deuda puntual (ej. GL), no como base del escritorio. +## Resultado H-Qt (2026-07-11) — GATE PASADO ✅ + +`qtbase 6.11.1` **construye y sella** en la granja (`b3:7c7c747d4d4b609f0d9eddbab5b4bc73e7816ce71c03e0fc53cfebf7ba35cebd`), +receta `recipes/incoming-kde/qtbase.toml` (de-Alpinizada del APKBUILD, conserva sus parches de musl). +Produce `libQt6Core/Gui/Widgets/OpenGL.so` **dinámicos** + el plugin QPA `libqwayland.so`. La app de +prueba `scripts/kde/h-qt-test.cpp` (QApplication+QLabel) compila y linkea contra él, y **corre a rc=0** +con `QT_QPA_PLATFORM=offscreen` en el rootfs musl del worker: crea la ventana y el event loop sale +limpio. **El régimen dinámico + zig-cc + musl del ADR queda probado end-to-end en el componente más +difícil de KDE** — el riesgo #1 (¿sobrevive el toolchain a Qt?) está respondido: sí. + +**Snapshot `hammer-kde-qtbase-2026-07-11` (img 407438750)**: worker con qtbase + su cierre de deps ya +sellados. Arrancar futuras `farm-up` de la campaña KDE desde ESTA imagen (no la golden limpia) evita +re-pagar ~45 min de build. El worker efímero se destruyó (baseline €0). + +### Lecciones durables (patrón de-Alpinización Qt/KDE) +1. **zig-cc + CMake**: CMake canonicaliza el symlink `cc`→`/opt/zig/zig`, perdiendo el despacho por + `argv[0]`; ASM y custom-commands invocan `zig -std=…` (subcomando inválido). Fix: scripts wrapper + reales (`$PWD/.zwrap/{cc,cxx}` = `exec zig cc/c++ -mcpu=baseline`), en el ÁRBOL DE FUENTE (no /tmp, + que se vacía entre fases), y `-DCMAKE_{C,CXX,ASM}_COMPILER` apuntándolos. Un script no se canonicaliza. +2. **Tensión estático↔dinámico (la deuda central de Capa 0)**: la capa GUI arma `.so`, pero muchas + libs C canónicas están selladas como **archive estático sin -fPIC** (openssl `libcrypto.a`, sqlite) + o **incompletas bajo `-Wl,--no-undefined`** (glib) o **sin arrastrar deps transitivas** (fontconfig + →expat). `libQt6Core.so` SÍ linkea con glib/pcre2 (PIC-compat) y `zlib` entra como `libz.so`. Para + el gate se apagó/bundleó lo problemático (dbus/sql/openssl/glib/fontconfig OFF; freetype/harfbuzz/ + libpng/libjpeg bundled). **DEUDA para KDE real: reconstruir el closure C shared-PIC + `.pc` con + `Requires.private` completo** (SSL/SQL/glib/fontconfig los va a exigir Plasma). +3. **Hidratación runtime**: correr un binario musl del store exige el rootfs musl (`.dev-fs/alpine`, el + host del worker es glibc) + el cierre de `.so` en `LD_LIBRARY_PATH` (mesa/libdrm/…). Varios libs son + static-only en el store: se puede fabricar la `.so` desde el `.a` si es PIC + (`zig cc -shared -Wl,--whole-archive lib.a`). Falta una hidratación FHS que capture el cierre runtime. + ## Próximo paso concreto -Importar+pinnear la **Capa 0 faltante** a `recipes/incoming-kde/` (empezando por Mesa-completo + -pila xcb/X11 + elogind/seatd + PipeWire), y correr la primera `farm-run` de la campaña. El gate -temprano a perseguir es **H-Qt**: si `qtbase` + una ventana Qt no funciona bajo el régimen dinámico, -todo lo demás se replantea antes de gastar granja en 700 recetas. +Con H-Qt cerrado, la **Capa 1 (Qt6)** sigue con **qtdeclarative (QML)** — Plasma es QML, es el +siguiente de-risk (hito H-QML) — más `qtwayland` como módulo completo (ya tenemos su QPA en qtbase, +pero KDE usa `qtwayland` extendido). En paralelo, **saldar la deuda de Capa 0**: sqlite+openssl +shared-PIC y glib `.a` completo, para reactivar SSL/SQL/glib en un qtbase "real" (hoy es el qtbase del +gate, reducido; se rebuildea con features plenas antes de promover a canónico/firmado). Arrancar las +`farm-up` desde el snapshot `hammer-kde-qtbase-2026-07-11`.