From f6b31ea3ddd5036c6837820599cc5457695da0e4 Mon Sep 17 00:00:00 2001 From: sergio Date: Thu, 2 Jul 2026 10:53:23 -0400 Subject: [PATCH] =?UTF-8?q?Etapa=20G=20(GUI):=20cairo=20construye=20bajo?= =?UTF-8?q?=20zig=20=E2=80=94=20patch=20fuerza=20HAVE=5FCTIME=5FR=20+=20sa?= =?UTF-8?q?lta=20utils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El probe has_function('ctime_r') de meson corre sin prefix de header ⇒ prototipo desnudo que bajo zig-cc/gcc+musl choca con el builtin y FALLA ⇒ cairo-ps-surface.c:105 define un fallback static que colisiona con (error duro, tanto zig como gcc; _GNU_SOURCE en c_args no alcanza). El patch fuerza HAVE_CTIME_R=1 tras el loop. Segundo hunk: salta los ejecutables util csi-*/cairo-trace, que no linkean libpixman-1.a bajo la estrategia no_fallback de zig — son dev-tools, no la librería que pango/gtk4 consumen. Resultado: cairo 1.18.4 sella desde fuente (store c7b8703f), destraba el rebuild de la cadena GUI que el drift de fontconfig/freetype había forzado. Cierra la Opción A (inviable) con la B real. Co-Authored-By: Claude Opus 4.8 --- recipes/cairo-ctime-r.patch | 44 +++++++++++++++++++++++++++++++++++++ recipes/cairo.toml | 2 ++ 2 files changed, 46 insertions(+) create mode 100644 recipes/cairo-ctime-r.patch diff --git a/recipes/cairo-ctime-r.patch b/recipes/cairo-ctime-r.patch new file mode 100644 index 00000000..9abb7b05 --- /dev/null +++ b/recipes/cairo-ctime-r.patch @@ -0,0 +1,44 @@ +cairo bajo zig-cc/musl: dos parches para poder construir la librería en la granja. + +(1) meson.build — el loop `foreach name : check_funcs` corre `cc.has_function('ctime_r')` SIN +prefix de header ⇒ meson genera un prototipo desnudo `char ctime_r();` que bajo zig-cc y gcc +sobre musl choca con el builtin y el probe FALLA. Entonces cairo-ps-surface.c:105 +(`#ifndef HAVE_CTIME_R`) define un fallback `static char *ctime_r(...)` que colisiona con la +declaración no-static de (presente porque el build define _GNU_SOURCE) ⇒ error duro. +musl SIEMPRE provee ctime_r; forzamos el define tras el loop (pasar _GNU_SOURCE en c_args NO +alcanza: el probe es de prototipo desnudo, ignora el header). + +(2) util/meson.build — los ejecutables util (csi-* del intérprete cairo-script, cairo-trace) no +linkean libpixman-1.a bajo la estrategia `no_fallback` de zig-cc. Son herramientas de dev, no la +librería que pango/gtk4 consumen. Saltamos esos subdirs; libcairo.a se construye e instala igual. + +diff -Naur a/meson.build b/meson.build +--- a/meson.build ++++ b/meson.build +@@ -708,4 +708,9 @@ + endif + endforeach + ++# hammer: has_function('ctime_r') sin prefix falla bajo zig/gcc+musl (prototipo desnudo choca ++# con el builtin); musl SIEMPRE provee ctime_r => forzar y evitar el fallback static de ++# cairo-ps-surface.c:105 que colisiona con la declaracion no-static de . ++conf.set('HAVE_CTIME_R', 1) ++ + conf.set('HAVE_STRNDUP', cc.has_function('strndup', prefix : '#include ')) +diff -Naur a/util/meson.build b/util/meson.build +--- a/util/meson.build ++++ b/util/meson.build +@@ -7,10 +7,10 @@ + endif + +-if conf.get('CAIRO_HAS_INTERPRETER', 0) == 1 ++if false # hammer: saltar ejecutables csi-* (interprete); link de pixman falla bajo zig no_fallback + subdir('cairo-script') + else + libcairoscript_dep = dependency('', required: false) + endif + +-if conf.get('CAIRO_HAS_TRACE', 0) == 1 ++if false # hammer: saltar cairo-trace (mismo link de pixman bajo zig) + subdir('cairo-trace') + diff --git a/recipes/cairo.toml b/recipes/cairo.toml index c703451b..e769aa68 100644 --- a/recipes/cairo.toml +++ b/recipes/cairo.toml @@ -4,6 +4,8 @@ version = "1.18.4" [source] tarball = "https://gitlab.freedesktop.org/cairo/cairo/-/archive/1.18.4/cairo-1.18.4.tar.bz2" sha256 = "6d9281e786fd289d382324d4588d59973a36911e1865b40e64f9ec39936ceba8" +# fuerza HAVE_CTIME_R: el probe has_function de meson falla bajo zig/gcc+musl (ver el .patch) +patches = ["cairo-ctime-r.patch"] [build] compiler = "zig-cc" target = "x86_64-linux-musl"