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