gioser

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 1182Shell 87Rust 63Markdown 541592 Definiciones

⎇ 2f9253886ff843d9701ac61a9c3ff4f2cd43ef33 recipes/libnotify.toml TOML · 92 líneas · 6.1 KB Historia crudo

takana etapa 5a: los comentarios de las 741 recetas e852f4849 · Sergio ·

1# libnotify 0.8.8 — las NOTIFICACIONES DE ESCRITORIO, que hoy `atuq` no puede mostrar.
2#
3# ══ POR QUÉ ENTRA AHORA, Y CÓMO SE SUPO QUE FALTABA ════════════════════════════════════════════
4# No salió de una lista de deseos: salió de `scripts/test-atuq-rootfs.py --dlopen` (SDD 26 §6.10).
5# `libxul.so` lleva la cadena `libnotify.so.4` adentro y la abre con `dlopen` cuando una página pide
6# permiso para notificar. **Nadie en el corpus la proveía**, así que la función quedaba apagada sin
7# un solo mensaje de error: el navegador arranca, la web pide notificaciones, y no pasa nada.
8#
9# Es el tercer escalón de la jerarquía de lo que se puede auditar: un `NEEDED` lo ve cualquier
10# herramienta de `readelf`; una cadena literal dentro de un `dlopen` no la ve NINGUNA. Por eso este
11# hueco sobrevivió a `vigia-sonames.py` estando los cinco perfiles en CERO.
12#
13# ══ SÓLO EXISTE LA VARIANTE COMPARTIDA, Y NO ES UN OLVIDO ══════════════════════════════════════
14# El corpus construye estático por defecto y agrega variantes `-shared` cuando hace falta. Acá la
15# ÚNICA forma útil es la compartida: a un `dlopen("libnotify.so.4")` una `.a` no le sirve para nada.
16# Una receta estática de esto sería un artefacto que nadie puede consumir, así que no se escribe —y
17# por eso esta receta se llama `libnotify` a secas y va con `link = "dynamic"`.
18#
19# ══ LO QUE SE APAGA, Y POR QUÉ ═════════════════════════════════════════════════════════════════
20#   -Dtests=false           no entran al artefacto.
21#   -Ddocbook_docs=disabled exige docbook-xsl y xsltproc; documentación que la distro no distribuye.
22#   -Dgtk_doc=false         idem gi-docgen.
23#   -Dman=false             pide xsltproc por el mismo camino.
24#   -Dintrospection=disabled la introspección es para lenguajes dinámicos que la consumen (gjs,
25#                           python-gi); firefox la abre por `dlopen` en C y no la usa. Encenderla
26#                           arrastraría gobject-introspection entero, que es una dep grande y un
27#                           `.typelib` que nadie va a leer. Si algún día GNOME lo pide, se enciende
28#                           ahí y no acá — es la misma regla que ya siguen gdk-pixbuf y gtk3.
29#
30# ⚠ `libnotify` NO habla con un daemon propio: manda `org.freedesktop.Notifications` por D-Bus. O sea
31# que tenerla resuelve la MITAD del problema —que firefox la encuentre— y la otra mitad es que en la
32# imagen haya alguien escuchando ese nombre (el shell de GNOME, `mako` en sway, el de Plasma). Se
33# escribe acá para que nadie lea «notificaciones arregladas» y espere ver un globo en un QEMU pelado.
34name    = "libnotify"
35version = "0.8.8"
36license = "LGPL-2.1-or-later"
37
38[source]
39tarball = "https://download.gnome.org/sources/libnotify/0.8/libnotify-0.8.8.tar.xz"
40sha256  = "23420ef619dc2cb5aebad613f4823a2fa41c07e5a1d05628d40f6ec4b35bfddd"
41
42[build]
43compiler = "zig-cc"
44target   = "x86_64-linux-musl"
45link     = "dynamic"
46
47[build.phases]
48configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=shared -Dtests=false -Ddocbook_docs=disabled -Dgtk_doc=false -Dman=false -Dintrospection=disabled"
49compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
50install   = '''
51set -e
52PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild
53
54# GUARDIÁN. Lo único que le importa a quien la consume es que exista el fichero CON EL NOMBRE QUE
55# firefox abre por `dlopen`. Un artefacto con la librería bien construida pero con otro soname sería
56# invisible para él y sellaría igual de contento — que es la forma de fallo que este frente ya se
57# comió con `dbus` contra `dbus-shared`. Se exige el nombre exacto, no el directorio.
58SO=/out/usr/lib/libnotify.so.4
59test -s "$SO" || {
60  echo "!! no está $SO — ¿cambió el soname upstream?" >&2
61  find /out -name 'libnotify*' >&2
62  exit 1
63}
64# Y que sea de verdad una librería compartida: un enlace estático mal configurado deja el fichero
65# con el nombre correcto y sin `SONAME`, o directamente un archivo `ar`. Se mira el ELF, no el nombre.
66readelf -d "$SO" | grep -q 'SONAME.*libnotify.so.4' || {
67  echo "!! $SO no declara SONAME libnotify.so.4" >&2
68  readelf -d "$SO" | head -20 >&2
69  exit 1
70}
71# `stat -Lc%s` y NO `stat -c%s`: `libnotify.so.4` es un SYMLINK a `libnotify.so.4.0.0`, así que sin
72# la `-L` el guardián informaba «18 bytes» —el largo del nombre apuntado— y eso se lee como una
73# librería vacía. El artefacto estaba bien y el mensaje mentía; se arregla el mensaje, que es lo que
74# alguien va a leer a las tres de la mañana. Y se exige además el fichero REAL, porque un symlink
75# colgante pasa `test -s` … no: `test -s` sigue el enlace, pero si el destino desapareciera el
76# artefacto quedaría con dos nombres y ningún contenido.
77REAL=/out/usr/lib/libnotify.so.4.0.0
78test -s "$REAL" || { echo "!! $SO apunta a la nada: no está $REAL" >&2; exit 1; }
79echo "guardián: libnotify.so.4 compartida y con su SONAME ($(stat -Lc%s "$SO") bytes)"
80'''
81
82[deps]
83# `glib-shared` y `gdk-pixbuf-shared` y NO las estáticas: es la regla que el corpus paga desde el
84# cuadro de las dos Pango — las deps de una `.so` van a las variantes compartidas, nunca junto a las
85# estáticas, porque las dos instalan los mismos `.pc` y cabeceras.
86# ⚠ `libpng-shared` está porque **las deps de takana NO son transitivas**: el `.pc` de
87# `gdk-pixbuf-2.0` declara `Requires: libpng`, y sin traerlo el `meson setup` muere con
88# «Package 'libpng', required by 'gdk-pixbuf-2.0', not found» — un mensaje que nombra a gdk-pixbuf,
89# que sí está, en vez de a lo que falta. Medido, no supuesto: es el primer intento de esta receta.
90build = ["meson", "samurai", "python3", "pkgconf",
91         "glib-shared", "gdk-pixbuf-shared", "libpng-shared",
92         "libffi-shared", "pcre2-shared", "zlib-shared"]