# qt6-qtbase 6.11.1 — el corazón de Qt6, base de todo KDE. Etapa Escritorio / campaña KDE (ADR 0011).
# De-Alpinizada del APKBUILD community/qt6-qtbase: se conservan sus 3 parches de musl (LFS64, DNS
# resolver, symlinks) — el trabajo de portabilidad que un import de nix pierde — y se reescriben las
# fases desde el wrapper abuild a CMake/Ninja explícito.
#
# POLÍTICA DE LA CAPA GUI (ADR 0011): link=DINÁMICO. Qt carga plugins .so en runtime (QPA, formatos,
# estilos); un Qt estático no abre una ventana. Se abandona el -static del userland CLI (no re-hashea
# nada sellado). BUILD_SHARED_LIBS=ON (default de Qt) ⇒ libQt6Core.so, etc.
#
# MINIMAL PARA EL GATE H-Qt: Wayland-only (xcb OFF ⇒ toda la cadena xcb-util-* fuera del camino
# crítico), icu OFF (Qt usa su fallback), vulkan OFF (se reactiva para KWin), double-conversion y
# libb2 BUNDLED (Qt trae 3rdparty ⇒ no necesitan receta), cups/at-spi/libproxy/tslib/DB-no-sqlite OFF.
# Con esto qtbase compila reusando SOLO deps ya selladas (freetype/fontconfig/harfbuzz/glib/mesa/
# wayland/openssl/sqlite/pcre2/zlib/libpng/libjpeg-turbo/dbus/libxkbcommon) — CERO recetas nuevas.
#
# NOTA compiler: Qt6 es el stress-test C++ más grande del lab. Se intenta zig-cc primero (coherente
# con el resto); si el C++ a escala lo rompe, caer a gcc-de-gueto (patrón kernel/cmake, ADR 0011).
# IPO/LTO OFF para el gate: reduce riesgo y tiempo; se puede reactivar tras validar.
name    = "qt6-qtbase"
version = "6.11.1"
license = "LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"

[source]
tarball = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtbase-everywhere-src-6.11.1.tar.xz"
sha256  = "d9594a31228aa23ad6b531719a29b45f0f3989fe6c136d45767ea179f233c1ac"
patches = ["0001-qt6-qtbase-lfs64.patch", "0002-qt6-qtbase-dns-resolver.patch", "symlinks.patch"]

[build]
compiler = "zig-cc"
target   = "x86_64-linux-musl"
link     = "dynamic"
flags    = []

[build.phases]
configure = '''
# El sandbox expone cc/c++ como symlinks a zig (despacho por argv[0]). CMake CANONICALIZA el symlink
# al binario real /opt/zig/zig, perdiendo el basename 'cc' ⇒ al invocar el compilador directo (ASM,
# custom commands de Qt) corre `/opt/zig/zig -std=… archivo` y zig lee -std como subcomando → falla.
# Fix (patrón AR-wrapper): scripts reales que fuerzan `zig cc`/`zig c++`; un script no se canonicaliza.
# Se replica -mcpu=baseline del wrapper del lab (coherencia con las deps ya selladas). Los wrappers
# van al ÁRBOL DE FUENTE ($PWD/.zwrap, persiste entre fases) — /tmp se vacía entre configure y compile.
ZW="$PWD/.zwrap"; mkdir -p "$ZW"
printf '#!/bin/sh\nexec /opt/zig/zig cc -mcpu=baseline "$@"\n'  > "$ZW/cc"
printf '#!/bin/sh\nexec /opt/zig/zig c++ -mcpu=baseline "$@"\n' > "$ZW/cxx"
chmod +x "$ZW/cc" "$ZW/cxx"
# PKG_CONFIG_PATH explícito: la QPA xcb de Qt hace pkg_check_modules(xkbcommon-x11) para crear el target
# PkgConfig::XKB_COMMON_X11; sin la ruta, no lo halla y target_link_libraries(XcbQpaPrivate) aborta.
export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig
cmake -B build -G Ninja -Wno-dev \
  -DCMAKE_C_COMPILER="$ZW/cc" \
  -DCMAKE_CXX_COMPILER="$ZW/cxx" \
  -DCMAKE_ASM_COMPILER="$ZW/cc" \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_INSTALL_PREFIX=/usr \
  -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF \
  -DINSTALL_BINDIR=lib/qt6/bin \
  -DINSTALL_PUBLICBINDIR=bin \
  -DINSTALL_LIBEXECDIR=lib/qt6/libexec \
  -DINSTALL_ARCHDATADIR=lib/qt6 \
  -DINSTALL_DATADIR=share/qt6 \
  -DINSTALL_INCLUDEDIR=include/qt6 \
  -DINSTALL_MKSPECSDIR=lib/qt6/mkspecs \
  -DQT_FEATURE_relocatable=OFF \
  -DQT_FEATURE_reduce_relocations=OFF \
  -DQT_FEATURE_journald=OFF \
  -DQT_FEATURE_icu=OFF \
  -DQT_FEATURE_vulkan=OFF \
  -DQT_FEATURE_xcb=ON \
  -DQT_FEATURE_xcb_xlib=ON \
  -DQT_FEATURE_xlib=ON \
  -DQT_FEATURE_libproxy=OFF \
  -DQT_FEATURE_cups=OFF \
  -DQT_FEATURE_libinput=OFF \
  -DQT_FEATURE_accessibility=ON \
  -DQT_FEATURE_system_doubleconversion=OFF \
  -DQT_FEATURE_libb2=OFF \
  -DQT_FEATURE_sql=ON \
  -DQT_FEATURE_sql_sqlite=ON \
  -DQT_FEATURE_system_sqlite=OFF \
  -DQT_FEATURE_openssl=ON \
  -DQT_FEATURE_openssl_linked=ON \
  -DQT_FEATURE_ssl=ON \
  -DQT_FEATURE_system_zlib=ON \
  -DQT_FEATURE_system_libpng=OFF \
  -DQT_FEATURE_system_libjpeg=OFF \
  -DQT_FEATURE_system_freetype=OFF \
  -DQT_FEATURE_system_harfbuzz=OFF \
  -DQT_FEATURE_system_pcre2=ON \
  -DQT_FEATURE_fontconfig=OFF \
  -DQT_FEATURE_glib=OFF \
  -DQT_FEATURE_opengl=ON \
  -DQT_FEATURE_egl=ON \
  -DQT_FEATURE_dbus=ON \
  -DQT_FEATURE_widgets=ON \
  -DQT_BUILD_EXAMPLES=OFF \
  -DQT_BUILD_TESTS=OFF
'''
compile = "cmake --build build"
install = "DESTDIR=/out cmake --install build"

