kde/H-Qt: ADR 0011 → gate PASADO; lecciones durables + snapshot para reanudar

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 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 16:10:40 -04:00
co-authored by Claude Opus 4.8
parent af5a175e01
commit 8eb168e168
+38 -5
View File
@@ -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`.