gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 815Rust 56Shell 37Markdown 291229 Definiciones

⎇ a6a9d59e4f0d354cf2c9066538c6fa7016fc6721 recipes/incoming-cosmic/cosmic-applets.toml TOML · 107 líneas · 7.4 KB Historia crudo

licencias: 936 de 1141 (82%) — detección por evidencia, con sus dos imprecisiones declaradas a6a9d59e4 · sergio ·

1# cosmic-applets — los applets del panel: reloj, audio, red, batería, workspaces, botón de apps…
2#
3# ── POR QUÉ APARECE RECIÉN AHORA, Y CÓMO SE SUPO ────────────────────────────────────────────────
4# `cosmic-panel` selló y arrancó **perfecto** —lee su config, crea su `wl_output`, dice «Spawning
5# applets», «Done spawning applets»— y la pantalla no cambió ni un color. La respuesta estaba en esa
6# misma línea: el panel spawnea TRECE clientes por AppID (`CosmicAppletTime`, `CosmicAppletAudio`,
7# `CosmicPanelAppButton`…) y **ninguno existía**. Un panel sin applets no es un panel vacío: es un
8# panel que no tiene nada que medir, así que no se dibuja.
9#
10# La lección, que ya apareció en GNOME con los typelibs: **un componente puede arrancar sin errores y
11# no pintar porque lo que le falta es un HIJO, no una librería.** El log del padre se lee sano.
12#
13# ── UN BINARIO, VEINTE NOMBRES ──────────────────────────────────────────────────────────────────
14# El diseño de upstream es un multiplexor: se compila UN `cosmic-applets` y cada applet es un
15# **symlink** con el nombre que el panel invoca (`just _link_applet` = `ln -sf`); el binario despacha
16# por `argv[0]`. Por eso el install de abajo son veinte symlinks y no veinte copias — y por eso una
17# sola receta cubre todo el panel.
18#
19# `cosmic-panel-button` es el segundo miembro por defecto del workspace: es el que provee los tres
20# botones (apps, launcher, workspaces), que no son applets sino otra cosa con el mismo mecanismo.
21name    = "cosmic-applets"
22version = "1.5.0"
23license = "GPL-3.0"
24
25[source]
26tarball = "https://github.com/pop-os/cosmic-applets/archive/epoch-1.5.0/cosmic-applets-epoch-1.5.0.tar.gz"
27sha256  = "ac9328e58f5e9cb9c7561a2ce4af212d4916d97c820741f0959366c7e1a0e3ba"
28# ⚠ EL PARCHE ARREGLA UNA URL, Y LA URL RARA ES INTENCIONAL RÍO ARRIBA.
29# El manifiesto apunta a `https://github.com/pop-os/cosmic-protocols//` — con DOS barras al final. No
30# es un dedazo: es el truco con el que upstream hace que cargo trate esa fuente como DISTINTA de la
31# URL normal, para que el `[patch."…/cosmic-protocols"]` de al lado no se apunte a sí mismo (cargo
32# rechaza un patch que reemplaza una fuente por ella misma). Pero GitHub **devuelve 404** a
33# `/pop-os/cosmic-protocols//info/refs`, así que `cargo vendor` no puede clonar y el build muere en el
34# fetch, antes de compilar una línea.
35#
36# La barra se MUEVE al medio: `https://github.com/pop-os//cosmic-protocols`. Es exactamente la forma
37# que usa `cosmic-comp` —que por eso construyó sin parche—, y GitHub sí la tolera. Se toca
38# `Cargo.toml` **y** `Cargo.lock` juntos: cambiar sólo uno rompe el `--locked` del build hermético.
39#
40# El primer intento fue `.git` en vez de `//`, y **falló por la razón que hace que el truco exista**:
41# cargo NORMALIZA el `.git`, así que el patch pasaba a apuntar a la misma fuente que reemplaza y
42# cortó con «patches must point to different sources». O sea que la barra de más no es reemplazable
43# por cualquier variante cosmética: tiene que ser una que cargo considere OTRA fuente y que el
44# servidor sepa servir. Sólo la del medio cumple las dos.
45patches = ["cosmic-applets-protocols-url.patch"]
46
47[build]
48compiler = "zig-cc"
49target   = "x86_64-linux-musl"
50link     = "dynamic"
51
52[build.phases]
53# Fase compile CUSTOM, y por un motivo concreto: hay que construir DOS binarios (`cosmic-applets` y
54# `cosmic-panel-button`, los `default-members` del workspace) y `cargo rustc --` sólo admite uno. Se
55# usa `cargo build`, replicando a mano el setup del lab —el wrapper zig-cc que sanea el triple de
56# Alpine y el `-crt-static`— porque `resolve_phases` no autogenera la fase si la receta la trae.
57#
58# `-C target-feature=-crt-static` va en RUSTFLAGS y no tras `--`: acá es SEGURO al revés que en
59# helix, porque lo que rompe los proc-macros es forzar `+crt-static` (un proc-macro es un dylib PIC);
60# desactivarlo es justo lo que ya necesitan.
61compile = '''
62printf '%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"
63chmod +x "$PWD/.hammer-zig-cc"
64RF="-C linker=$PWD/.hammer-zig-cc -C target-feature=-crt-static"
65rustc -vV | grep -q 'host: .*-alpine-' || RF="$RF -C link-self-contained=no"
66CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" cargo build --release --locked --offline
67'''
68# El `just install` traducido. Los `.desktop` los genera el build en `target/xdgen/`; se copian si
69# están (`|| true`) en vez de exigirlos, porque su ausencia no impide que el panel spawnee al applet
70# —lo invoca por nombre de binario— y sí haría fallar el sellado por un fichero decorativo.
71install = '''
72mkdir -p /out/usr/bin /out/usr/share/applications /out/usr/share/icons \
73         /out/usr/share/dbus-1/services /out/usr/share/dbus-1/system.d
74cp target/release/cosmic-applets      /out/usr/bin/cosmic-applets
75cp target/release/cosmic-panel-button /out/usr/bin/cosmic-panel-button
76chmod 755 /out/usr/bin/cosmic-applets /out/usr/bin/cosmic-panel-button
77for a in cosmic-app-list cosmic-applet-a11y cosmic-applet-audio cosmic-applet-input-sources \
78         cosmic-applet-battery cosmic-applet-bluetooth cosmic-applet-minimize \
79         cosmic-applet-network cosmic-applet-notifications cosmic-applet-power \
80         cosmic-applet-status-area cosmic-applet-tiling cosmic-applet-time \
81         cosmic-applet-workspaces cosmic-panel-button; do
82  ln -sf cosmic-applets /out/usr/bin/$a
83done
84# El panel invoca los tres botones por su propio nombre, no por el del multiplexor.
85for b in cosmic-panel-app-button cosmic-panel-launcher-button cosmic-panel-workspaces-button; do
86  ln -sf cosmic-panel-button /out/usr/bin/$b
87done
88[ -d target/xdgen ] && cp target/xdgen/*.desktop /out/usr/share/applications/ 2>/dev/null || true
89for d in */data/icons; do [ -d "$d" ] && cp -r "$d"/. /out/usr/share/icons/ 2>/dev/null || true; done
90[ -d cosmic-app-list/data/default_schema ] && mkdir -p /out/usr/share/cosmic && cp -r cosmic-app-list/data/default_schema/. /out/usr/share/cosmic/ 2>/dev/null || true
91cp cosmic-applet-network/data/dbus-1/system.d/*.conf /out/usr/share/dbus-1/system.d/ 2>/dev/null || true
92'''
93
94[deps]
95# `dbus-shared` se suma a las cuatro de todo cliente: los applets de red, bluetooth y status-area
96# hablan D-Bus por `libdbus-sys` (FFI a la C), no por zbus como el resto de la suite. Su `build.rs`
97# no da error legible — hace `panic!` a secas en la línea 25—, así que el mensaje útil es el nombre
98# del crate y no lo que dice.
99#
100# ⚠ Y tiene que ser la variante COMPARTIDA, no el `dbus` del corpus. Declarar `dbus` alcanza para que
101# `build.rs` pase (le basta el `.pc`, y el paquete del daemon lo trae) y el error aparece **una hora
102# después, en el enlace final**: `unable to find dynamic system library 'dbus-1'`. El corpus sólo
103# empaqueta `libdbus-1.a` ahí; el `.so` vive en `dbus-shared`. Que el build.rs esté contento no dice
104# nada sobre si el linker va a encontrar la biblioteca — son dos preguntas distintas y las contesta
105# pkg-config una y el linker la otra. El resto de la cola ya lo hacía bien (settings-daemon, pipewire);
106# ésta era la única receta de incoming-cosmic que pedía `dbus` a secas.
107build = ["libxkbcommon", "pkgconf", "libudev-zero", "libinput", "dbus-shared"]