[deps]
# Sólo deps YA selladas + toolchain. double-conversion/libb2/icu/vulkan/xcb/cups quedan bundled u OFF.
# dbus AÑADIDO: KF6 entero exige Qt6DBus ⇒ qtbase con dbus=ON linkea libdbus (variante incoming-kde).
build = [
  "cmake", "samurai", "python3", "pkgconf", "dbus",
  "pcre2", "zlib",
  "wayland", "wayland-protocols", "libxkbcommon", "mesa",
  "openssl",
  # Cadena Qt-xcb (QT_FEATURE_xcb=ON): la QPA X11 de Qt. libxkbcommon aquí es la variante enable-x11
  # (override incoming-kde) que provee libxkbcommon-x11.so + xkbcommon-x11.pc. **CRÍTICO: libXau+libXdmcp**
  # — el gate `xkbcommon-x11` de Qt usa `pkg_check_modules(IMPORTED_TARGET)` que resuelve TODO el árbol
  # Requires: xkbcommon-x11→xcb→(xau,xdmcp Requires.private de xcb.pc). Sin xau.pc/xdmcp.pc el target
  # PkgConfig::XKB_COMMON_X11 NO se crea y XcbQpaPrivate aborta. (Gotcha .pc transitivo, mismo de todo
  # consumidor de xcb.) PKG_CONFIG_PATH explícito arriba p/ que pkg-config vea /usr/lib+share/pkgconfig.
  "libxcb", "libXau", "libXdmcp", "libX11", "libXext", "libXrender", "libXi", "libXfixes",
  "xcb-util", "xcb-util-image", "xcb-util-renderutil", "xcb-util-cursor",
  "xcb-util-keysyms", "xcb-util-wm", "xorgproto", "xtrans",
]
# NOTA gate (ADR 0011, tensión estático↔dinámico): libQt6Core.so LINKEA bien con las deps estáticas
# del closure (glib/pcre2 son PIC-compatibles; zlib entra como libz.so). Lo que ROMPE el .so son libs
# selladas como archive estático SIN -fPIC. Apagado para el gate (una ventana Qt no los necesita):
#  · dbus    → FEATURE_dbus=OFF: recipe dbus canónico falla en granja (meson no ve glib-2.0).
#  · sql     → FEATURE_sql=OFF: sqlite canónico estático sin -fPIC (+ sin COLUMN_METADATA).
#  · openssl → FEATURE_openssl/ssl=OFF: libcrypto.a/libssl.a estáticas sin -fPIC (EVP_SKEYMGMT_free).
#  · glib    → FEATURE_glib=OFF: el glib.a sellado deja símbolos indefinidos bajo -Wl,--no-undefined
#              (g_hmac_ref/g_strv_builder_ref/…); GTK4 lo linkea sin --no-undefined y no lo expone.
#              Qt trae su propio event loop ⇒ glib es opcional para una ventana.
#  · fuentes/imágenes → system_{freetype,harfbuzz,libpng,libjpeg}=OFF + fontconfig=OFF: el link
#              estático NO arrastra deps transitivas (fontconfig.a → símbolos expat XML_* indefinidos,
#              el .pc sellado no las declara). En vez de iterar lib-por-lib, se BUNDLEAN en Qt (PIC
#              internos, cierre completo). zlib/pcre2 SÍ se reusan (entran limpio: libz.so, pcre2.a PIC).
# DEUDA Capa 0/1: para reusar el stack sellado en KDE, hace falta el closure C shared-PIC y .pc con
# Requires.private completo (expat, etc.); mientras, el gate bundlea fuentes/imágenes.
