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:
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user