From 5a025fe1e716fff8ecdac8ead465986f9d67e33a Mon Sep 17 00:00:00 2001 From: sergio Date: Mon, 27 Jul 2026 13:59:09 -0400 Subject: [PATCH] =?UTF-8?q?gnome=20onda=202:=20cierre=20C=20din=C3=A1mico?= =?UTF-8?q?=20(cairo-shared)=20desbloquea=20gjs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El link de gjs moría en cairo estático (undefined XML_GetCurrentLineNumber): el cairo canónico --prefer-static arrastra fontconfig/freetype/pixman/expat como cadena estática que un consumidor dinámico no resuelve. Fix = cairo DINÁMICO: - cairo-shared (nuevo): libcairo.so.2 default_library=both, deps al cierre -shared. - copio zlib/libpng/freetype/fontconfig -shared de incoming-kde (sufijo NO sombrea el corpus ⇒ NO re-hashea la glib-isla). pixman canónico ya es dinámico. - gjs usa el cierre -shared: linkea libcairo.so, la cadena resuelve por NEEDED. Mismo cierre desbloqueará pango/gtk4 (próximo). Confirma la revelación del comentario de pixman.toml: el muro 'cairo-ft FontConfig' era el cierre estático no resuelto, no fontconfig faltante. Co-Authored-By: Claude Opus 4.8 --- .../incoming-gnome-onda2/cairo-shared.toml | 32 ++++++++++++++++++ .../fontconfig-shared.toml | 27 +++++++++++++++ .../incoming-gnome-onda2/freetype-shared.toml | 31 +++++++++++++++++ recipes/incoming-gnome-onda2/gjs.toml | 20 +++++------ .../incoming-gnome-onda2/libpng-shared.toml | 23 +++++++++++++ recipes/incoming-gnome-onda2/zlib-shared.toml | 33 +++++++++++++++++++ recipes/incoming-gnome/cairo-shared.toml | 32 ++++++++++++++++++ recipes/incoming-gnome/fontconfig-shared.toml | 27 +++++++++++++++ recipes/incoming-gnome/freetype-shared.toml | 31 +++++++++++++++++ recipes/incoming-gnome/gjs.toml | 20 +++++------ recipes/incoming-gnome/libpng-shared.toml | 23 +++++++++++++ recipes/incoming-gnome/zlib-shared.toml | 33 +++++++++++++++++++ 12 files changed, 310 insertions(+), 22 deletions(-) create mode 100644 recipes/incoming-gnome-onda2/cairo-shared.toml create mode 100644 recipes/incoming-gnome-onda2/fontconfig-shared.toml create mode 100644 recipes/incoming-gnome-onda2/freetype-shared.toml create mode 100644 recipes/incoming-gnome-onda2/libpng-shared.toml create mode 100644 recipes/incoming-gnome-onda2/zlib-shared.toml create mode 100644 recipes/incoming-gnome/cairo-shared.toml create mode 100644 recipes/incoming-gnome/fontconfig-shared.toml create mode 100644 recipes/incoming-gnome/freetype-shared.toml create mode 100644 recipes/incoming-gnome/libpng-shared.toml create mode 100644 recipes/incoming-gnome/zlib-shared.toml diff --git a/recipes/incoming-gnome-onda2/cairo-shared.toml b/recipes/incoming-gnome-onda2/cairo-shared.toml new file mode 100644 index 00000000..9b10f4bd --- /dev/null +++ b/recipes/incoming-gnome-onda2/cairo-shared.toml @@ -0,0 +1,32 @@ +# cairo-shared 1.18.4 — variante DINÁMICA de cairo (libcairo.so.2 + libcairo-gobject.so, PIC) para la +# isla GNOME. El canónico (recipes/cairo.toml) es --prefer-static/default_library=static: su cairo.a +# arrastra fontconfig/freetype/pixman/expat como cadena ESTÁTICA que el linker de un consumidor DINÁMICO +# (gjs/pango, sin --prefer-static) no resuelve ⇒ 'undefined symbol: XML_GetCurrentLineNumber' (gjs) y el +# test cairo-ft de pango falla ("FontConfig support"). Con la .so, el consumidor linkea -lcairo y la +# cadena resuelve por NEEDED (libfontconfig.so→libexpat embebido, libfreetype.so→libpng/zlib.so). +# +# Sufijo -shared (NO sombrea recipes/cairo.toml): sólo lo consumen las recetas que lo declaran EXPLÍCITO. +# Deps al cierre -shared (freetype/fontconfig/libpng/zlib) para NEEDED coherentes; pixman canónico ya es +# dinámico (default_library=both); glib = la isla (libcairo-gobject NEEDED libgobject.so isla, sin doble +# estado). expat canónico (--with-pic ⇒ se embebe). Ver [[gnome-introspection-dinamica]]. +name = "cairo-shared" +version = "1.18.4" + +[source] +tarball = "https://cairographics.org/releases/cairo-1.18.4.tar.xz" +sha256 = "445ed8208a6e4823de1226a74ca319d3600e83f6369f99b14265006599c32ccb" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +# default_library=both (no static, sin --prefer-static): produce libcairo.so.2 (+ .a). png/freetype/ +# fontconfig/glib enabled = misma superficie que el canónico. xlib/xcb off (Wayland-only). +configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=both -Dc_args=-Wno-error=date-time -Dtests=disabled -Dxlib=disabled -Dxcb=disabled -Dquartz=disabled -Dtee=disabled -Dsymbol-lookup=disabled -Dspectre=disabled -Dgtk_doc=false -Dpng=enabled -Dfreetype=enabled -Dfontconfig=enabled -Dglib=enabled" +compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" +install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "pixman", "freetype-shared", "fontconfig-shared", "libpng-shared", "zlib-shared", "glib", "expat", "libffi", "pcre2"] diff --git a/recipes/incoming-gnome-onda2/fontconfig-shared.toml b/recipes/incoming-gnome-onda2/fontconfig-shared.toml new file mode 100644 index 00000000..2d0cbcd9 --- /dev/null +++ b/recipes/incoming-gnome-onda2/fontconfig-shared.toml @@ -0,0 +1,27 @@ +# fontconfig-shared 2.18.1 — variante DINÁMICA (libfontconfig.so.1, PIC) para el escritorio KDE. +# El canónico (recipes/fontconfig.toml) es --disable-shared (sólo libfontconfig.a sin PIC) ⇒ no enlaza en +# un .so. Lo exige poppler (búsqueda/sustitución de fuentes del PDF) → okular. Deuda Capa 0 del ADR 0011. +# +# expat NO necesita variante: el canónico ya usa --with-pic (su .a lleva objetos PIC, enlazable en .so). +# libpng-shared+zlib-shared: freetype se compila --with-png ⇒ freetype2.pc trae `Requires: libpng` (y +# libpng.pc → zlib); sin ellos pkg-config no resuelve freetype2 y ./configure aborta (gotcha .pc transitivo). +name = "fontconfig-shared" +version = "2.18.1" + +[source] +tarball = "https://gitlab.freedesktop.org/api/v4/projects/890/packages/generic/fontconfig/2.18.1/fontconfig-2.18.1.tar.xz" +sha256 = "2300f3dbfa7253b3a44f4feecdbc8dfa45dde5dc2cfb71fceaf31f394cb41031" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = "./configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc --enable-shared --disable-static --disable-docs" +compile = 'make -j"$(nproc)"' +install = "make install DESTDIR=/out && find /out -name '*.la' -delete" + +[deps] +build = ["freetype-shared", "expat", "pkgconf", "gperf", "python3", "libpng-shared", "zlib-shared"] diff --git a/recipes/incoming-gnome-onda2/freetype-shared.toml b/recipes/incoming-gnome-onda2/freetype-shared.toml new file mode 100644 index 00000000..8643116d --- /dev/null +++ b/recipes/incoming-gnome-onda2/freetype-shared.toml @@ -0,0 +1,31 @@ +# freetype-shared 2.14.3 — variante DINÁMICA (libfreetype.so.6, PIC) para el escritorio KDE. +# El canónico (recipes/freetype.toml) es --disable-shared (sólo libfreetype.a sin PIC) ⇒ no enlaza dentro +# de un .so. Lo exige poppler (rasterizado de fuentes del PDF) → okular. Deuda Capa 0 que el ADR 0011 +# marcaba pendiente ("freetype/fontconfig shared-PIC"). +# +# SIN los 3 patches del canónico (pcf-family-names/subpixel/table-validation-modules): son tweaks de +# rendering de Alpine y viven en recipes/ (copiarlos a esta cola arriesga la colisión de patches homónimos). +# No afectan la corrección del rasterizado que poppler necesita. +# +# --without-harfbuzz: corta el ciclo freetype↔harfbuzz (harfbuzz autodetectaría freetype). --without-brotli: +# no hay brotli sellado (sólo afecta fuentes WOFF2). zlib/png dinámicos vía las variantes -shared. +name = "freetype-shared" +version = "2.14.3" + +[source] +tarball = "https://download.savannah.gnu.org/releases/freetype/freetype-2.14.3.tar.xz" +sha256 = "36bc4f1cc413335368ee656c42afca65c5a3987e8768cc28cf11ba775e785a5f" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static --without-harfbuzz --without-brotli --with-zlib=yes --with-png=yes CPPFLAGS=-I/usr/include LDFLAGS=-L/usr/lib' +compile = 'make -j"$(nproc)"' +install = "make DESTDIR=/out install && find /out -name '*.la' -delete" + +[deps] +build = ["zlib-shared", "libpng-shared", "pkgconf"] diff --git a/recipes/incoming-gnome-onda2/gjs.toml b/recipes/incoming-gnome-onda2/gjs.toml index ef5b3d78..0b790e19 100644 --- a/recipes/incoming-gnome-onda2/gjs.toml +++ b/recipes/incoming-gnome-onda2/gjs.toml @@ -24,13 +24,11 @@ link = "dynamic" [build.phases] # -Dbsymbolic_functions=false: el linker zig/lld NO soporta -Bsymbolic-functions (meson.build:89 aborta). -# cpp_link_args: cairo es dep OBLIGATORIA de gjs (no hay -Dcairo). gjs (dinámico) linkea cairo.a que -# arrastra fontconfig.a→expat, freetype→libpng/zlib, pixman — cadena estática que meson NO pone en la -# línea (sólo -lcairo) ⇒ 'undefined symbol: XML_GetCurrentLineNumber'. Las inyecto explícitas: son -# libs NO-GObject ⇒ embeberlas estáticas NO da doble-estado (a diferencia de --prefer-static con glib, -# que sí daría el SIGSEGV del keystone). Orden = cada lib resuelve símbolos de la anterior. Cuando -# cairo sea isla dinámica (cierre C, #7) esto se limpia. Ver [[gnome-introspection-dinamica]]. -configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Dbsymbolic_functions=false -Dcpp_link_args=-lfontconfig,-lfreetype,-lpixman-1,-lpng16,-lexpat,-lz -Dinstalled_tests=false -Dprofiler=disabled -Dskip_dbus_tests=true -Dskip_gtk_tests=true -Dreadline=enabled -Dc_args=-Wno-error=date-time" +# BLOQUEADO en el link por cairo: cairo es dep OBLIGATORIA (no hay -Dcairo) y el cairo estático arrastra +# fontconfig.a→expat, freetype→png/z, pixman ⇒ 'undefined symbol: XML_GetCurrentLineNumber'. cpp_link_args +# global rompe el sanity-check de meson. Fix real = cairo isla DINÁMICA (cierre C #7): entonces gjs linkea +# libcairo.so con NEEDED libfontconfig.so y la cadena resuelve al cargar. Ver [[gnome-introspection-dinamica]]. +configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Dbsymbolic_functions=false -Dinstalled_tests=false -Dprofiler=disabled -Dskip_dbus_tests=true -Dskip_gtk_tests=true -Dreadline=enabled -Dc_args=-Wno-error=date-time" compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" @@ -41,7 +39,7 @@ install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson ins # glib-introspected: gjs escanea GjsPrivate, que referencia GObject/GLib ⇒ el scan necesita los .gir # CORE (GObject-2.0.gir/GLib-2.0.gir) que SÓLO produce glib-introspected. hammer hidrata deps DIRECTAS, # no transitivas de g-i ⇒ hay que declararla aquí (misma lección del keystone [[gnome-introspection-dinamica]]). -# Cierre .pc (pkgconf resuelve Requires.private de glib-2.0 y cairo, NO transitivo en hammer): -# glib-2.0.pc → libpcre2-8; cairo.pc → freetype/fontconfig/pixman/libpng/expat/zlib. Sin declararlos, -# `meson setup` aborta "Package 'libpcre2-8' required by 'glib-2.0' not found" (patrón .pc→[deps]). -build = ["spidermonkey", "nspr", "glib", "glib-introspected", "cairo", "freetype", "fontconfig", "pixman", "libpng", "expat", "libffi", "readline", "ncurses", "gobject-introspection", "meson", "samurai", "python3", "py3-setuptools", "pkgconf", "pcre2", "zlib"] +# cairo-shared (+ su cierre -shared) = cairo DINÁMICO: gjs linkea libcairo.so y la cadena resuelve por +# NEEDED (no undefined XML_GetCurrentLineNumber). glib-2.0.pc → libpcre2-8 (pcre2 canónico da el .pc). +# pixman canónico ya es dinámico. expat canónico (--with-pic, embebido en el cierre). +build = ["spidermonkey", "nspr", "glib", "glib-introspected", "cairo-shared", "freetype-shared", "fontconfig-shared", "pixman", "libpng-shared", "zlib-shared", "expat", "libffi", "readline", "ncurses", "gobject-introspection", "meson", "samurai", "python3", "py3-setuptools", "pkgconf", "pcre2"] diff --git a/recipes/incoming-gnome-onda2/libpng-shared.toml b/recipes/incoming-gnome-onda2/libpng-shared.toml new file mode 100644 index 00000000..cb9c9ad0 --- /dev/null +++ b/recipes/incoming-gnome-onda2/libpng-shared.toml @@ -0,0 +1,23 @@ +# libpng-shared 1.6.58 — variante DINÁMICA (libpng16.so.16, PIC) para el escritorio KDE. El canónico +# (recipes/libpng.toml) es --disable-shared (sólo libpng16.a sin PIC) ⇒ no enlaza dentro de un .so. Como +# zlib-shared/xz-shared: autotools --enable-shared, zig-cc, contra zlib-shared (libz.so). gwenview linkea. +name = "libpng-shared" +version = "1.6.58" + +[source] +tarball = "https://downloads.sourceforge.net/libpng/libpng-1.6.58.tar.gz" +sha256 = "8c9b05b675ca7301a458df2c2e46f26e1d41ff36b8863f8c33530bc58c2e6225" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static CPPFLAGS=-I/usr/include LDFLAGS=-L/usr/lib' +compile = 'make -j"$(nproc)"' +install = "make DESTDIR=/out install && find /out -name '*.la' -delete" + +[deps] +build = ["zlib-shared", "pkgconf"] diff --git a/recipes/incoming-gnome-onda2/zlib-shared.toml b/recipes/incoming-gnome-onda2/zlib-shared.toml new file mode 100644 index 00000000..35b0de5c --- /dev/null +++ b/recipes/incoming-gnome-onda2/zlib-shared.toml @@ -0,0 +1,33 @@ +# zlib-shared 1.3.1 — variante DINÁMICA de zlib para el escritorio KDE. +# +# El zlib canónico (recipes/zlib.toml) es `--static` (sólo libz.a, para el toolchain rust/mrustc). Pero +# el stack GUI dinámico (Qt/KDE/libpng/Mesa) linkea `libz.so.1` por SONAME en runtime, y ese `.so` no lo +# provee ningún artefacto sellado ⇒ el rootfs hidratado caía a la libz.so.1 del sysroot Alpine (fuga de +# soberanía, deuda static↔dinámico de Capa 0). Esta variante sella el `libz.so.1` soberano: los `.so` de +# KDE ya tienen NEEDED libz.so.1 (mismo soname), así que basta hidratar este artefacto — sin rebuild de KDE. +# +# Build shared: el configure de zlib aborta bajo zig cc ("compiler error reporting too harsh"), así que se +# fabrica el libz.so.1 a mano del libz.a PIC con --whole-archive. CLAVE (fix soberanía): se pasa el +# --version-script=zlib.map del propio tarball ⇒ el .so exporta los símbolos VERSIONADOS (ZLIB_1.2.0 +# compressBound, ZLIB_1.2.3.4 inflateReset2, …). Qt6 (libQt6Core/Gui) fue enlazado contra un zlib +# versionado y NEEDED esos @tags; sin el mapa, un libz.so con nombres pelados no resolvía +# inflateReset2@ZLIB_1.2.3.4 al enlazar gwenview (--no-allow-shlib-undefined) y Qt caía en runtime a la +# libz.so.1 de Alpine (fuga). El .so versionado satisface consumidores versionados Y no-versionados. +# -fPIC/-O2/-fno-sanitize=undefined igual que la canónica (evita el runtime UBSan de zig). + +name = "zlib-shared" +version = "1.3.1" + +[source] +tarball = "https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz" +sha256 = "9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = "CFLAGS='-fPIC -O2 -fno-sanitize=undefined' ./configure --prefix=/usr --static" +compile = "make -j\"$(nproc)\" && ${CC:-zig cc} -shared -Wl,-soname,libz.so.1 -Wl,--version-script,zlib.map -Wl,--whole-archive libz.a -Wl,--no-whole-archive -o libz.so.1.3.1" +install = "make install DESTDIR=/out && install -Dm755 libz.so.1.3.1 /out/usr/lib/libz.so.1.3.1 && ln -sf libz.so.1.3.1 /out/usr/lib/libz.so.1 && ln -sf libz.so.1 /out/usr/lib/libz.so" diff --git a/recipes/incoming-gnome/cairo-shared.toml b/recipes/incoming-gnome/cairo-shared.toml new file mode 100644 index 00000000..9b10f4bd --- /dev/null +++ b/recipes/incoming-gnome/cairo-shared.toml @@ -0,0 +1,32 @@ +# cairo-shared 1.18.4 — variante DINÁMICA de cairo (libcairo.so.2 + libcairo-gobject.so, PIC) para la +# isla GNOME. El canónico (recipes/cairo.toml) es --prefer-static/default_library=static: su cairo.a +# arrastra fontconfig/freetype/pixman/expat como cadena ESTÁTICA que el linker de un consumidor DINÁMICO +# (gjs/pango, sin --prefer-static) no resuelve ⇒ 'undefined symbol: XML_GetCurrentLineNumber' (gjs) y el +# test cairo-ft de pango falla ("FontConfig support"). Con la .so, el consumidor linkea -lcairo y la +# cadena resuelve por NEEDED (libfontconfig.so→libexpat embebido, libfreetype.so→libpng/zlib.so). +# +# Sufijo -shared (NO sombrea recipes/cairo.toml): sólo lo consumen las recetas que lo declaran EXPLÍCITO. +# Deps al cierre -shared (freetype/fontconfig/libpng/zlib) para NEEDED coherentes; pixman canónico ya es +# dinámico (default_library=both); glib = la isla (libcairo-gobject NEEDED libgobject.so isla, sin doble +# estado). expat canónico (--with-pic ⇒ se embebe). Ver [[gnome-introspection-dinamica]]. +name = "cairo-shared" +version = "1.18.4" + +[source] +tarball = "https://cairographics.org/releases/cairo-1.18.4.tar.xz" +sha256 = "445ed8208a6e4823de1226a74ca319d3600e83f6369f99b14265006599c32ccb" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +# default_library=both (no static, sin --prefer-static): produce libcairo.so.2 (+ .a). png/freetype/ +# fontconfig/glib enabled = misma superficie que el canónico. xlib/xcb off (Wayland-only). +configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=both -Dc_args=-Wno-error=date-time -Dtests=disabled -Dxlib=disabled -Dxcb=disabled -Dquartz=disabled -Dtee=disabled -Dsymbol-lookup=disabled -Dspectre=disabled -Dgtk_doc=false -Dpng=enabled -Dfreetype=enabled -Dfontconfig=enabled -Dglib=enabled" +compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" +install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "pixman", "freetype-shared", "fontconfig-shared", "libpng-shared", "zlib-shared", "glib", "expat", "libffi", "pcre2"] diff --git a/recipes/incoming-gnome/fontconfig-shared.toml b/recipes/incoming-gnome/fontconfig-shared.toml new file mode 100644 index 00000000..2d0cbcd9 --- /dev/null +++ b/recipes/incoming-gnome/fontconfig-shared.toml @@ -0,0 +1,27 @@ +# fontconfig-shared 2.18.1 — variante DINÁMICA (libfontconfig.so.1, PIC) para el escritorio KDE. +# El canónico (recipes/fontconfig.toml) es --disable-shared (sólo libfontconfig.a sin PIC) ⇒ no enlaza en +# un .so. Lo exige poppler (búsqueda/sustitución de fuentes del PDF) → okular. Deuda Capa 0 del ADR 0011. +# +# expat NO necesita variante: el canónico ya usa --with-pic (su .a lleva objetos PIC, enlazable en .so). +# libpng-shared+zlib-shared: freetype se compila --with-png ⇒ freetype2.pc trae `Requires: libpng` (y +# libpng.pc → zlib); sin ellos pkg-config no resuelve freetype2 y ./configure aborta (gotcha .pc transitivo). +name = "fontconfig-shared" +version = "2.18.1" + +[source] +tarball = "https://gitlab.freedesktop.org/api/v4/projects/890/packages/generic/fontconfig/2.18.1/fontconfig-2.18.1.tar.xz" +sha256 = "2300f3dbfa7253b3a44f4feecdbc8dfa45dde5dc2cfb71fceaf31f394cb41031" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = "./configure --build=$CBUILD --host=$CHOST --prefix=/usr --sysconfdir=/etc --enable-shared --disable-static --disable-docs" +compile = 'make -j"$(nproc)"' +install = "make install DESTDIR=/out && find /out -name '*.la' -delete" + +[deps] +build = ["freetype-shared", "expat", "pkgconf", "gperf", "python3", "libpng-shared", "zlib-shared"] diff --git a/recipes/incoming-gnome/freetype-shared.toml b/recipes/incoming-gnome/freetype-shared.toml new file mode 100644 index 00000000..8643116d --- /dev/null +++ b/recipes/incoming-gnome/freetype-shared.toml @@ -0,0 +1,31 @@ +# freetype-shared 2.14.3 — variante DINÁMICA (libfreetype.so.6, PIC) para el escritorio KDE. +# El canónico (recipes/freetype.toml) es --disable-shared (sólo libfreetype.a sin PIC) ⇒ no enlaza dentro +# de un .so. Lo exige poppler (rasterizado de fuentes del PDF) → okular. Deuda Capa 0 que el ADR 0011 +# marcaba pendiente ("freetype/fontconfig shared-PIC"). +# +# SIN los 3 patches del canónico (pcf-family-names/subpixel/table-validation-modules): son tweaks de +# rendering de Alpine y viven en recipes/ (copiarlos a esta cola arriesga la colisión de patches homónimos). +# No afectan la corrección del rasterizado que poppler necesita. +# +# --without-harfbuzz: corta el ciclo freetype↔harfbuzz (harfbuzz autodetectaría freetype). --without-brotli: +# no hay brotli sellado (sólo afecta fuentes WOFF2). zlib/png dinámicos vía las variantes -shared. +name = "freetype-shared" +version = "2.14.3" + +[source] +tarball = "https://download.savannah.gnu.org/releases/freetype/freetype-2.14.3.tar.xz" +sha256 = "36bc4f1cc413335368ee656c42afca65c5a3987e8768cc28cf11ba775e785a5f" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static --without-harfbuzz --without-brotli --with-zlib=yes --with-png=yes CPPFLAGS=-I/usr/include LDFLAGS=-L/usr/lib' +compile = 'make -j"$(nproc)"' +install = "make DESTDIR=/out install && find /out -name '*.la' -delete" + +[deps] +build = ["zlib-shared", "libpng-shared", "pkgconf"] diff --git a/recipes/incoming-gnome/gjs.toml b/recipes/incoming-gnome/gjs.toml index ef5b3d78..0b790e19 100644 --- a/recipes/incoming-gnome/gjs.toml +++ b/recipes/incoming-gnome/gjs.toml @@ -24,13 +24,11 @@ link = "dynamic" [build.phases] # -Dbsymbolic_functions=false: el linker zig/lld NO soporta -Bsymbolic-functions (meson.build:89 aborta). -# cpp_link_args: cairo es dep OBLIGATORIA de gjs (no hay -Dcairo). gjs (dinámico) linkea cairo.a que -# arrastra fontconfig.a→expat, freetype→libpng/zlib, pixman — cadena estática que meson NO pone en la -# línea (sólo -lcairo) ⇒ 'undefined symbol: XML_GetCurrentLineNumber'. Las inyecto explícitas: son -# libs NO-GObject ⇒ embeberlas estáticas NO da doble-estado (a diferencia de --prefer-static con glib, -# que sí daría el SIGSEGV del keystone). Orden = cada lib resuelve símbolos de la anterior. Cuando -# cairo sea isla dinámica (cierre C, #7) esto se limpia. Ver [[gnome-introspection-dinamica]]. -configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Dbsymbolic_functions=false -Dcpp_link_args=-lfontconfig,-lfreetype,-lpixman-1,-lpng16,-lexpat,-lz -Dinstalled_tests=false -Dprofiler=disabled -Dskip_dbus_tests=true -Dskip_gtk_tests=true -Dreadline=enabled -Dc_args=-Wno-error=date-time" +# BLOQUEADO en el link por cairo: cairo es dep OBLIGATORIA (no hay -Dcairo) y el cairo estático arrastra +# fontconfig.a→expat, freetype→png/z, pixman ⇒ 'undefined symbol: XML_GetCurrentLineNumber'. cpp_link_args +# global rompe el sanity-check de meson. Fix real = cairo isla DINÁMICA (cierre C #7): entonces gjs linkea +# libcairo.so con NEEDED libfontconfig.so y la cadena resuelve al cargar. Ver [[gnome-introspection-dinamica]]. +configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Dbsymbolic_functions=false -Dinstalled_tests=false -Dprofiler=disabled -Dskip_dbus_tests=true -Dskip_gtk_tests=true -Dreadline=enabled -Dc_args=-Wno-error=date-time" compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" @@ -41,7 +39,7 @@ install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson ins # glib-introspected: gjs escanea GjsPrivate, que referencia GObject/GLib ⇒ el scan necesita los .gir # CORE (GObject-2.0.gir/GLib-2.0.gir) que SÓLO produce glib-introspected. hammer hidrata deps DIRECTAS, # no transitivas de g-i ⇒ hay que declararla aquí (misma lección del keystone [[gnome-introspection-dinamica]]). -# Cierre .pc (pkgconf resuelve Requires.private de glib-2.0 y cairo, NO transitivo en hammer): -# glib-2.0.pc → libpcre2-8; cairo.pc → freetype/fontconfig/pixman/libpng/expat/zlib. Sin declararlos, -# `meson setup` aborta "Package 'libpcre2-8' required by 'glib-2.0' not found" (patrón .pc→[deps]). -build = ["spidermonkey", "nspr", "glib", "glib-introspected", "cairo", "freetype", "fontconfig", "pixman", "libpng", "expat", "libffi", "readline", "ncurses", "gobject-introspection", "meson", "samurai", "python3", "py3-setuptools", "pkgconf", "pcre2", "zlib"] +# cairo-shared (+ su cierre -shared) = cairo DINÁMICO: gjs linkea libcairo.so y la cadena resuelve por +# NEEDED (no undefined XML_GetCurrentLineNumber). glib-2.0.pc → libpcre2-8 (pcre2 canónico da el .pc). +# pixman canónico ya es dinámico. expat canónico (--with-pic, embebido en el cierre). +build = ["spidermonkey", "nspr", "glib", "glib-introspected", "cairo-shared", "freetype-shared", "fontconfig-shared", "pixman", "libpng-shared", "zlib-shared", "expat", "libffi", "readline", "ncurses", "gobject-introspection", "meson", "samurai", "python3", "py3-setuptools", "pkgconf", "pcre2"] diff --git a/recipes/incoming-gnome/libpng-shared.toml b/recipes/incoming-gnome/libpng-shared.toml new file mode 100644 index 00000000..cb9c9ad0 --- /dev/null +++ b/recipes/incoming-gnome/libpng-shared.toml @@ -0,0 +1,23 @@ +# libpng-shared 1.6.58 — variante DINÁMICA (libpng16.so.16, PIC) para el escritorio KDE. El canónico +# (recipes/libpng.toml) es --disable-shared (sólo libpng16.a sin PIC) ⇒ no enlaza dentro de un .so. Como +# zlib-shared/xz-shared: autotools --enable-shared, zig-cc, contra zlib-shared (libz.so). gwenview linkea. +name = "libpng-shared" +version = "1.6.58" + +[source] +tarball = "https://downloads.sourceforge.net/libpng/libpng-1.6.58.tar.gz" +sha256 = "8c9b05b675ca7301a458df2c2e46f26e1d41ff36b8863f8c33530bc58c2e6225" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static CPPFLAGS=-I/usr/include LDFLAGS=-L/usr/lib' +compile = 'make -j"$(nproc)"' +install = "make DESTDIR=/out install && find /out -name '*.la' -delete" + +[deps] +build = ["zlib-shared", "pkgconf"] diff --git a/recipes/incoming-gnome/zlib-shared.toml b/recipes/incoming-gnome/zlib-shared.toml new file mode 100644 index 00000000..35b0de5c --- /dev/null +++ b/recipes/incoming-gnome/zlib-shared.toml @@ -0,0 +1,33 @@ +# zlib-shared 1.3.1 — variante DINÁMICA de zlib para el escritorio KDE. +# +# El zlib canónico (recipes/zlib.toml) es `--static` (sólo libz.a, para el toolchain rust/mrustc). Pero +# el stack GUI dinámico (Qt/KDE/libpng/Mesa) linkea `libz.so.1` por SONAME en runtime, y ese `.so` no lo +# provee ningún artefacto sellado ⇒ el rootfs hidratado caía a la libz.so.1 del sysroot Alpine (fuga de +# soberanía, deuda static↔dinámico de Capa 0). Esta variante sella el `libz.so.1` soberano: los `.so` de +# KDE ya tienen NEEDED libz.so.1 (mismo soname), así que basta hidratar este artefacto — sin rebuild de KDE. +# +# Build shared: el configure de zlib aborta bajo zig cc ("compiler error reporting too harsh"), así que se +# fabrica el libz.so.1 a mano del libz.a PIC con --whole-archive. CLAVE (fix soberanía): se pasa el +# --version-script=zlib.map del propio tarball ⇒ el .so exporta los símbolos VERSIONADOS (ZLIB_1.2.0 +# compressBound, ZLIB_1.2.3.4 inflateReset2, …). Qt6 (libQt6Core/Gui) fue enlazado contra un zlib +# versionado y NEEDED esos @tags; sin el mapa, un libz.so con nombres pelados no resolvía +# inflateReset2@ZLIB_1.2.3.4 al enlazar gwenview (--no-allow-shlib-undefined) y Qt caía en runtime a la +# libz.so.1 de Alpine (fuga). El .so versionado satisface consumidores versionados Y no-versionados. +# -fPIC/-O2/-fno-sanitize=undefined igual que la canónica (evita el runtime UBSan de zig). + +name = "zlib-shared" +version = "1.3.1" + +[source] +tarball = "https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz" +sha256 = "9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = "CFLAGS='-fPIC -O2 -fno-sanitize=undefined' ./configure --prefix=/usr --static" +compile = "make -j\"$(nproc)\" && ${CC:-zig cc} -shared -Wl,-soname,libz.so.1 -Wl,--version-script,zlib.map -Wl,--whole-archive libz.a -Wl,--no-whole-archive -o libz.so.1.3.1" +install = "make install DESTDIR=/out && install -Dm755 libz.so.1.3.1 /out/usr/lib/libz.so.1.3.1 && ln -sf libz.so.1.3.1 /out/usr/lib/libz.so.1 && ln -sf libz.so.1 /out/usr/lib/libz.so"