🚪 cosmic: el BACKEND del portal + clang18 — recetas listas para la granja
clang18 b3:62c6bfb5 (sólo libclang.so)
xdg-desktop-portal-cosmic b3:97dfddd8
EL PARCHE DE UNA LÍNEA resultó ser el que se esperaba: xdp-cosmic declara
cosmic-files con features = ["gvfs", "wayland"] FIJADAS a mano —mismo patrón
que deja fuera a cosmic-files-applet— así que apagarla desde afuera no
alcanza. El sed la saca y queda la misma combinación que ya compilaron
cosmic-term y cosmic-edit. Se pierden los montajes remotos DENTRO del
selector del portal, no el selector.
PERO APARECIÓ UN ESLABÓN QUE NO ESTABA EN EL PLAN: libclang.
xdp-cosmic declara pipewire y libspa-sys como deps DURAS (screencast)
→ libspa-sys/build.rs corre bindgen::builder() INCONDICIONAL
→ bindgen carga libclang.so en tiempo de build
Verificado que no hay atajo: ese build.rs no tiene rama alternativa, a
diferencia de aws-lc-sys —que sí cae a bindings pregenerados
(cargo:rustc-cfg=universal) y por eso cruzó a musl sin cmake ni perl—. Y
libclang no está ni en el corpus ni en los 182 binarios del rootfs del
constructor: llvm18 se selló con -DLLVM_ENABLE_PROJECTS="".
Lo barato es que NO se recompila LLVM: el artefacto llvm18 ya publica
usr/include/llvm, usr/include/llvm-c y usr/lib/cmake/llvm, así que clang18
es un build de clang CONTRA un LLVM sellado. Se instala sólo libclang.so y
clang-c/: el binario `clang` no es el objetivo — el compilador de esta
distro sigue siendo zig-cc, y sumar otro sería lo contrario de la deuda que
la campaña «matar gcc» viene pagando.
Patrón gcc-de-gueto (igual que llvm18 y cmake): g++ con -static-libstdc++
-static-libgcc para que la .so quede con NEEDED sólo libc.musl y no contagie
el runtime C++ de Alpine a cada build que la declare.
Vale decir de dónde sale este costo: no de COSMIC, sino de que pipewire-rs
genera sus bindings en cada build.
Ambas van a la granja (decisión del usuario): mismo peso que llvm18, que ya
se selló en el worker gordo.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# clang18 (18.1.8) — **sólo `libclang.so`**, y no está acá por querer un compilador más: está porque
|
||||
# `bindgen` no puede generar bindings sin él, y sin bindgen no hay backend del portal.
|
||||
#
|
||||
# ── LA CADENA DE POR QUÉ, QUE CONVIENE LEER ENTERA ANTES DE JUZGAR EL TAMAÑO ─────────────────────
|
||||
# `cosmic-screenshot` pide una captura al portal
|
||||
# → el frontend `xdg-desktop-portal` enruta al backend
|
||||
# → `xdg-desktop-portal-cosmic` implementa ScreenCast/Screenshot
|
||||
# → declara `pipewire` y `libspa-sys` como deps DURAS (no opcionales)
|
||||
# → `libspa-sys/build.rs` corre `bindgen::builder()` **incondicional**, sin bindings
|
||||
# pregenerados de reserva
|
||||
# → bindgen carga `libclang.so` en tiempo de ejecución.
|
||||
#
|
||||
# Se verificó que no hay atajo: el `build.rs` de libspa-sys no tiene rama alternativa (a diferencia
|
||||
# de `aws-lc-sys`, que sí cae a bindings pregenerados con `cargo:rustc-cfg=universal` y por eso cruzó
|
||||
# a musl sin cmake ni perl). Y `libclang.so` no está en el corpus ni en los 182 binarios del rootfs
|
||||
# del constructor: `llvm18` se selló con `-DLLVM_ENABLE_PROJECTS=""`, o sea LLVM a secas para el JIT
|
||||
# de llvmpipe.
|
||||
#
|
||||
# ── POR QUÉ ES MÁS BARATO DE LO QUE PARECE ──────────────────────────────────────────────────────
|
||||
# **No se recompila LLVM.** El artefacto `llvm18` ya publica `usr/include/llvm`, `usr/include/llvm-c`
|
||||
# y `usr/lib/cmake/llvm`, así que esto es un build de clang CONTRA un LLVM ya sellado
|
||||
# (`-DCLANG_LINK_CLANG_DYLIB=ON` + `LLVM_LINK_LLVM_DYLIB`), no el monstruo entero.
|
||||
#
|
||||
# Se instala sólo lo que bindgen necesita. El binario `clang` NO es el objetivo: el compilador de
|
||||
# esta distro sigue siendo zig-cc, y agregar otro compilador al catálogo sería justo lo contrario de
|
||||
# la deuda que la campaña «matar gcc» viene pagando.
|
||||
#
|
||||
# ── PATRÓN gcc-de-gueto, igual que llvm18 y cmake ───────────────────────────────────────────────
|
||||
# C++ a escala ⇒ g++ del sandbox con `-static-libstdc++ -static-libgcc`, para que la `.so` quede con
|
||||
# `NEEDED` sólo `libc.musl` y no arrastre el runtime C++ de Alpine a todo el que la declare. Es la
|
||||
# lección de «MATAR GCC última milla»: sin esos dos flags, el artefacto contagia `libstdc++` y
|
||||
# `libgcc_s` a cada build que lo use.
|
||||
#
|
||||
# ⚠ **BUILD PESADO**: mismo peso que llvm18, que se selló en el worker gordo de la granja. En el
|
||||
# laptop pide horas y decenas de GB de `/home`.
|
||||
name = "clang18"
|
||||
version = "18.1.8"
|
||||
|
||||
[source]
|
||||
tarball = "https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/llvm-project-18.1.8.src.tar.xz"
|
||||
sha256 = "0b58557a6d32ceee97c8d533a59b9212d87e0fc4d2833924eb6c611247db2f2a"
|
||||
|
||||
[build]
|
||||
compiler = "zig-cc"
|
||||
target = "x86_64-linux-musl"
|
||||
link = "dynamic"
|
||||
|
||||
[build.phases]
|
||||
configure = '''
|
||||
CC=gcc CXX='g++ -static-libstdc++ -static-libgcc' \
|
||||
cmake -S clang -B build -G Ninja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX=/usr \
|
||||
-DCMAKE_CXX_FLAGS="-include cstdint" \
|
||||
-DCMAKE_C_FLAGS="-include stdint.h" \
|
||||
-DLLVM_DIR=/usr/lib/cmake/llvm \
|
||||
-DLLVM_LINK_LLVM_DYLIB=ON \
|
||||
-DCLANG_LINK_CLANG_DYLIB=ON \
|
||||
-DLLVM_ENABLE_RTTI=ON \
|
||||
-DCLANG_INCLUDE_TESTS=OFF \
|
||||
-DCLANG_INCLUDE_DOCS=OFF \
|
||||
-DCLANG_ENABLE_STATIC_ANALYZER=OFF \
|
||||
-DCLANG_ENABLE_ARCMT=OFF \
|
||||
-DLLVM_INCLUDE_TESTS=OFF \
|
||||
-DLLVM_INCLUDE_DOCS=OFF
|
||||
'''
|
||||
compile = "ninja -C build libclang.so clang-resource-headers"
|
||||
# Sólo la librería y sus cabeceras: `ninja install` traería el binario `clang`, `clang-format`,
|
||||
# `scan-build` y compañía, que acá no cumplen ninguna función.
|
||||
install = '''
|
||||
mkdir -p /out/usr/lib /out/usr/include
|
||||
cp -a build/lib/libclang.so* /out/usr/lib/
|
||||
cp -a clang/include/clang-c /out/usr/include/
|
||||
'''
|
||||
|
||||
[deps]
|
||||
build = ["cmake", "samurai", "python3", "pkgconf", "llvm18"]
|
||||
@@ -0,0 +1,76 @@
|
||||
# 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"
|
||||
|
||||
[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]
|
||||
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 --locked --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"]
|
||||
Reference in New Issue
Block a user