La cadena: 5 recetas nuevas (girara, xxhash, poppler-glib, zathura,
zathura-pdf-poppler) y 5 promociones GRATIS al corpus (json-glib, lcms2, glib-shared,
pcre2-shared, bzip2-shared — todas con hash idéntico desde la cola y desde el corpus,
medido con hammer hash antes de mover nada).
NO va en escritorio-kde, y está escrito en tres sitios para que no se liste por
descuido: su backend necesita una poppler con ENABLE_GLIB=ON, y esa imagen ya trae la
de Qt6 vía okular. Las dos instalan /usr/lib/libpoppler.so.146 y son artefactos
DISTINTOS ⇒ hidratar las dos pone dos ficheros en la misma ruta. La salida no sería
listarla igual, sería jubilar una de las dos popplers.
LAS TRES COSAS QUE SE ROMPIERON, que valen más que las recetas:
1. -DENABLE_GLIB=ON SE APAGA SOLO Y EL BUILD SALE OK. CMakeLists:260 hace
`if(NOT CAIRO_FOUND) set(ENABLE_GLIB OFF)`: no falla, obedece distinto. El primer
artefacto selló sin nada de glib, exit 0, sin aviso. La causa era una línea que este
repo ya tiene como patrón: `.pc Requires` → `[deps].build`. cairo.pc pide pixman-1 y
pixman no estaba declarado ⇒ `pkg-config --exists cairo` falso ⇒ CAIRO_FOUND falso.
Un .pc que falta a tres saltos apaga una FUNCIÓN, no una librería. La receta ahora
comprueba en install que poppler-glib.pc y libpoppler-glib.so existan.
2. DOS COPIAS ESTÁTICAS DE GObject EN UN PROCESO. Con la glib estática del corpus todo
sella y zathura arranca — y al dlopen del plugin escupe «cannot register existing
type 'gchar'» y no abre nada. No son dos ficheros en una ruta: son dos copias del
sistema de tipos dentro del mismo proceso, una en el ejecutable y otra dentro de
libpoppler-glib.so. Un .a NO duplica (sólo tiene símbolos sin definir, se resuelven
al ligar); el problema aparece sólo cuando dos objetos enlazados por separado meten
cada uno la suya. Arreglo: las TRES recetas de la cadena declaran glib-shared.
3. FUGA AL LAB, cazada por scripts/vigia-sonames.py: zathura selló con
NEEDED libsqlite3.so.0, un SONAME que ningún artefacto del cierre publica — meson
había resuelto dependency('sqlite3') contra el sysroot Alpine DEL LAB. Y declarar la
dep NO alcanzó: el .pc da un -lsqlite3 pelado y el linker prefiere la .so del lab
sobre la .a del store. Lo arregla -Dprefer_static=true. Medido: los NEEDED bajaron de
DIEZ a CUATRO y los cuatro los publica el cierre.
DOS DEFECTOS DE IMAGEN PREEXISTENTES que salieron de paso:
- libbz2.so.1 no lo publicaba nadie y freetype-shared lo pide, en los TRES perfiles.
Se vio de verdad al probar el visor (el plugin no hacía dlopen). bzip2-shared existía
sólo en incoming-kde; promovida y puesta de raíz junto a expat-shared/libffi-shared.
- escritorio-gnome NO TRAÍA NI UN FICHERO DE FUENTE. Contado sobre los artefactos del
cierre: gnome=0, sway=22, kde=1 (una de rebote dentro de qtbase). Tenía fontconfig,
que es el MOTOR que busca fuentes, no una fuente. Un PDF con base-14 se ve VACÍO y sin
error. Añadida dejavu-fonts, la única receta de fuentes del catálogo entero.
⚠ KDE queda igual y NO se toca acá: no lleva zathura y su árbol lo trabaja otro frente.
EVIDENCIA DE QUE ANDA, no de que sella:
- `zathura --version` con el plugin lista «(plugin) pdf-poppler (2026.07.18)» sin un
solo GObject-CRITICAL.
- poppler-render-check, receta-TESTIGO en el espíritu de gtk4-hello: arma un PDF a mano,
lo abre con poppler-glib, lo rasteriza sobre cairo y CUENTA PÍXELES — 9600 negros,
exactamente el rectángulo de 160x60. Un lienzo blanco no pasa. Su primera versión
medía el TEXTO y falló: el sandbox no tiene fuentes, que es cómo se descubrió el
hueco de arriba. El assert quedó sobre el rectángulo, que no depende de tipografía, y
el texto se informa aparte.
Los cinco grafos quedan en N/N con cero deuda.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XB2iEmxeLZgzqNfhWChrLo
131 lines
7.8 KiB
TOML
131 lines
7.8 KiB
TOML
# poppler 25.02.0, frontend GLIB — el motor de PDF del corpus. Es el backend de `zathura`.
|
|
#
|
|
# ══ POR QUÉ UNA SEGUNDA POPPLER, Y CUÁL ES EL PELIGRO ══════════════════════════════════════════
|
|
# Ya existe `incoming-kde/poppler`, pero no sirve acá por DOS razones independientes, y las dos
|
|
# hacen falta para justificar la variante:
|
|
# 1. **Va `-DENABLE_GLIB=OFF`** ⇒ publica `libpoppler.so` y `poppler.pc` pero NO `poppler-glib`,
|
|
# que es contra lo que se escribe un backend de zathura. Medido con `scripts/provee.py`, no
|
|
# supuesto: `poppler-glib` no lo publica NADIE en ninguna cola.
|
|
# 2. **Vive en una cola** ⇒ una receta del corpus no la alcanza (sibling-first, después el padre,
|
|
# nunca una cola hermana).
|
|
# Y no se puede arreglar encendiendo GLIB allá: esa receta trae Qt6 y todo X11 en sus `[deps]`, que
|
|
# es exactamente lo que el corpus no puede ni quiere.
|
|
#
|
|
# ⚠ **PELIGRO REAL, escrito para que no se descubra en una imagen: las dos instalan
|
|
# `/usr/lib/libpoppler.so.146`.** Mientras cada una la resuelva su propia cola no pasa nada —el
|
|
# hash decide, y son artefactos DISTINTOS—, pero una imagen que hidrate las dos pone dos ficheros
|
|
# distintos en la misma ruta y gana el que se proyecte último. Es el cuadro de las dos glib.
|
|
# Por eso `zathura` NO se declara en el perfil `escritorio-kde`: esa imagen ya trae `okular`, que
|
|
# arrastra la poppler de Qt6. Si alguna vez se quiere zathura en KDE, la salida NO es listarla: es
|
|
# jubilar una de las dos popplers. Ver el comentario de `zathura` en `targets.toml`.
|
|
#
|
|
# ══ QUÉ QUEDA APAGADO Y QUÉ SE PIERDE ══════════════════════════════════════════════════════════
|
|
# Mismo recorte que la de KDE, con los frontends dados vuelta: GLIB ON, QT5/QT6/CPP/UTILS OFF.
|
|
# `ENABLE_LIBOPENJPEG=none` ⇒ las imágenes JPEG2000 DENTRO de un PDF no renderizan (el resto sí);
|
|
# no hay receta `openjpeg` y no vale abrir una campaña por eso. NSS3/GPGME OFF ⇒ no se verifican
|
|
# firmas de PDF. LIBCURL OFF ⇒ no se abren PDF por URL. LIBTIFF OFF, BOOST OFF (sólo perf de Splash).
|
|
# `ENABLE_GOBJECT_INTROSPECTION=OFF`: acá nadie introspecta: zathura es C que enlaza y ya, y traerla
|
|
# metería la maquinaria de GNOME en la clausura de las cuatro imágenes. Mismo criterio que json-glib.
|
|
#
|
|
# El sustrato son las variantes `-shared` porque esto produce `.so`: el `.a` canónico de freetype y
|
|
# fontconfig no enlaza dentro de una biblioteca compartida. `cairo` sí entra desde el `.a` del
|
|
# corpus, y no es por suerte — se midió: `readelf -r libcairo.a` da CERO `R_X86_64_32` fuera de las
|
|
# secciones `.debug_*`, o sea que es reubicable. (Contar sin excluir `.debug` MIENTE; es la
|
|
# corrección que dejó escrita el frente de GNOME.)
|
|
#
|
|
# El wrapper `.zwrap` que filtra `-Wl,--fatal-warnings` es el mismo de la receta de KDE y por lo
|
|
# mismo: cmake se lo pasa al linker y zig cc convierte avisos benignos en errores.
|
|
#
|
|
# ══ ⚠ `glib-shared` Y NO `glib`, Y ES LA DECISIÓN QUE HACE FUNCIONAR TODO EL VISOR ═════════════
|
|
# Con la `glib` ESTÁTICA del corpus esto sella igual y zathura arranca — y al cargar el plugin de
|
|
# PDF escupe `GLib-GObject-CRITICAL: cannot register existing type 'gchar'` y no abre nada.
|
|
# Es el cuadro de las dos glib, en vivo y en su forma menos obvia: **no son dos ficheros en la misma
|
|
# ruta, son dos COPIAS ESTÁTICAS del sistema de tipos de GObject dentro del MISMO proceso.**
|
|
# El ejecutable trae la suya, `libpoppler-glib.so` trae la suya, y el `g_type_register_*` del
|
|
# segundo encuentra los tipos fundamentales ya registrados por el primero.
|
|
# Un `.a` no arrastra a sus deps —`libgtk-4.a`, `libcairo.a` y `libgirara.a` sólo tienen símbolos
|
|
# sin definir y se resuelven al ligar el ejecutable, así que ésos NO duplican nada—; el problema
|
|
# aparece únicamente cuando **dos objetos ENLAZADOS por separado** (un `.so` y el ejecutable que lo
|
|
# hace dlopen) meten cada uno su copia. Por eso la regla del repo se aplica al revés que de
|
|
# costumbre: acá lo correcto es compartir el SONAME `libglib-2.0.so.0`, y por eso esta receta y
|
|
# `zathura` y `zathura-pdf-poppler` declaran las TRES `glib-shared`. Si alguna vuelve a `glib`,
|
|
# el visor deja de abrir PDFs y el build no se entera.
|
|
#
|
|
# ══ ⚠ `-DENABLE_GLIB=ON` SE APAGA SOLO Y EL BUILD SALE OK — LA TRAMPA QUE COSTÓ UN CICLO ════════
|
|
# `CMakeLists.txt:260-261` hace `if(NOT CAIRO_FOUND) set(ENABLE_GLIB OFF)`. **No falla: obedece
|
|
# distinto.** El primer intento selló un artefacto con `libpoppler.so` y `poppler.pc` y NADA de
|
|
# glib, con exit 0 y sin un aviso a la vista. Es la figura de siempre: un ausente falla ruidosamente,
|
|
# un desviado llega hasta el final diciendo que todo fue bien.
|
|
#
|
|
# La causa era una línea que este repo ya tiene escrita como patrón y que igual se pasa por alto:
|
|
# **`.pc Requires` → `[deps].build`**. `cairo.pc` declara
|
|
# `Requires: zlib, libpng, fontconfig, freetype2, pixman-1`, y `pixman` NO estaba en `[deps]`.
|
|
# pkg-config resuelve `Requires` transitivamente, así que sin `pixman-1.pc` en el sandbox
|
|
# `pkg-config --exists cairo` da FALSO — y cairo estaba ahí, entera y PIC. Un `.pc` que falta a tres
|
|
# saltos de distancia apaga una FUNCIÓN, no una librería.
|
|
#
|
|
# Por eso el `install` termina comprobando que `poppler-glib.pc` y `libpoppler-glib.so` existan.
|
|
# No es paranoia: es el único punto donde este modo de fallar se puede ver. Si alguien toca las
|
|
# `[deps]` y vuelve a romper la cadena de pkg-config, el build muere acá en vez de sellar un
|
|
# artefacto que le miente a `zathura`.
|
|
name = "poppler-glib"
|
|
version = "25.02.0"
|
|
license = "GPL-2.0-or-later"
|
|
|
|
[source]
|
|
tarball = "https://poppler.freedesktop.org/poppler-25.02.0.tar.xz"
|
|
sha256 = "21234cb2a9647d73c752ce4031e65a79d11a511a835f2798284c2497b8701dee"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "dynamic"
|
|
flags = []
|
|
|
|
[build.phases]
|
|
configure = '''
|
|
ZW="$PWD/.zwrap"; mkdir -p "$ZW"
|
|
cat > "$ZW/cc" <<'W'
|
|
#!/bin/sh
|
|
a=""; for x in "$@"; do [ "$x" = "-Wl,--fatal-warnings" ] && continue; a="$a $x"; done
|
|
exec /opt/zig/zig cc -mcpu=baseline $a
|
|
W
|
|
cat > "$ZW/cxx" <<'W'
|
|
#!/bin/sh
|
|
a=""; for x in "$@"; do [ "$x" = "-Wl,--fatal-warnings" ] && continue; a="$a $x"; done
|
|
exec /opt/zig/zig c++ -mcpu=baseline $a
|
|
W
|
|
chmod +x "$ZW/cc" "$ZW/cxx"
|
|
cmake -B build -G Ninja -Wno-dev \
|
|
-DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" \
|
|
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_PREFIX_PATH=/usr \
|
|
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF -DBUILD_SHARED_LIBS=ON \
|
|
-DENABLE_QT5=OFF -DENABLE_QT6=OFF -DENABLE_GLIB=ON -DENABLE_GOBJECT_INTROSPECTION=OFF \
|
|
-DENABLE_CPP=OFF -DENABLE_UTILS=OFF -DENABLE_BOOST=OFF \
|
|
-DENABLE_LIBOPENJPEG=none -DENABLE_DCTDECODER=libjpeg -DENABLE_LCMS=ON \
|
|
-DENABLE_LIBCURL=OFF -DENABLE_LIBTIFF=OFF -DENABLE_NSS3=OFF -DENABLE_GPGME=OFF \
|
|
-DBUILD_GTK_TESTS=OFF -DBUILD_QT5_TESTS=OFF -DBUILD_QT6_TESTS=OFF -DBUILD_CPP_TESTS=OFF \
|
|
-DBUILD_MANUAL_TESTS=OFF
|
|
'''
|
|
compile = "cmake --build build"
|
|
install = '''
|
|
set -e
|
|
DESTDIR=/out cmake --install build
|
|
# Ver la cabecera: sin esto, un cairo que pkg-config no encuentra sella una poppler SIN glib y el
|
|
# build reporta éxito. Se comprueba lo que esta receta EXISTE para producir.
|
|
test -f /out/usr/lib/pkgconfig/poppler-glib.pc || {
|
|
echo "ERROR: no se generó poppler-glib.pc — cmake apagó ENABLE_GLIB (¿CAIRO_FOUND falso?)" >&2
|
|
exit 1
|
|
}
|
|
test -e /out/usr/lib/libpoppler-glib.so || {
|
|
echo "ERROR: no se generó libpoppler-glib.so pese a existir el .pc" >&2
|
|
exit 1
|
|
}
|
|
'''
|
|
|
|
[deps]
|
|
build = ["cmake", "samurai", "python3", "pkgconf", "gettext-tiny", "gperf",
|
|
"glib-shared", "pcre2-shared", "cairo", "pixman", "libffi",
|
|
"freetype-shared", "fontconfig-shared", "expat", "lcms2",
|
|
"libjpeg-turbo-shared", "libpng-shared", "zlib-shared"]
|