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…

TOML 1572Shell 203Rust 109Markdown 993728 Definitions

⎇ 2907e74a8f41b07296102c14adc378cea53f57f9 recipes/zathura.toml TOML · 117 lines · 7.9 KB History raw

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

1# zathura 2026.07.18 — lector de documentos con teclas de vi, para las cuatro imágenes.
2#
3# ══ ⚠ CORRIGE UNA CREENCIA DEL REPO: ESTO NO ESTÁ BLOQUEADO POR GTK3 ═══════════════════════════
4# `docs/plan-apps-usuario-final.md` dejaba a zathura como «verificar antes que su cadena sea GTK4 y
5# no GTK3», porque en Alpine `girara` —su librería de apoyo— era GTK3, y GTK3 está aparcado por
6# diseño en esta distro. **Upstream VACIÓ girara**: en 2026.07.18 su árbol son siete `.c` de
7# utilidades y su `meson.build` no menciona GTK ni una vez. Toda la UI se mudó acá adentro, y esto
8# pide **GTK4 >= 4.12**, que está en el corpus (4.18.6). El muro no existe. Medido, no recordado.
9#
10# ══ EL BACKEND ES UNA RECETA APARTE, Y ESO IMPORTA ═════════════════════════════════════════════
11# zathura sin plugin ABRE LA VENTANA Y NADA MÁS: los formatos entran por `.so` que carga con
12# gmodule desde `/usr/lib/zathura`. El de PDF es `zathura-pdf-poppler`, que necesita
13# `poppler-glib` — y ésa hubo que escribirla, porque la poppler que ya existía va
14# `-DENABLE_GLIB=OFF` y encima vive en `incoming-kde`. Ver `recipes/poppler-glib.toml`.
15# `export_dynamic: true` (meson.build:207,221) es lo que hace que el plugin resuelva los símbolos
16# `zathura_*` contra el EJECUTABLE al hacer dlopen. Ojo con eso y el wrapper de zig: hay una regla
17# que quita `-static` ante `--export-dynamic`, la misma que documenta `recipes/luajit.toml`.
18#
19# ⚠ **NO SE DECLARA EN `escritorio-kde`, y es a propósito.** Esa imagen ya trae `okular`, que
20# arrastra `incoming-kde/poppler`; las dos popplers instalan `/usr/lib/libpoppler.so.146` y son
21# artefactos DISTINTOS, así que hidratar las dos pone dos ficheros en la misma ruta y gana el que se
22# proyecte último — el cuadro de las dos glib. La salida no sería listarla igual, sería jubilar una
23# de las dos popplers. Está escrito también en `recipes/poppler-glib.toml` y en `targets.toml`.
24#
25# ══ OPCIONES TODAS EXPLÍCITAS (las siete nacen `auto`) ═════════════════════════════════════════
26# `landlock=enabled` — y no es relleno: es el mismo mecanismo del kernel que usa `harkaq`, la jaula
27#   de este repo, así que el visor entra encajado con la casa. Se comprobó que la cadena da: pide
28#   `linux/landlock.h` **y** el campo `scoped` de `struct landlock_ruleset_attr`, que existe en las
29#   `linux-headers` 6.16.12 del corpus (línea 53 del header). Sin ese campo la perilla se apagaría
30#   sola, que es el modo de fallar que este repo persigue.
31# `seccomp=disabled` — `libseccomp` sólo vive en `incoming-gnome`; una receta del corpus no alcanza
32#   una cola hermana. Landlock cubre el encierro.
33# `synctex=disabled` — no hay receta `synctex` (es de TeX Live).
34# `manpages=disabled` — su target pide `sphinx-build`, que no está en el corpus.
35# `convert-icon=disabled` — pide `rsvg-convert`, y librsvg vive sólo en `incoming-gnome`. Sólo
36#   genera PNG del icono a cinco tamaños; el SVG se instala igual.
37# `tests-x11` / `tests-wayland` apagadas: X11 está al tacho y la de wayland pide weston.
38#
39# ══ ⚠ `-Dc_link_args` CON LAS PRIVADAS DE gtk4 — EL PATRÓN QUE YA ESTÁ ESCRITO EN EL CORPUS ═════
40# La gtk4 del corpus es `libgtk-4.a` y **su `.pc` no declara `Libs.private` en absoluto** (asume
41# link dinámico contra `libgtk-4.so`). Consecuencia: meson resuelve `dependency('gtk4')` como
42# `-lgtk-4` a secas y el link muere con
43#
44#   ld.lld: error: undefined symbol: epoxy_glBindRenderbuffer
45#   >>> referenced by gtkglarea.c ... in archive /usr/lib/libgtk-4.a
46#
47# **culpando a zathura cuando lo que falta es propagar epoxy.** `-Dprefer_static=true` NO lo
48# arregla: no hay `Libs.private` que preferir. Hay que nombrar a mano las privadas que gdk/gsk
49# enlazan directo, que son las mismas ocho que `recipes/gtk4-hello.toml` ya dejó escritas —
50# harfbuzz-subset, epoxy, xkbcommon, wayland-client, wayland-egl, libtiff-4, libjpeg y
51# cairo-script-interpreter. Se hace acá y no arreglando `gtk4.pc` porque re-hashear gtk4 arrastra
52# **7 dependientes directos, 6 de ellos sellados que caerían a deuda**; mismo criterio que el
53# wrapper de `ar` de las recetas Cargo: per-receta, no framework.
54name    = "zathura"
55version = "2026.07.18"
56license = "Zlib"
57
58[source]
59repo   = "https://github.com/pwmt/zathura.git"
60commit = "4fad4e4d82ac3275632fcbc55386915ff361e404"
61
62[build]
63compiler = "zig-cc"
64target   = "x86_64-linux-musl"
65# Dinámico: gtk4 y poppler-glib se exponen como `.so`, y el plugin se carga con dlopen.
66link     = "dynamic"
67flags    = []
68
69[build.phases]
70configure = '''
71set -e
72export PKG_CONFIG_PATH=/usr/lib/pkgconfig
73export PYTHONPATH=/usr/lib/python3.12/site-packages
74# Ver la cabecera: gtk4.pc no trae Libs.private, así que las privadas de gdk/gsk se nombran a mano.
75PRIV="$(pkg-config --libs --static harfbuzz-subset epoxy xkbcommon wayland-client wayland-egl libtiff-4 libjpeg cairo-script-interpreter)"
76meson setup output --prefix=/usr --buildtype=release \
77  -Dprefer_static=true \
78  -Dc_link_args="$PRIV" \
79  -Dsynctex=disabled -Dseccomp=disabled -Dlandlock=enabled -Dmanpages=disabled \
80  -Dtests-x11=disabled -Dtests-wayland=disabled -Dconvert-icon=disabled
81'''
82compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
83install   = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
84
85# ⚠ `sqlite` Y `-Dprefer_static=true` ESTÁN ACÁ PORQUE UN VIGÍA CAZÓ UNA FUGA AL LAB ═══════════
86# La primera versión selló con `NEEDED libsqlite3.so.0`, un SONAME que **ningún artefacto del
87# cierre publica** (el `sqlite` del corpus es `.a`): meson había resuelto `dependency('sqlite3')`
88# contra el **sysroot Alpine DEL LAB**. Artefacto sellado, perfil al 100%, y una imagen que sólo
89# arranca en una máquina con Alpine debajo. El lab NO entra en `hash_inputs` ⇒ el store no puede
90# notarlo. Lo encontró `scripts/vigia-sonames.py escritorio-sway`, que existe para exactamente esto.
91#
92# **Y declarar la dep NO alcanzó** — vale la pena que quede escrito, porque era la corrección
93# obvia y es la incompleta. Con `sqlite` en `[deps]` el NEEDED seguía ahí: el `.pc` del corpus le da
94# a meson un `-lsqlite3` pelado y el linker prefiere la `.so` del lab sobre la `.a` del store.
95# Lo que lo arregla es `-Dprefer_static=true`, que hace que meson pida los `.pc` en modo estático.
96# Efecto medido: los NEEDED bajaron de DIEZ a CUATRO —libxkbcommon, las dos de wayland y libc—
97# y los cuatro los publica el cierre. expat, libffi, zlib, pixman, xxhash y sqlite entraron
98# estáticos. Las dos cosas hacen falta: sin la dep, meson ni encuentra el `.pc` del corpus.
99#
100# ⚠ `glib-shared` Y NO `glib`: una copia ESTÁTICA de GObject acá y otra dentro de
101# `libpoppler-glib.so` hacen que el plugin de PDF muera con `cannot register existing type 'gchar'`
102# al hacer dlopen. El porqué largo está en `recipes/poppler-glib.toml`. Las tres recetas de la
103# cadena —ésta, poppler-glib y el plugin— tienen que declarar la MISMA.
104#
105# `.pc Requires` → `[deps].build`. La cadena larga es la de gtk4 (pango, gdk-pixbuf, graphene,
106# cairo-gobject, libepoxy…), copiada de `recipes/gtk4.toml` porque es exactamente su clausura de
107# pkg-config. `file` da `libmagic` (detección de tipo de documento), `xxhash` la caché de páginas
108# renderizadas y `json-glib` la sesión. `gettext-tiny` porque `po/` y el `.desktop` pasan por i18n.
109[deps]
110build = [
111  "meson", "samurai", "python3", "pkgconf", "linux-headers", "gettext-tiny",
112  "girara", "xxhash", "json-glib", "file", "sqlite",
113  "gtk4", "glib-shared", "pcre2-shared", "cairo", "pango", "gdk-pixbuf", "graphene", "libepoxy",
114  "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "mesa",
115  "fontconfig", "harfbuzz", "fribidi", "freetype", "pixman", "expat",
116  "libpng", "libjpeg-turbo", "libtiff", "libffi", "zlib", "zlib-shared", "bzip2-shared",
117]