# gtk4 4.18.6 — el toolkit de GUI. meson static, backend SOLO wayland (sin X11/broadway/win/mac), # renderer GL vía libepoxy (vulkan disabled), todo lo opcional off (demos/tests/docs/cups/gstreamer/ # introspection). Corona el stack gráfico C del lab: con esto el corpus puede producir apps GTK reales. # Deps = cierre transitivo .pc completo (pkg-config estático resuelve Requires.private). name = "gtk4" version = "4.18.6" license = "LGPL-2.1-or-later" [source] tarball = "https://download.gnome.org/sources/gtk/4.18/gtk-4.18.6.tar.xz" sha256 = "e1817c650ddc3261f9a8345b3b22a26a5d80af154630dedc03cc7becefffd0fa" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" [build.phases] # GTK4 construye libgtk.a (static_library 'gtk') Y libgtk-4.so; las tools linkean la .so con libgtk_dep, # imposible en el lab static-musl. Parche 1: que las tools usen libgtk_static_dep (la .a). El sed es seguro: # "libgtk_dep" NO es substring de "libgtk_static_dep" ⇒ no toca las que ya usan el estático. # # ── Parche 2 (2026-08-27): NO construir `libgtk-4.so` en absoluto ──────────────────────────────── # `gtk/meson.build` declara DOS objetivos hermanos con llamadas explícitas: `static_library('gtk')` y # `shared_library('gtk-4')`. Por ser explícita, `-Ddefault_library=static` NO la suprime — no hay # flag que valga. Y esa .so era el ÚNICO objetivo compartido de los 10 que enlaza la receta (los otros # 9 son ejecutables), así que arrastraba CINCO archivos .a sin PIC —libtiff, libfreetype, libfontconfig, # libjpeg, libpng16— y moría con 13930 `relocation … recompile with -fPIC`. Un ejecutable sí puede # enlazar una .a no-PIC; una .so no. # # Se apaga con `build_by_default: false` + `install: false` en ESE bloque (sed acotado por rango, que # toca 1 de los 10 `install: true` del fichero). No se borra la declaración: `pkg_config.generate(libgtk)` # la sigue necesitando para emitir el `.pc` con `-lgtk-4`, que es el nombre que la fase install fabrica # como archive GORDO. Nada la enlaza: los usuarios de `libgtk_dep` son demos/tests/testsuite/examples y # los backends de impresión y media, TODOS desactivados por las flags de abajo… SALVO UNO. # # ⚠ `build_by_default: false` NO BASTA POR SÍ SOLO, y el primer intento falló por esto: ninja # construye igual un objetivo si algo DEPENDE de él. `modules/printbackends/meson.build` declara # `shared_module('printbackend-file')` con `dependencies: libgtk_dep` —y el propio fuente avisa # «The 'file' print backend cannot be disabled»: no hay opción de meson que lo quite, está fuera de # los `if` de cpdb/cups—. Ese módulo arrastraba `libgtk-4.so` de vuelta al grafo y la .so volvía a # enlazarse en [995/997] con los mismos 13930 errores PIC. Por eso se apaga TAMBIÉN. # En todo el árbol hay 5 objetivos compartidos: `libgtk-4.so`, printbackend-{cpdb,cups,file} y # media-gstreamer. cpdb/cups/media ya los quitan las flags; los otros dos, estos dos seds. # # ⚠ El artefacto deja de traer `libgtk-4.so`. Es lo coherente con `link = "static"` y con la fase # install, que ya fabricaba `libgtk-4.a` como el producto real; la .so se construía e instalaba sin # que nadie la usara. Las colas wlr/gnome tienen sus PROPIAS recetas de gtk4 y no se ven afectadas. configure = ''' sed -i 's/libgtk_dep/libgtk_static_dep/g' tools/meson.build sed -i "/^libgtk = shared_library('gtk-4',/,/^)/ s/^ install: true,$/ install: false,\n build_by_default: false,/" gtk/meson.build sed -i "/^shared_module('printbackend-file',/,/^)/ s/^ install: true,$/ install: false,\n build_by_default: false,/" modules/printbackends/meson.build PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload --prefer-static -Ddefault_library=static -Dwayland-backend=true -Dx11-backend=false -Dbroadway-backend=false -Dwin32-backend=false -Dmacos-backend=false -Dvulkan=disabled -Dintrospection=disabled -Dbuild-demos=false -Dbuild-testsuite=false -Dbuild-tests=false -Dbuild-examples=false -Dmedia-gstreamer=disabled -Dprint-cups=disabled -Dprint-cpdb=disabled -Dcloudproviders=disabled -Dsysprof=disabled -Dtracker=disabled -Dcolord=disabled -Df16c=disabled -Ddocumentation=false -Dman-pages=false -Dc_args=-Wno-error=date-time ''' compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" # meson instala solo libgtk-4.so y genera convenience-libs THIN (gtk/gdk/gsk por separado, referencian # los .o por ruta → inútiles fuera del build dir). Fusiono los tres en UN archive GORDO libgtk-4.a (embebe # todos los .o) para que `-lgtk-4` + `-static` linkee de verdad en el lab static-musl. install = ''' PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild rm -f /out/usr/lib/libgtk-4.a cd output objs="" for a in $(find . -name '*.a'); do d=$(dirname "$a"); b=$(basename "$a") for o in $(cd "$d" && zig ar t "$b"); do objs="$objs $d/$o"; done done zig ar rcs /out/usr/lib/libgtk-4.a $objs ''' [deps] build = ["meson", "samurai", "python3", "pkgconf", "glib", "cairo", "pango", "gdk-pixbuf", "graphene", "libepoxy", "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "fontconfig", "harfbuzz", "fribidi", "libpng", "pixman", "freetype", "expat", "libffi", "pcre2", "zlib", "libjpeg-turbo", "libtiff", "mesa"]