Etapa G (GUI): cairo construye bajo zig — patch fuerza HAVE_CTIME_R + salta utils

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 <time.h> (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 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 10:53:23 -04:00
co-authored by Claude Opus 4.8
parent d3da07fb3e
commit f6b31ea3dd
2 changed files with 46 additions and 0 deletions
+44
View File
@@ -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 <time.h> (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 <time.h>.
+conf.set('HAVE_CTIME_R', 1)
+
conf.set('HAVE_STRNDUP', cc.has_function('strndup', prefix : '#include <string.h>'))
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')
</content>
+2
View File
@@ -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"