📁 cosmic: cosmic-files — la 2ª aplicación, y «ya está compilado» era falso por una línea

Sellada b3:48d2b072. Cola 32/32, escritorio-cosmic 70/70. Abre desde la biblioteca y lista
el sistema de ficheros real de hammer (bin 72 ítems, dev, ente, etc, lib, lost+found).

Entró creyendo que era casi gratis porque cosmic-term ya la compila como crate. No lo era:
cosmic-term la declara con default-features = false. Lo que un paquete cuesta depende de
con qué features lo pide quien lo usa, así que «ya se compiló» puede ser falso.

Dos features apagadas, las dos por medición:
· gvfs trae gio/glib y el enlace final pide las glib COMPARTIDAS; el corpus sólo las tiene
  estáticas. Se pierden montajes remotos, no la navegación local. Por eso tampoco se
  construye cosmic-files-applet: su Cargo.toml fija gvfs a mano.
· wgpu desbordó el filesystem dos veces (No space left on device en /src/target) con
  wgpu+naga+ash+glow+spirv a codegen-units=1. Sin él el árbol queda en ~2 GB, y no se
  pierde nada: el resto de la suite pinta con tiny-skia y la imagen no tiene GPU.

Y la regla que dejó el intento con glib declarado: el error fue «Package libpcre2-8,
required by glib-2.0, not found» — el que falla no es la dep sino lo que su .pc declara en
Requires. Declarar una dep trae su artefacto, no su clausura de pkg-config; se lee con
grep ^Requires sobre los .pc ANTES de gastar el build.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-04 13:28:42 -04:00
co-authored by Claude Opus 5
parent db986e7f00
commit 23c0e82527
7 changed files with 151 additions and 20 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

