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…
recetas: apuntar al vigía que EXISTE, no al que borré
1# librsvg 2.58.5 — el renderizador de SVG de GNOME, escrito en Rust. De acá sale el typelib `Rsvg-2.0`.
2#
3# POR QUÉ ENTRA: gnome-shell lo importa desde JavaScript sin condicional
4# (`js/misc/dependencies.js`: `import 'gi://Rsvg?version=2.0'`). Es lo que dibuja los iconos
5# simbólicos del panel y los fondos vectoriales. Dep de RUNTIME del shell, invisible a su grafo de
6# build.
7#
8# ══ POR QUÉ 2.58 Y NO 2.59+, que es lo que shippea GNOME 48 ═════════════════════════════════════
9# En 2.59 librsvg cambió a **meson + cargo-c**, y `cargo-cbuild` (el binario de lu-zero/cargo-c) no
10# está en el corpus. Empaquetarlo no es una receta más: cargo-c ENLAZA el crate `cargo`, que arrastra
11# libgit2, libssh2, libcurl y openssl como `*-sys`. Es una campaña propia, y por un binario que sólo
12# corre en el constructor.
13#
14# 2.58.5 es la última de la serie autotools + `cargo build` plano, y produce **el mismo `Rsvg-2.0`**
15# —la ABI del typelib no se movió—, así que el shell no nota la diferencia. Es el mismo criterio que
16# ya se aplicó a gnome-desktop 44.5 en esta cola: la versión correcta es la que cierra la cadena, no
17# la más nueva. Cuando cargo-c exista, subir es cambiar dos líneas.
18#
19# ══ LA PERILLA NUEVA DEL LAB: `cargo_vendor = true` ═════════════════════════════════════════════
20# librsvg es POLÍGLOTA — `configure.ac` Y `Cargo.toml` en la misma raíz— y `detect_build_system`
21# asume un sistema por árbol: autotools gana por precedencia. Pero el `Makefile` invoca
22# `cargo build`, y dentro del sandbox hermético ese cargo no tiene red ⇒ el build moría intentando
23# bajar el registro. La perilla fuerza el vendoreo (que ocurre en el fetch, donde SÍ hay red) sin
24# tocar la detección. No entra al ArtifactHash: decide de dónde salen las deps, no cuáles —eso lo
25# fija el `Cargo.lock` del tarball, que ya está bajo el sha256 de la fuente.
26#
27# `CARGO_NET_OFFLINE=true` cierra el círculo: sin él cargo intentaría igual la red antes de mirar el
28# `.cargo/config.toml` vendoreado en algunos caminos.
29#
30# ══ `LIBS=-lunwind`: LA DEUDA DEL UNWINDER, PAGADA ═════════════════════════════════════════════
31# Sin esto el build muere al linkear el binario temporal de la introspección:
32#
33# ld.lld: error: undefined reference: _Unwind_DeleteException
34# >>> referenced by ./.libs/librsvg-2.so (disallowed by --no-allow-shlib-undefined)
35#
36# **No es de librsvg: es de la `std` de rustc**, que trae landing pads de unwinding y espera el
37# runtime que en glibc vive en `libgcc_s`. Es exactamente la deuda que el corpus arrastra desde hace
38# tiempo —«las 12 recetas Rust de la lista de matar-gcc son UN problema, no 12: falta un runtime de
39# unwinding»— y el remedio resulta estar a mano: **zig empaqueta la libunwind de LLVM**, y exporta
40# los `_Unwind_*` que hacen falta (verificado con `nm` sobre el `libunwind.a` de su caché). O sea que
41# no hay que traer libgcc: alcanza con pedirle a zig el suyo.
42#
43# Va por `LIBS` y no por `LDFLAGS` a propósito: autotools pone `LIBS` al FINAL de la línea de enlace,
44# que es donde tiene que ir una librería que resuelve símbolos indefinidos. En `LDFLAGS` iría antes
45# de los objetos y el linker la descartaría por no tener nada pendiente todavía.
46#
47# ══ ALCANCE ════════════════════════════════════════════════════════════════════════════════════
48# `--disable-pixbuf-loader`: el loader SVG de gdk-pixbuf necesita correr
49# `gdk-pixbuf-query-loaders` y reescribir el `loaders.cache` del sistema — un efecto sobre OTRO
50# paquete, que en un store direccionable por contenido no se puede hacer desde acá. El shell no lo
51# usa: carga SVG por `imports.gi.Rsvg`, no por GdkPixbuf.
52# `--disable-gtk-doc`: gtk-doc no está en el corpus.
53#
54# ISLA DINÁMICA: el typelib nombra `librsvg-2.so.2` y gjs la dlopea.
55name = "librsvg"
56version = "2.58.5"
57license = "LGPL-2.1-or-later"
58
59[source]
60tarball = "https://download.gnome.org/sources/librsvg/2.58/librsvg-2.58.5.tar.xz"
61sha256 = "224233a0e347d38c415f15a49f0e0885313e3ecc18f3192055f9304dd2f3a27a"
62cargo_vendor = true
63
64[build]
65compiler = "zig-cc"
66target = "x86_64-linux-musl"
67link = "dynamic"
68
69[build.phases]
70configure = '''
71set -e
72PKG_CONFIG_PATH=/usr/lib/pkgconfig LIBS=-lunwind ./configure --prefix=/usr \
73 --disable-gtk-doc --disable-pixbuf-loader --enable-introspection --disable-vala
74'''
75compile = "CARGO_NET_OFFLINE=true make"
76install = "CARGO_NET_OFFLINE=true DESTDIR=/out make install"
77
78[deps]
79# ⚠ DEP DE EJECUCIÓN, NO DE BUILD — Y NO ES DECORACIÓN (2026-09-06).
80# Este artefacto declara `NEEDED libstdc++.so.6` / `libgcc_s.so.1`, y hasta hoy NADIE en el corpus
81# las proveía: sólo existían en `.dev-fs/alpine`, o sea en el LAB. El binario sellaba, REPRODUCÍA
82# bit a bit, pasaba todos los guardianes… y no arrancaba fuera del lab. Se descubrió corriendo
83# `atuq` bajo un sway headless, no leyendo el grafo.
84# `runtime` NO entra en el ArtifactHash (igual que `license`), así que declararlo NO re-hashea:
85# lo que cambia es la CLAUSURA, que es lo que se hidrata en la imagen. Lo vigila
86# `scripts/vigia-sonames.py`, que corre en el latido y deja `docs/state/sonames.txt`.
87runtime = ["gcc-libs"]
88build = ["make", "pkgconf", "python3", "py3-setuptools", "gobject-introspection", "gi-foreign-girs", "glib", "glib-introspected", "gdk-pixbuf", "cairo-shared", "pango", "harfbuzz", "fribidi", "freetype-shared", "fontconfig-shared", "libxml2-shared", "libpng-shared", "pixman", "expat", "libffi", "pcre2", "zlib-shared"]