tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

⎇ main recipes/poppler-glib.toml TOML · 130 líneas · 7.8 KB Historia crudo

apps: zathura + backend de PDF, en gnome/cosmic/sway — y tres defectos de imagen que salieron da0186d25 · Sergio ·

1# poppler 25.02.0, frontend GLIB — el motor de PDF del corpus. Es el backend de `zathura`.
2#
3# ══ POR QUÉ UNA SEGUNDA POPPLER, Y CUÁL ES EL PELIGRO ══════════════════════════════════════════
4# Ya existe `incoming-kde/poppler`, pero no sirve acá por DOS razones independientes, y las dos
5# hacen falta para justificar la variante:
6#   1. **Va `-DENABLE_GLIB=OFF`** ⇒ publica `libpoppler.so` y `poppler.pc` pero NO `poppler-glib`,
7#      que es contra lo que se escribe un backend de zathura. Medido con `scripts/provee.py`, no
8#      supuesto: `poppler-glib` no lo publica NADIE en ninguna cola.
9#   2. **Vive en una cola** ⇒ una receta del corpus no la alcanza (sibling-first, después el padre,
10#      nunca una cola hermana).
11# Y no se puede arreglar encendiendo GLIB allá: esa receta trae Qt6 y todo X11 en sus `[deps]`, que
12# es exactamente lo que el corpus no puede ni quiere.
13#
14# ⚠ **PELIGRO REAL, escrito para que no se descubra en una imagen: las dos instalan
15# `/usr/lib/libpoppler.so.146`.** Mientras cada una la resuelva su propia cola no pasa nada —el
16# hash decide, y son artefactos DISTINTOS—, pero una imagen que hidrate las dos pone dos ficheros
17# distintos en la misma ruta y gana el que se proyecte último. Es el cuadro de las dos glib.
18# Por eso `zathura` NO se declara en el perfil `escritorio-kde`: esa imagen ya trae `okular`, que
19# arrastra la poppler de Qt6. Si alguna vez se quiere zathura en KDE, la salida NO es listarla: es
20# jubilar una de las dos popplers. Ver el comentario de `zathura` en `targets.toml`.
21#
22# ══ QUÉ QUEDA APAGADO Y QUÉ SE PIERDE ══════════════════════════════════════════════════════════
23# Mismo recorte que la de KDE, con los frontends dados vuelta: GLIB ON, QT5/QT6/CPP/UTILS OFF.
24# `ENABLE_LIBOPENJPEG=none` ⇒ las imágenes JPEG2000 DENTRO de un PDF no renderizan (el resto sí);
25# no hay receta `openjpeg` y no vale abrir una campaña por eso. NSS3/GPGME OFF ⇒ no se verifican
26# firmas de PDF. LIBCURL OFF ⇒ no se abren PDF por URL. LIBTIFF OFF, BOOST OFF (sólo perf de Splash).
27# `ENABLE_GOBJECT_INTROSPECTION=OFF`: acá nadie introspecta: zathura es C que enlaza y ya, y traerla
28# metería la maquinaria de GNOME en la clausura de las cuatro imágenes. Mismo criterio que json-glib.
29#
30# El sustrato son las variantes `-shared` porque esto produce `.so`: el `.a` canónico de freetype y
31# fontconfig no enlaza dentro de una biblioteca compartida. `cairo` sí entra desde el `.a` del
32# corpus, y no es por suerte — se midió: `readelf -r libcairo.a` da CERO `R_X86_64_32` fuera de las
33# secciones `.debug_*`, o sea que es reubicable. (Contar sin excluir `.debug` MIENTE; es la
34# corrección que dejó escrita el frente de GNOME.)
35#
36# El wrapper `.zwrap` que filtra `-Wl,--fatal-warnings` es el mismo de la receta de KDE y por lo
37# mismo: cmake se lo pasa al linker y zig cc convierte avisos benignos en errores.
38#
39# ══ ⚠ `glib-shared` Y NO `glib`, Y ES LA DECISIÓN QUE HACE FUNCIONAR TODO EL VISOR ═════════════
40# Con la `glib` ESTÁTICA del corpus esto sella igual y zathura arranca — y al cargar el plugin de
41# PDF escupe `GLib-GObject-CRITICAL: cannot register existing type 'gchar'` y no abre nada.
42# Es el cuadro de las dos glib, en vivo y en su forma menos obvia: **no son dos ficheros en la misma
43# ruta, son dos COPIAS ESTÁTICAS del sistema de tipos de GObject dentro del MISMO proceso.**
44# El ejecutable trae la suya, `libpoppler-glib.so` trae la suya, y el `g_type_register_*` del
45# segundo encuentra los tipos fundamentales ya registrados por el primero.
46# Un `.a` no arrastra a sus deps —`libgtk-4.a`, `libcairo.a` y `libgirara.a` sólo tienen símbolos
47# sin definir y se resuelven al ligar el ejecutable, así que ésos NO duplican nada—; el problema
48# aparece únicamente cuando **dos objetos ENLAZADOS por separado** (un `.so` y el ejecutable que lo
49# hace dlopen) meten cada uno su copia. Por eso la regla del repo se aplica al revés que de
50# costumbre: acá lo correcto es compartir el SONAME `libglib-2.0.so.0`, y por eso esta receta y
51# `zathura` y `zathura-pdf-poppler` declaran las TRES `glib-shared`. Si alguna vuelve a `glib`,
52# el visor deja de abrir PDFs y el build no se entera.
53#
54# ══ ⚠ `-DENABLE_GLIB=ON` SE APAGA SOLO Y EL BUILD SALE OK — LA TRAMPA QUE COSTÓ UN CICLO ════════
55# `CMakeLists.txt:260-261` hace `if(NOT CAIRO_FOUND) set(ENABLE_GLIB OFF)`. **No falla: obedece
56# distinto.** El primer intento selló un artefacto con `libpoppler.so` y `poppler.pc` y NADA de
57# glib, con exit 0 y sin un aviso a la vista. Es la figura de siempre: un ausente falla ruidosamente,
58# un desviado llega hasta el final diciendo que todo fue bien.
59#
60# La causa era una línea que este repo ya tiene escrita como patrón y que igual se pasa por alto:
61# **`.pc Requires` → `[deps].build`**. `cairo.pc` declara
62# `Requires: zlib, libpng, fontconfig, freetype2, pixman-1`, y `pixman` NO estaba en `[deps]`.
63# pkg-config resuelve `Requires` transitivamente, así que sin `pixman-1.pc` en el sandbox
64# `pkg-config --exists cairo` da FALSO — y cairo estaba ahí, entera y PIC. Un `.pc` que falta a tres
65# saltos de distancia apaga una FUNCIÓN, no una librería.
66#
67# Por eso el `install` termina comprobando que `poppler-glib.pc` y `libpoppler-glib.so` existan.
68# No es paranoia: es el único punto donde este modo de fallar se puede ver. Si alguien toca las
69# `[deps]` y vuelve a romper la cadena de pkg-config, el build muere acá en vez de sellar un
70# artefacto que le miente a `zathura`.
71name    = "poppler-glib"
72version = "25.02.0"
73license = "GPL-2.0-or-later"
74
75[source]
76tarball = "https://poppler.freedesktop.org/poppler-25.02.0.tar.xz"
77sha256  = "21234cb2a9647d73c752ce4031e65a79d11a511a835f2798284c2497b8701dee"
78
79[build]
80compiler = "zig-cc"
81target   = "x86_64-linux-musl"
82link     = "dynamic"
83flags    = []
84
85[build.phases]
86configure = '''
87ZW="$PWD/.zwrap"; mkdir -p "$ZW"
88cat > "$ZW/cc"  <<'W'
89#!/bin/sh
90a=""; for x in "$@"; do [ "$x" = "-Wl,--fatal-warnings" ] && continue; a="$a $x"; done
91exec /opt/zig/zig cc -mcpu=baseline $a
92W
93cat > "$ZW/cxx" <<'W'
94#!/bin/sh
95a=""; for x in "$@"; do [ "$x" = "-Wl,--fatal-warnings" ] && continue; a="$a $x"; done
96exec /opt/zig/zig c++ -mcpu=baseline $a
97W
98chmod +x "$ZW/cc" "$ZW/cxx"
99cmake -B build -G Ninja -Wno-dev \
100  -DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" \
101  -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_PREFIX_PATH=/usr \
102  -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF -DBUILD_SHARED_LIBS=ON \
103  -DENABLE_QT5=OFF -DENABLE_QT6=OFF -DENABLE_GLIB=ON -DENABLE_GOBJECT_INTROSPECTION=OFF \
104  -DENABLE_CPP=OFF -DENABLE_UTILS=OFF -DENABLE_BOOST=OFF \
105  -DENABLE_LIBOPENJPEG=none -DENABLE_DCTDECODER=libjpeg -DENABLE_LCMS=ON \
106  -DENABLE_LIBCURL=OFF -DENABLE_LIBTIFF=OFF -DENABLE_NSS3=OFF -DENABLE_GPGME=OFF \
107  -DBUILD_GTK_TESTS=OFF -DBUILD_QT5_TESTS=OFF -DBUILD_QT6_TESTS=OFF -DBUILD_CPP_TESTS=OFF \
108  -DBUILD_MANUAL_TESTS=OFF
109'''
110compile = "cmake --build build"
111install = '''
112set -e
113DESTDIR=/out cmake --install build
114# Ver la cabecera: sin esto, un cairo que pkg-config no encuentra sella una poppler SIN glib y el
115# build reporta éxito. Se comprueba lo que esta receta EXISTE para producir.
116test -f /out/usr/lib/pkgconfig/poppler-glib.pc || {
117  echo "ERROR: no se generó poppler-glib.pc — cmake apagó ENABLE_GLIB (¿CAIRO_FOUND falso?)" >&2
118  exit 1
119}
120test -e /out/usr/lib/libpoppler-glib.so || {
121  echo "ERROR: no se generó libpoppler-glib.so pese a existir el .pc" >&2
122  exit 1
123}
124'''
125
126[deps]
127build = ["cmake", "samurai", "python3", "pkgconf", "gettext-tiny", "gperf",
128  "glib-shared", "pcre2-shared", "cairo", "pixman", "libffi",
129  "freetype-shared", "fontconfig-shared", "expat", "lcms2",
130  "libjpeg-turbo-shared", "libpng-shared", "zlib-shared"]