# 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.