diff --git a/recipes/incoming-cosmic/cosmic-bg.toml b/recipes/incoming-cosmic/cosmic-bg.toml new file mode 100644 index 00000000..98fe7bb2 --- /dev/null +++ b/recipes/incoming-cosmic/cosmic-bg.toml @@ -0,0 +1,36 @@ +# cosmic-bg — el que pinta el fondo de pantalla. Es un cliente Wayland normal, uno de los que +# `cosmic-session` levanta después del compositor. +# +# ── POR QUÉ ES EL SEGUNDO CLIENTE QUE SE CONSTRUYE ────────────────────────────────────────────── +# Porque separa dos preguntas que en el resto de la suite vienen pegadas. cosmic-bg habla Wayland con +# `smithay-client-toolkit` —la implementación en Rust del protocolo, sin libwayland— y decodifica +# imágenes con crates puros (image, jxl-oxide, fast_image_resize). **No toca libcosmic ni iced.** +# Así que si el fondo pinta y el panel no, el problema es de la capa de UI, no del transporte. +# +# De ahí que vaya `link = "static"`, a diferencia del compositor: acá no hay una sola dep en C. +# +# El árbol es un workspace con `config/` como miembro (cosmic-bg-config), que es lo que leen los +# demás componentes para saber qué fondo hay puesto. Los defaults van a `/usr/share/cosmic//` +# con la misma convención de cosmic-config que en cosmic-comp: **el nombre del fichero ES la clave**. +name = "cosmic-bg" +version = "1.5.0" + +[source] +tarball = "https://github.com/pop-os/cosmic-bg/archive/epoch-1.5.0/cosmic-bg-epoch-1.5.0.tar.gz" +sha256 = "12b30c60e15ac6c0f4b3eca8c37642145683e830833b429958222dfc395db177" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "static" +# Un único target para `cargo rustc --` (ver el comentario de cosmic-comp): el workspace trae también +# la lib de config. +flags = ["--bin", "cosmic-bg"] + +[build.phases] +install = ''' +mkdir -p /out/usr/bin /out/usr/share/cosmic/com.system76.CosmicBackground +cp target/release/cosmic-bg /out/usr/bin/cosmic-bg +chmod 755 /out/usr/bin/cosmic-bg +cd data && find v1 -type f -exec install -Dm0644 {} /out/usr/share/cosmic/com.system76.CosmicBackground/{} \; +''' diff --git a/recipes/incoming-cosmic/cosmic-comp.toml b/recipes/incoming-cosmic/cosmic-comp.toml new file mode 100644 index 00000000..888d0cec --- /dev/null +++ b/recipes/incoming-cosmic/cosmic-comp.toml @@ -0,0 +1,73 @@ +# cosmic-comp — el compositor Wayland de COSMIC (System76), sobre smithay. **Es LA pieza**: el resto +# de la suite son clientes suyos, así que si esto no construye, COSMIC no existe en hammer. +# +# ── POR QUÉ ESTA RECETA ES CASI GRATIS DE ESCRIBIR ────────────────────────────────────────────── +# `mirada-compositor` ya es un compositor smithay construido por este lab, y las deps en C de smithay +# no dependen del compositor sino de las features del backend: drm-sys→libdrm, gbm-sys→mesa, +# libseat-sys→seatd, input-sys→libinput, libudev-sys→libudev-zero, y wayland-server.pc→libffi/expat. +# La lista de abajo es LA MISMA que la de mirada, menos linux-pam (cosmic-comp no autentica: eso es de +# cosmic-greeter) y más `libdisplay-info`. Ese es el rédito de haber hecho mirada primero. +# +# ── LAS TRES FEATURES QUE ASUSTAN Y NO CUESTAN DEPS DE BUILD ──────────────────────────────────── +# smithay entra con `backend_vulkan`, `backend_x11` y `xwayland` prendidas (están fijas en su +# Cargo.toml, no se eligen desde la CLI), y ninguna agrega una librería a enlazar: +# · `backend_vulkan` → el crate `ash`, que carga Vulkan por **dlopen**; +# · `backend_x11` → `x11rb` con `dl-libxcb`, que hace lo mismo con libxcb; +# · `xwayland` → `x11rb` puro; lo que hace falta es el BINARIO Xwayland, y eso es runtime. +# O sea que libxcb/vulkan-loader son deuda de RUNTIME (y viven hoy sólo en la cola KDE), no un muro +# de compilación. Si algo de esto se rompe, el error va a ser en runtime y va a decir cuál falta. +# +# `libdisplay-info` sí es real: el crate 0.3 es un binding -sys que resuelve por pkg-config. La receta +# entra COPIADA byte a byte de la cola GNOME (y es idéntica a la de KDE), así que su hash no se mueve +# —b3:260f0519— y el artefacto ya sellado sirve tal cual: la copia no cuesta un build. +# +# `default = ["systemd"]` queda: el crate `libsystemd` es una **reimplementación en Rust**, no un +# binding a la C, así que no arrastra systemd; y `logind` habla `org.freedesktop.login1`, que en hammer +# lo sirve arje-logind-compat. Igual criterio que cosmic-session. +# +# Enlace DINÁMICO como mirada-compositor: smithay enlaza libdrm/gbm/seat/input de verdad y hace dlopen +# de EGL/wayland/xkbcommon; un estático acá no es una postura, es una mentira. +name = "cosmic-comp" +version = "1.5.0" + +[source] +tarball = "https://github.com/pop-os/cosmic-comp/archive/epoch-1.5.0/cosmic-comp-epoch-1.5.0.tar.gz" +sha256 = "ebdc79bd667b6ee167fcf5c4a616f56db7c24adfabc11ab3c3e572c5b2a52421" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +# `--bin cosmic-comp` no es cosmético: la fase compile del lab usa `cargo rustc -- -C …`, y +# `cargo rustc` EXIGE un único target cuando hay flags después del `--`. El paquete trae binario + +# lib + ejemplos, así que sin el filtro corta con «extra arguments to `rustc` can only be passed to +# one target». Mismo motivo por el que helix lleva `--bin hx`. +flags = ["--bin", "cosmic-comp"] + +[build.phases] +# El `install` del Makefile de upstream, sin las unidades de systemd (acá el que supervisa es arje) y +# sin `cosmic-service`, que sólo existe para ellas. +# +# ⚠ Las dos rutas largas NO son decorativas y no se pueden «ordenar»: cosmic-config guarda cada clave +# en UN FICHERO cuyo NOMBRE ES LA CLAVE, bajo `/v1/`. O sea que +# `.../CosmicSettings.Shortcuts/v1/defaults` significa la clave `defaults` del componente Shortcuts. +# Renombrar el fichero o aplanar el árbol no rompe el build: deja el escritorio SIN ATAJOS DE TECLADO, +# que en un compositor teselante es quedarse sin manejarlo. +# +# Y NO se instala el `data/cosmic.desktop` de este repo, aunque exista: es el de la «bare session» +# —arrancar el compositor sin gestor de sesión—, su `Exec` apunta a `/usr/bin/cosmic-service` (que +# vive en la rama de systemd que acá no va) y **colisiona en la misma ruta** con el que ya instala +# cosmic-session. Dos artefactos escribiendo `/usr/share/wayland-sessions/cosmic.desktop` es una +# carrera de orden de hidratación, y la que perdería es la entrada BUENA. +install = ''' +mkdir -p /out/usr/bin \ + /out/usr/share/cosmic/com.system76.CosmicSettings.Shortcuts/v1 \ + /out/usr/share/cosmic/com.system76.CosmicSettings.WindowRules/v1 +cp target/release/cosmic-comp /out/usr/bin/cosmic-comp +chmod 755 /out/usr/bin/cosmic-comp +cp data/keybindings.ron /out/usr/share/cosmic/com.system76.CosmicSettings.Shortcuts/v1/defaults +cp data/tiling-exceptions.ron /out/usr/share/cosmic/com.system76.CosmicSettings.WindowRules/v1/tiling_exception_defaults +''' + +[deps] +build = ["mesa", "wayland", "wayland-protocols", "libdrm", "seatd", "libinput", "libudev-zero", "libevdev", "mtdev", "libxkbcommon", "pixman", "expat", "zlib", "zstd", "libffi", "pkgconf", "libdisplay-info"] diff --git a/recipes/incoming-cosmic/cosmic-icons.toml b/recipes/incoming-cosmic/cosmic-icons.toml new file mode 100644 index 00000000..a93a81c8 --- /dev/null +++ b/recipes/incoming-cosmic/cosmic-icons.toml @@ -0,0 +1,34 @@ +# cosmic-icons — el tema de iconos «Cosmic» de COSMIC. Sin código: SVGs y un `index.theme`. +# +# Es dep de RUNTIME de casi toda la suite (panel, launcher, settings, app-library) y de ninguna en +# build. Va primero igual porque cuesta segundos y porque la lección ya la pagó GNOME dos veces: un +# escritorio sin tema de iconos no se ve «sin iconos», se ve ROTO — y con el cursor por software +# (obligatorio en render por CPU) directamente no se ve el puntero. +# +# `just install` de upstream traducido: son tres `find -exec install` a `/usr/share/icons/Cosmic`. +# `extra/` no es opcional pese al nombre: ahí viven los iconos propios de COSMIC (los de freedesktop +# son los estándar). Falta `hicolor-icon-theme`, que es de quien hereda cualquier tema: ya está en el +# corpus por la campaña GNOME y entra por la imagen, no por acá. +name = "cosmic-icons" +version = "1.5.0" + +[source] +tarball = "https://github.com/pop-os/cosmic-icons/archive/epoch-1.5.0/cosmic-icons-epoch-1.5.0.tar.gz" +sha256 = "e6caffc4c93f5afdaae3fbda4f3cc14363d3539cda1b0c5f478d32a8bb141c4c" + +[build] +compiler = "gcc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = 'true' +compile = 'true' +install = ''' +ICONS=/out/usr/share/icons/Cosmic +mkdir -p "$ICONS" +install -Dm0644 index.theme "$ICONS/index.theme" +cd freedesktop && find ./scalable -type f -exec install -Dm0644 {} "$ICONS"/{} \; && cd .. +cd extra && find ./scalable -type f -exec install -Dm0644 {} "$ICONS"/{} \; && cd .. +''' diff --git a/recipes/incoming-cosmic/hwdata.toml b/recipes/incoming-cosmic/hwdata.toml new file mode 100644 index 00000000..e8cc8ced --- /dev/null +++ b/recipes/incoming-cosmic/hwdata.toml @@ -0,0 +1,24 @@ +# hwdata 0.393 — bases de datos de IDs de hardware (pnp.ids, pci.ids, usb.ids) + hwdata.pc. Sin código: +# sólo datos. Campaña KDE (ADR 0011): lo exige libdisplay-info en tiempo de build (dependency('hwdata') +# native → pkgdatadir/pnp.ids) y kwin como RUNTIME (find_package(hwdata) TYPE RUNTIME, tabla PNP de EDID). +# `configure` es un script shell propio (no autoconf); no compila nada. +name = "hwdata" +version = "0.393" + +[source] +tarball = "https://github.com/vcrhonek/hwdata/archive/refs/tags/v0.393.tar.gz" +sha256 = "322add86944680e99d04468d49de180a7ce0c77fb406f7abde8ab14f2d161051" + +[build] +compiler = "gcc" +target = "x86_64-linux-musl" +link = "dynamic" +flags = [] + +[build.phases] +configure = './configure --prefix=/usr --libdir=/usr/lib --datadir=/usr/share' +compile = 'true' +install = 'make install DESTDIR=/out' + +[deps] +build = ["pkgconf"] diff --git a/recipes/incoming-cosmic/libdisplay-info.toml b/recipes/incoming-cosmic/libdisplay-info.toml new file mode 100644 index 00000000..4b39558a --- /dev/null +++ b/recipes/incoming-cosmic/libdisplay-info.toml @@ -0,0 +1,24 @@ +# libdisplay-info 0.2.0 — parseo de EDID/DisplayID (libdisplay-info.so). Campaña KDE (ADR 0011): sustrato +# de kwin (pkg_check_modules(libdisplay-info>=0.2.0) REQUIRED, lectura de EDID de los monitores). Meson. +# En build necesita pnp.ids: usa dependency('hwdata') native → si no está, cae a /usr/share/hwdata/pnp.ids +# y meson `files()` EXIGE que exista ⇒ hwdata es dep de build. Sin di-edid-decode (tool) para evitar más deps. +name = "libdisplay-info" +version = "0.2.0" + +[source] +tarball = "https://gitlab.freedesktop.org/emersion/libdisplay-info/-/archive/0.2.0/libdisplay-info-0.2.0.tar.gz" +sha256 = "f7331fcaf5527251b84c8fb84238d06cd2f458422ce950c80e86c72927aa8c2b" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" +zig_version = "0.13.0" + +[build.phases] +configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig meson setup output --prefix=/usr --buildtype=release" +compile = "ninja -C output" +install = "DESTDIR=/out ninja -C output install" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "hwdata"]