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