# 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"]