Files
takana/recipes/zathura-pdf-poppler.toml
SergioandClaude Opus 5 da0186d250 apps: zathura + backend de PDF, en gnome/cosmic/sway — y tres defectos de imagen que salieron
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
2026-09-03 12:14:07 +00:00

61 lines
2.8 KiB
TOML

# zathura-pdf-poppler 2026.07.18 — el backend de PDF de `zathura`. Sin esto, zathura abre la
# ventana y no muestra un solo documento: los formatos entran por `.so` que carga con gmodule desde
# `/usr/lib/zathura`, y ésta es la única receta que pone uno ahí.
#
# El `plugindir` NO se codifica: sale de `zathura.pc` (`zathura.get_variable(pkgconfig:'plugindir')`),
# así que las dos recetas no pueden desincronizarse. Por eso `zathura` va en `[deps]` aunque el
# plugin no enlace nada suyo: aporta el `.pc`, las cabeceras de `plugin-api.h` y esa variable.
#
# Los símbolos `zathura_*` que el plugin usa NO se resuelven en el link: los resuelve el dlopen
# contra el EJECUTABLE, que zathura liga con `export_dynamic: true`. Es normal y es por qué esto es
# un `shared_module` y no una `shared_library`.
#
# `poppler-glib` es la receta del corpus escrita para esto: la poppler que ya existía va
# `-DENABLE_GLIB=OFF` y vive en `incoming-kde`. Ver su cabecera, que además explica por qué zathura
# no se declara en el perfil de KDE.
#
# ⚠ `glib-shared` y no `glib`, igual que las otras dos de la cadena: dos copias estáticas de
# GObject en el mismo proceso rompen el dlopen. Ver `recipes/poppler-glib.toml`.
#
# Su `data/meson.build` busca `desktop-file-validate` y `appstreamcli` con `required:false` — sin
# ellos simplemente no registra esos dos tests. No hace falta traer nada.
#
# Fuente por commit git (ADR 0006): `2026.07.18` es un objeto TAG ⇒ éste es su commit pelado.
name = "zathura-pdf-poppler"
version = "2026.07.18"
license = "Zlib"
[source]
repo = "https://github.com/pwmt/zathura-pdf-poppler.git"
commit = "2aaedd3342a12f8d45b209995c375cbdfbf05137"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
flags = []
[build.phases]
configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release"
compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
install = '''
set -e
PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild
# Un plugin que no aterriza donde zathura lo busca es un artefacto que sella y no sirve para nada:
# zathura arrancaría igual y diría «unknown file type». Se comprueba la ruta, no el exit code.
test -e /out/usr/lib/zathura/libpdf-poppler.so || {
echo "ERROR: el plugin no quedó en /usr/lib/zathura — ¿cambió el plugindir de zathura.pc?" >&2
ls -R /out/usr/lib >&2
exit 1
}
'''
[deps]
build = [
"meson", "samurai", "python3", "pkgconf", "linux-headers",
"zathura", "girara", "poppler-glib",
"glib-shared", "pcre2-shared", "cairo", "pixman", "libffi", "zlib",
"freetype-shared", "fontconfig-shared", "expat", "lcms2",
"libjpeg-turbo-shared", "libpng-shared", "zlib-shared",
]