Dos cosas: una mejora de calidad y un fallo mío que hay que contar entero.
═══ EL FALLO: escribí un error JSON dentro de 5 recetas y las commiteé rotas ═══
En `a6a9d59`, cinco recetas quedaron con
license = "{"message":"Not Found","documentation_url":"...","status":"404"}"
Causa: cuando el repo da 404 (renombrado, borrado, privado), `gh api` escribe el CUERPO DEL
ERROR en stdout y el filtro `--jq` falla, así que la variable queda valiendo el JSON. Mi
`case` sólo descartaba ""/null/NOASSERTION/other ⇒ el JSON pasó como si fuera una licencia.
Las comillas ROMPEN el TOML, y esas 5 recetas dejaron de parsear y de tener ArtifactHash.
No lo vio nadie leyendo: lo cazó la comparación de hashes, al detectar que `cargo-sort`
había cambiado. Afectadas: cargo-sort, cargo-audit, cargo-binstall, waybackurls, usbutils.
La lección no es «se me pasó un caso», es que **validé los «no sé» conocidos en vez de la
FORMA del dato**. Ahora se acepta sólo lo que tiene forma de expresión SPDX, y la barrera
está en los DOS sitios que escriben (detectar y sembrar), más un GUARDIÁN en el informe que
sale ≠0 si alguna licencia tiene forma imposible. Un fallo aguas arriba disfrazado de dato
hay que verlo sin buscarlo.
Y de paso normalizadas 11 licencias con la barra antigua de Cargo (`MIT/Apache-2.0`), que
no es SPDX válido. Traducir la barra a OR no es inferir: Cargo documentó esa equivalencia.
═══ LA MEJORA: `scripts/licencias-cargo.sh` ═══
Lee la licencia que el AUTOR declara en su Cargo.toml, pidiéndola AL TAG QUE LA RECETA
PINEA (`?ref=v<version>`, con HEAD como último recurso y anotando cuál se usó). 176
obtenidas, 167 al tag exacto. Es la fuente más autoritativa de las que usamos y corrige los
dos defectos de la detección por API de una vez:
· las licencias DOBLES dejan de colapsar: `fd` pasa de `Apache-2.0` a `MIT OR Apache-2.0`,
`ripgrep` a `Unlicense OR MIT`, `bat` a `MIT OR Apache-2.0`;
· los SPDX AMBIGUOS caen de 71 a 55, porque el autor sí escribe -only/-or-later.
66 corregidas, 7 nuevas. Y aparecieron cosas que la detección había perdido: `eza` es
EUPL-1.2, una copyleft europea que se habría empaquetado creyendo otra cosa.
Jerarquía de evidencia, escrita en la cabecera del script: nombre (prohibido) < familia/URL
de fuente < API de licencias de GitHub < Cargo.toml del autor.
997 de 1141 (87%). Verificación COMPLETA sobre las 77 recetas tocadas —no una muestra—:
0 hashes cambiados, y 5 que ahora parsean y en HEAD no.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
85 lines
5.9 KiB
TOML
85 lines
5.9 KiB
TOML
# xdg-desktop-portal-cosmic — **el backend**, y el eslabón que cierra la cadena del portal.
|
|
#
|
|
# cliente → org.freedesktop.portal.Desktop → xdg-desktop-portal (frontend)
|
|
# → org.freedesktop.impl.portal.desktop.cosmic → ESTE paquete
|
|
#
|
|
# Implementa cinco interfaces (`data/cosmic.portal`): `Access`, `FileChooser`, `Screenshot`,
|
|
# `Settings` y `ScreenCast`. O sea que no destraba sólo la captura de pantalla: también el selector
|
|
# de ficheros de las aplicaciones y el compartir pantalla.
|
|
#
|
|
# ── EL PARCHE DE UNA LÍNEA: `gvfs` ──────────────────────────────────────────────────────────────
|
|
# Su `Cargo.toml` declara `cosmic-files` con `features = ["gvfs", "wayland"]` **fijadas a mano** —el
|
|
# mismo patrón que deja fuera a `cosmic-files-applet`—, así que apagarla desde afuera no alcanza.
|
|
# `gvfs` arrastra los crates `gio`/`glib`, que piden las glib COMPARTIDAS por pkg-config; el corpus
|
|
# las tiene estáticas y meter una segunda glib en la imagen es la decisión que la campaña GNOME midió
|
|
# y evitó. El `sed` la saca y queda `cosmic-files` con `default-features = false` + `wayland`, que es
|
|
# exactamente la combinación que ya compilaron `cosmic-term` y `cosmic-edit`.
|
|
# Se pierden los montajes remotos DENTRO del selector de ficheros del portal, no el selector.
|
|
#
|
|
# ── POR QUÉ ESTA RECETA NECESITA UN COMPILADOR DE C++ ──────────────────────────────────────────
|
|
# `pipewire` y `libspa-sys` son deps DURAS (screencast), y `libspa-sys/build.rs` corre
|
|
# `bindgen::builder()` sin rama alternativa: no hay bindings pregenerados de reserva, así que hace
|
|
# falta `libclang.so` en tiempo de build. Por eso `[deps]` declara `clang18` — ver esa receta para la
|
|
# cadena completa. Es la única pieza de toda la campaña COSMIC que obliga a traer algo de LLVM, y
|
|
# vale decir de dónde sale: no de COSMIC, sino de que pipewire-rs genera sus bindings en cada build.
|
|
#
|
|
# ── LO QUE NO HIZO FALTA ────────────────────────────────────────────────────────────────────────
|
|
# La doble barra `pop-os//` está comentada en el `Cargo.toml` (bloques `[patch]` de `theme-v2`);
|
|
# verificado con grep antes de construir, que es lo que evita un fetch fallido a la hora.
|
|
# `gstreamer` aparece en el lock pero sólo por `[dev-dependencies]` (`gst` para los tests), y
|
|
# `cargo build` no las compila: el lock lista el universo, las features y las secciones dicen el
|
|
# recorte.
|
|
name = "xdg-desktop-portal-cosmic"
|
|
version = "1.5.0"
|
|
license = "GPL-3.0-or-later"
|
|
|
|
[source]
|
|
tarball = "https://github.com/pop-os/xdg-desktop-portal-cosmic/archive/epoch-1.5.0/xdg-desktop-portal-cosmic-epoch-1.5.0.tar.gz"
|
|
sha256 = "3ac591232cbbbe47e5fc6264dde6f223bfe3d6711045fd3a1fc99a1c9453da81"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
# Dinámico como todo cliente de la suite: dibuja diálogos con libcosmic ⇒ wayland-client con la
|
|
# feature `dlopen`, que un musl estático no honra.
|
|
link = "dynamic"
|
|
|
|
[build.phases]
|
|
# ⚠ `--offline` SIN `--locked`, y no es descuido. El `sed` corre en la fase COMPILE, o sea DESPUÉS de
|
|
# que el lab hizo el `cargo vendor` con el manifiesto original; cargo ve que el `Cargo.toml` cambió
|
|
# respecto de lo vendorizado y con `--locked` se niega:
|
|
# error: cannot update the lock file /src/Cargo.lock because --locked was passed to prevent this
|
|
# `--offline` deja re-resolver sin red, que es lo correcto acá: quitar una feature sólo puede
|
|
# ENCOGER el conjunto de crates, así que todo lo que necesite ya está en `vendor/`. La hermeticidad
|
|
# la sigue dando `--offline` + el árbol vendorizado, no el `--locked`.
|
|
compile = '''
|
|
sed -i '/^ "gvfs",$/d' Cargo.toml
|
|
printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64-linux-musl ;; esac' 'set -- "$@" "$a"' 'shift' 'done' 'exec zig cc -mcpu=baseline "$@"' > "$PWD/.hammer-zig-cc"
|
|
chmod +x "$PWD/.hammer-zig-cc"
|
|
RF="-C linker=$PWD/.hammer-zig-cc -C target-feature=-crt-static"
|
|
rustc -vV | grep -q 'host: .*-alpine-' || RF="$RF -C link-self-contained=no"
|
|
CC="$PWD/.hammer-zig-cc" LIBCLANG_PATH=/usr/lib RUSTFLAGS="$RF" cargo build --release --offline -p xdg-desktop-portal-cosmic
|
|
'''
|
|
# El `just install` traducido con `rootdir=/`. Los dos `.service` llevan `@libexecdir@` sustituido:
|
|
# el de D-Bus es el que hace que el frontend pueda ACTIVAR el backend por demanda, así que la
|
|
# sustitución no es cosmética — con la ruta mal, el bus no lo encuentra y el portal responde que no
|
|
# hay implementación.
|
|
install = '''
|
|
mkdir -p /out/usr/libexec /out/usr/share/dbus-1/services /out/usr/lib/systemd/user /out/usr/share/xdg-desktop-portal/portals
|
|
cp target/release/xdg-desktop-portal-cosmic /out/usr/libexec/
|
|
chmod 755 /out/usr/libexec/xdg-desktop-portal-cosmic
|
|
sed 's|@libexecdir@|/usr/libexec|' data/dbus-1/org.freedesktop.impl.portal.desktop.cosmic.service.in > /out/usr/share/dbus-1/services/org.freedesktop.impl.portal.desktop.cosmic.service
|
|
sed 's|@libexecdir@|/usr/libexec|' data/org.freedesktop.impl.portal.desktop.cosmic.service.in > /out/usr/lib/systemd/user/org.freedesktop.impl.portal.desktop.cosmic.service
|
|
cp data/cosmic.portal /out/usr/share/xdg-desktop-portal/portals/cosmic.portal
|
|
cp data/cosmic-portals.conf /out/usr/share/xdg-desktop-portal/cosmic-portals.conf
|
|
for f in $(cd data/icons && find . -type f); do
|
|
install -Dm0644 "data/icons/$f" "/out/usr/share/icons/hicolor/$f"
|
|
done
|
|
'''
|
|
|
|
[deps]
|
|
# El juego fijo de todo cliente, más: `pipewire` (screencast, y de paso lo que arrastra el bindgen),
|
|
# `mesa` por `gbm-sys`, `libdrm` por `drm-sys`, `wayland` por los protocolos, y `clang18` por
|
|
# `libspa-sys`.
|
|
build = ["libxkbcommon", "pkgconf", "libudev-zero", "libinput", "pipewire", "mesa", "libdrm", "wayland", "clang18"]
|