+36 -4
View File
@@ -110,8 +110,9 @@ Más `cosmic-settings-daemon` y `xdg-desktop-portal-cosmic` fuera de esa lista.
| `gmp` 6.3.0 · `mpfr` 4.2.2 (cadena de la calculadora) | ✅ sellados a la primera | `b3:d99a0a5d` · `b3:13982d20` |
| `libqalculate` 5.12.0 (`qalc`) | ✅ sellado — la calculadora del lanzador ANDA (ver abajo) | `b3:edb8d14d` |
| **`cosmic-term`** 1.5.0 — la 1ª APLICACIÓN | ✅ **sellada a la primera** (arrastra `cosmic-files` y `wgpu`) | `b3:d0ea1c1e` |
| `cosmic-files` 1.5.0 — la 2ª aplicación | ✅ sellada, **sin `gvfs` ni `wgpu`** (ver abajo) | `b3:48d2b072` |
**La cola está COMPLETA: 31 recetas, `escritorio-cosmic` 69/69.**
**La cola está COMPLETA: 32 recetas, `escritorio-cosmic` 70/70.**
**El mínimo viable de una sesión son cuatro**: `cosmic-comp` + `cosmic-settings-daemon` +
`cosmic-notifications` + `cosmic-panel` (los tres `.expect` de la tabla de arriba).
@@ -581,6 +582,36 @@ pero trae `--with-fallbacks=…,xterm-256color,…` compilados. A la terminal no
necesita terminfo es lo que corre ADENTRO— y el hijo acá es el `sh` de busybox, que no lo usa. El día
que entren `vim` o `htop` en la imagen, hará falta un paquete de datos de terminfo.
### 📁 `cosmic-files`: «ya está compilado» era falso por una línea del vecino
`docs/evidencia/cosmic-files-qemu-2026-08-04.png`: el gestor abre desde la biblioteca y **lista el
sistema de ficheros real de hammer** — `bin` (72 ítems), `dev` (129), `ente`, `etc`, `lib`,
`lost+found`—, con su barra lateral de Recientes/Carpeta personal/Papelera.
Entró creyendo que era casi gratis, porque `cosmic-term` **ya compila cosmic-files como crate**. No
lo era, y el motivo cabe en una línea del `Cargo.toml` del vecino: `cosmic-term` lo declara con
`default-features = false`. **Lo que un paquete cuesta depende de con qué features lo pide quien lo
usa**, así que «ya se compiló» puede ser falso.
**Se apagaron dos features por defecto, y las dos por una razón medida:**
- **`gvfs`** trae los crates `gio`/`glib`, y el enlace final pide las glib **compartidas**
(`unable to find dynamic system library 'gio-2.0'`, y detrás gobject, glib, ffi, pcre2, z). El
corpus las empaqueta **sólo estáticas**: haría falta una cadena `-shared` entera, que es una
campaña aparte y mete una segunda glib en la imagen. Se pierden los **montajes remotos** (SFTP,
MTP), no la navegación local. ⚠ Y por eso tampoco se construye `cosmic-files-applet`: su
`Cargo.toml` fija `gvfs` a mano, así que apagarla en el paquete raíz no lo alcanza.
- **`wgpu`** desbordó el filesystem: `No space left on device` creando un temp dir en `/src/target`,
**dos veces**, con wgpu+naga+ash+glow+spirv a `codegen-units=1`. Sin él el árbol de build queda en
~2 GB. No se pierde nada: todos los demás clientes de la suite pintan con tiny-skia y la imagen no
tiene GPU.
**El intento con `glib` declarado dejó una regla que vale para toda la cola:** el error fue
`Package 'libpcre2-8', required by 'glib-2.0', not found` — o sea que **el que falla no es la dep
sino lo que su `.pc` declara en `Requires`**. Declarar una dep trae su artefacto, no su clausura de
pkg-config. Se lee en dos segundos con `grep ^Requires` sobre los `.pc` del artefacto, ANTES de
gastar el build: `glib-2.0.pc → libpcre2-8`, `gobject-2.0.pc → libffi`, `gio-2.0.pc → zlib`.
### ⏱ El panel tiene un DEADLINE de arranque: con 4 vCPU sale mutilado
Medido: con `-smp 4` el panel arranca **sin ala izquierda, sin reloj y sin dock** —sólo la bandeja
@@ -597,9 +628,10 @@ El número de procesos no distingue «arrancó» de «dibujó». El framebuffer
## Lo que falta, en orden
1. **Más aplicaciones.** `cosmic-term` ya está y es la única. `cosmic-files` **ya se compila entero**
como dep de la terminal, así que empaquetarlo como aplicación es casi gratis; después
`cosmic-settings` y `cosmic-edit`.
1. **Más aplicaciones**: `cosmic-settings` (el panel de control) y `cosmic-edit`.
2. **La cadena glib COMPARTIDA** (`glib` + `pcre2` + `libffi` + `zlib` con `.so`), que destrabaría
`gvfs` en cosmic-files y su applet del panel. Es una campaña propia y hay que decidir antes si la
imagen puede tener una sola glib.
2. `xdg-desktop-portal-cosmic` — sin él no hay captura de pantalla, ni file-chooser, ni compartir.
3. `cosmic-settings` (el panel de control) y `cosmic-files`: la suite tiene aplicaciones y el
catálogo todavía no.
+16 -16
View File
@@ -3,8 +3,8 @@
"totals": {
"recipes": 802,
"nodes": 802,
"sealed": 799,
"never": 3
"sealed": 800,
"never": 2
},
"by_class": {
"c": 160,
@@ -14,8 +14,7 @@
"rust": 243
},
"debt_by_class": {
"c": 2,
"rust": 1
"c": 2
},
"by_queue": {
"corpus": {
@@ -23,8 +22,7 @@
"never": 2
},
"incoming-cosmic": {
"sealed": 31,
"never": 1
"sealed": 32
}
},
"by_profile": {
@@ -39,9 +37,9 @@
"sealed": 74
},
"escritorio-cosmic": {
"raices": 21,
"clausura": 69,
"sealed": 69
"raices": 22,
"clausura": 70,
"sealed": 70
},
"escritorio-mirada": {
"raices": 14,
@@ -49,7 +47,7 @@
"sealed": 31
}
},
"sin_perfil": 650,
"sin_perfil": 649,
"orphan_deps": [],
"topo_ok": true,
"nodes": {
@@ -2453,10 +2451,12 @@
"cls": "rust",
"queue": "incoming-cosmic",
"hash": "b3:48d2b072f96cf45f0287b347c208d22d877eb52d388f72916bbded9e4fb69166",
"state": "never",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [],
"perfiles": [
"escritorio-cosmic"
],
"dependientes_total": 0
},
"cosmic-icons": {
@@ -8162,7 +8162,7 @@
"hash": "b3:5ac3a6a211364c8dd3c5d75c840493caf5fc2df169d49727f61fb5c3e8d5d738",
"state": "sealed",
"blocked_by": [],
"unblocks": 1,
"unblocks": 0,
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
@@ -8388,7 +8388,7 @@
"hash": "b3:6d26d5f414d83c0cf72864467f3fdba6357e9a60bb79cbdf9202e1d6456abdd7",
"state": "sealed",
"blocked_by": [],
"unblocks": 1,
"unblocks": 0,
"perfiles": [
"base",
"cli",
@@ -8472,7 +8472,7 @@
"hash": "b3:14d29058553e8b2a93ade023ecf80815749117d66d183ced6605d701675aeda1",
"state": "sealed",
"blocked_by": [],
"unblocks": 1,
"unblocks": 0,
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
@@ -10658,7 +10658,7 @@
"hash": "b3:f0b5d0b1cb4321b3c61f24a871b9a58da3ebb7eb903af4015e35bd41a6465437",
"state": "sealed",
"blocked_by": [],
"unblocks": 1,
"unblocks": 0,
"perfiles": [
"base",
"cli",
+3
View File
@@ -110,6 +110,9 @@ paquetes = [
# La primera APLICACIÓN con ventana del catálogo, y la primera entrada de la biblioteca que no es
# `NoDisplay`. Hasta acá el perfil listaba escritorio; desde acá lista también lo que se abre.
"cosmic-term",
# La segunda: el gestor de ficheros. Sin `gvfs` (no hay glib compartida) ⇒ navegación local sí,
# montajes remotos no.
"cosmic-files",
# Datos, no binarios: el tema de iconos (y el hicolor del que hereda), las tablas de xkb y una
# tipografía. Ninguno es dep de build de nadie y sin ellos el escritorio arranca roto — sin puntero,
# sin teclado o con tofu.
+94
View File
@@ -0,0 +1,94 @@
# cosmic-files — el gestor de ficheros. Segunda aplicación con ventana del catálogo, y la más barata
# de todas: **su código ya se compiló entero** cuando entró `cosmic-term`, que lo usa como CRATE (el
# selector de ficheros y el arrastrar-y-soltar). Acá sólo se lo construye como PROGRAMA.
#
# ── PERO NO ES GRATIS DEL TODO, Y LA DIFERENCIA ES UNA LÍNEA DE `cosmic-term` ───────────────────
# `cosmic-term` lo declara con `default-features = false`. Sus features por defecto incluyen
# **`gvfs`**, que trae los crates `gio`/`glib` — bindings a la **glib de C** por pkg-config. O sea que
# el gestor de ficheros como APLICACIÓN cuesta más que como librería, por una línea del Cargo.toml
# del vecino: *lo que un paquete cuesta depende de con qué features lo pide quien lo usa*, y
# «ya se compiló» puede ser falso.
#
# ── `gvfs` APAGADA, Y POR QUÉ NO SE PUDO DEJAR ──────────────────────────────────────────────────
# Con `gvfs` el enlace final pide las glib **COMPARTIDAS**:
# error: unable to find dynamic system library 'gio-2.0'
# …y detrás: gobject-2.0, glib-2.0, ffi, pcre2-8, z
# El corpus las empaqueta **sólo estáticas**, así que haría falta una cadena `-shared` entera (glib +
# pcre2 + libffi + zlib), que es una campaña aparte y mete una segunda glib en la imagen — justo lo
# que la campaña GNOME midió y evitó. Se apaga `gvfs`: **se pierden los montajes remotos/de red**
# (SFTP, MTP, trash sobre gvfs), no la navegación local, que es lo que esta imagen tiene.
#
# ⚠ Y por eso **NO se construye `cosmic-files-applet`**: su `Cargo.toml` fija `features = [… "gvfs" …]`
# a mano, así que apagarla en el paquete raíz no lo alcanza. Es un applet del panel, no el gestor;
# queda como deuda junto con la cadena glib compartida.
#
# `bzip2` 0.6 NO trae C: resuelve a `libbz2-rs-sys`, que es Rust puro. Se comprobó en el `Cargo.lock`
# (`bzip2-sys` no aparece) antes de agregar una dep que no hacía falta.
name = "cosmic-files"
version = "1.5.0"
[source]
tarball = "https://github.com/pop-os/cosmic-files/archive/epoch-1.5.0/cosmic-files-epoch-1.5.0.tar.gz"
sha256 = "da8567bcd0a15ca6522a8800ec800701f8e994ef5da52513b3afdf95370e3bf1"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
[build.phases]
# Fase compile CUSTOM: hay que elegir features a mano (`--no-default-features`), que la fase que
# autogenera el lab no permite. Se construye SÓLO el paquete raíz —no `--workspace`— porque el otro
# miembro es el applet, que exige gvfs.
#
# La lista es la `default` de upstream MENOS `gvfs` (ver arriba) y MENOS **`wgpu`**. Lo de wgpu no es
# una preferencia estética: con él el árbol de build (wgpu + naga + ash + glow + spirv, todo a
# `codegen-units=1`) desbordó el filesystem —`No space left on device` creando un temp dir en
# `/src/target`— dos veces. Y no se pierde nada real: **todo el resto de los clientes que sellamos
# pinta con tiny-skia** porque su libcosmic entra sin esa feature, y la imagen no tiene GPU (mesa es
# llvmpipe por software), así que el backend wgpu se caería a software de todos modos.
#
# `INSTALL_DIR` y `APPID` los exporta el justfile de upstream y los lee el `build.rs` (crate `xdgen`)
# para generar el `.desktop` y el `.metainfo.xml` en `target/xdgen/`. Sin ellos el `.desktop` sale
# con rutas equivocadas — y ese fichero es justamente lo que hace que la aplicación aparezca en la
# biblioteca.
compile = '''
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"
export INSTALL_DIR=/usr/share APPID=com.system76.CosmicFiles
CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo build --release --locked --offline \
-p cosmic-files --no-default-features \
--features bzip2,dbus-config,desktop,io-uring,lzma-rust2,notify,wayland
'''
install = '''
mkdir -p /out/usr/bin /out/usr/share/applications /out/usr/share/metainfo
cp target/release/cosmic-files /out/usr/bin/cosmic-files
chmod 755 /out/usr/bin/cosmic-files
cp target/xdgen/com.system76.CosmicFiles.desktop /out/usr/share/applications/ 2>/dev/null || true
cp target/xdgen/com.system76.CosmicFiles.metainfo.xml /out/usr/share/metainfo/ 2>/dev/null || true
for size in res/icons/hicolor/*; do
[ -d "$size" ] || continue
s=$(basename "$size")
if [ -f "$size/apps/com.system76.CosmicFiles.svg" ]; then
mkdir -p "/out/usr/share/icons/hicolor/$s/apps"
cp "$size/apps/com.system76.CosmicFiles.svg" "/out/usr/share/icons/hicolor/$s/apps/"
fi
done
'''
[deps]
# El juego fijo de todo cliente, más la cadena de `gvfs` (crates `gio`/`glib` → pkg-config sobre
# `gio-2.0`/`glib-2.0`). `notify-rust` e `io-uring` no suman C: zbus y syscalls directas.
#
# Sin `gvfs` no hay glib: queda el juego fijo de todo cliente de la suite. `notify-rust`, `io-uring`,
# `bzip2` y `lzma-rust2` no suman C (zbus, syscalls directas y backends en Rust).
#
# Queda anotado el intento anterior, que costó dos builds y vale como regla: cuando SÍ se declaró
# `glib`, el error fue «Package 'libpcre2-8', required by 'glib-2.0', not found» o sea que el que
# falla no es la dep sino **lo que su `.pc` declara en `Requires`**. Declarar una dep trae su
# artefacto, no su clausura de pkg-config. Se lee de una con `grep ^Requires` sobre los `.pc` del
# artefacto, antes de gastar el build: `glib-2.0.pc → libpcre2-8`, `gobject-2.0.pc → libffi`,
# `gio-2.0.pc → zlib`.
build = ["libxkbcommon", "pkgconf", "libudev-zero", "libinput"]
+2
View File
@@ -59,6 +59,8 @@ else
# alcanzable «desde el escritorio»: su `.desktop` no es `NoDisplay`, así que aparece en la
# biblioteca. Sigue siendo raíz a mano porque nadie la declara como dep de nada.
recipes/incoming-cosmic/cosmic-term.toml
# …y el gestor de ficheros, la segunda. Su `.desktop` tampoco es `NoDisplay`.
recipes/incoming-cosmic/cosmic-files.toml
recipes/incoming-cosmic/cosmic-app-library.toml
recipes/incoming-cosmic/cosmic-workspaces-epoch.toml
# Ni binario ni librería: DATOS. El tema de iconos de COSMIC — sin él el escritorio no se ve