# 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"

[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]
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"]
