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 1346Shell 97Rust 63Markdown 571650 Definiciones

⎇ 32627251b1adcc995958bd60e72226040bff6125 recipes/photosuite.toml TOML · 100 líneas · 6.2 KB Historia crudo

receta: photosuite (eolix) — el control independiente de que egui+wgpu entra; + el triaje de moli, zed, niri, rio, typst, jj, lapce y servo deed01974 · Sergio ·

1# photosuite — el OTRO editor de imágenes de esta ola, y el CONTROL de la suite ArtCraft
2#
3# ── POR QUÉ ENTRA, SI YA ESTÁ `photocraft` ─────────────────────────────────────────────────────
4# Porque es de otra gente (`github.com/eolix/photosuite`, 1.110★) y hace lo mismo con la misma
5# cadena: **Rust puro sobre eframe/egui 0.36 + wgpu**, MIT OR Apache-2.0, 687 crates. Tener dos
6# implementaciones independientes de la misma función sobre el mismo toolkit es lo que vuelve
7# medible la frase «egui+wgpu entra en esta distro»: si las dos pintan, no fue suerte de un repo.
8# Su diferencia declarada es la compatibilidad **PSD/PSB nativa** y un `.desktop` que registra
9# dieciocho tipos MIME de imagen.
10#
11# Triada el 2026-10-13 con el método de la adenda de `docs/plan-apps-usuario-final.md`, que es
12# mirar los `[target.…]` y no sólo el lock:
13#   · `gtk`/`gtk-sys`/`gdk-sys`/`atk-sys`/`pango-sys` **están en el lock y NO se compilan**: entran
14#     por `muda`, que vive bajo `cfg(target_os = "macos")`. Idéntico a `photocraft` y `filmcraft`.
15#   · en Linux sus únicas deps propias son `x11rb` (protocolo X en Rust puro) y `rfd`.
16#   · **`cc` aparece pero no es suyo**: viene de `blake3`, `wayland-backend` y `android-activity`.
17#   · sin `cpal` ⇒ sin ALSA, a diferencia de deck/sound/effect/filmcraft.
18#   · no committea `vendor/` ni usa `[patch.crates-io]` ⇒ el vendoreo va al `vendor/` por defecto
19#     (la trampa que mató a `pdfcraft` no aplica acá; comprobado en el árbol del tag).
20#
21# ⚠ **Y trae DOS cosas que las doce de ArtCraft no tienen, las dos medidas en su manifiesto:**
22#   1. `arboard` con `wayland-data-control` ⇒ **sí tiene portapapeles** en esta distro, donde ocho
23#      de las doce hermanas lo pierden en silencio.
24#   2. `winit` con `wayland-csd-adwaita` ⇒ dibuja sus propias decoraciones donde el compositor no
25#      las pone (GNOME). Sin eso, una ventana egui en GNOME sale sin barra de título.
26#
27# ── LA FORMA ───────────────────────────────────────────────────────────────────────────────────
28# La misma que las doce: `link = "dynamic"` + `-crt-static` (winit/wgpu cargan wayland y EGL por
29# `dlopen`), lanzador e iconos de upstream, y el `app_id` del `with_app_id()` coincide con el
30# basename del `.desktop` y con su `StartupWMClass` (`io.github.eolix.PhotoSuite`).
31# ⚠ Lo que NO se instala es `packaging/linux/io.github.eolix.PhotoSuite.metainfo.xml.in`: es una
32# PLANTILLA (`.in`) que el empaquetador de upstream sustituye. Instalarla cruda dejaría un
33# AppStream con marcadores sin resolver, que es peor que no tenerlo. Y no hay `.mime.xml` separado:
34# los tipos van dentro del `.desktop`.
35name    = "photosuite"
36version = "0.9.20"
37license = "MIT OR Apache-2.0"
38
39[source]
40# `v0.9.20`, el tag vigente al 2026-10-13. Se pinea el SHA: un tag se mueve.
41repo   = "https://github.com/eolix/photosuite"
42commit = "c60705fc71d550ef34aa9c52c36cbb884f3a93a8"
43# El `Cargo.lock` está committeado ⇒ el vendoreo va con `--locked` y queda pineado en el tiempo.
44# ⚠ `vendor_cargo_deps` sobrescribe `<src>/.cargo/config.toml` (`fetch.rs:852`) y este repo trae
45# uno propio: hoy es inocuo, pero si un bump mete ahí un `rustflags` o un `linker`, desaparece sin
46# aviso. Mirarlo en cada subida de pin.
47
48[build]
49compiler = "zig-cc"
50target   = "x86_64-linux-musl"
51link     = "dynamic"
52flags    = ["-p", "photosuite", "--bin", "photosuite"]
53
54[build.phases]
55compile = '''
56set -e
57# LOCKSTEP_XML_PATH — seguro barato heredado de `mirada-greeter`/`boveda`: `accesskit` → `atspi` →
58# `zbus-lockstep-macros`, cuyo `#[validate]` recorre el dir `xml/` y panicaba al toparse con el
59# subdirectorio `xml/schemas/`. ⚠ Medido el 2026-10-13: con `atspi-common` 0.13 ese panic **ya no
60# se dispara** (`vectorcraft` compiló sin esto). Se deja porque cuesta un `cp` y porque el día que
61# vuelva, el error no nombra la causa.
62XMLDIR="$PWD/.atspi-lockstep-xml"
63mkdir -p "$XMLDIR"
64ls vendor/atspi-common/xml/*.xml >/dev/null 2>&1 || { echo "no hay vendor/atspi-common/xml/*.xml — ¿cambió el vendoreo o la versión de atspi?" >&2; exit 1; }
65cp vendor/atspi-common/xml/*.xml "$XMLDIR"/
66export LOCKSTEP_XML_PATH="$XMLDIR"
67
68printf '%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"
69chmod +x "$PWD/.hammer-zig-cc"
70printf '%s\n' '#!/bin/sh' 'exec zig ar "$@"' > "$PWD/.hammer-zig-ar"
71chmod +x "$PWD/.hammer-zig-ar"
72RF="-C linker=$PWD/.hammer-zig-cc"
73rustc -vV | grep -q 'host: .*-alpine-' || RF="$RF -C link-self-contained=no"
74CC="$PWD/.hammer-zig-cc" AR="$PWD/.hammer-zig-ar" RUSTFLAGS="$RF" cargo rustc --release --locked --offline -p photosuite --bin photosuite -- -C target-feature=-crt-static
75'''
76install = '''
77set -e
78test -x target/release/photosuite || { echo "no hay target/release/photosuite — ¿cambió el nombre del bin?" >&2; exit 1; }
79install -Dm755 target/release/photosuite /out/usr/bin/photosuite
80
81install -Dm644 packaging/linux/io.github.eolix.PhotoSuite.desktop /out/usr/share/applications/io.github.eolix.PhotoSuite.desktop
82n=0
83for p in assets/app-icon/hicolor/*/apps/io.github.eolix.PhotoSuite.*; do
84  [ -f "$p" ] || continue
85  install -Dm644 "$p" "/out/usr/share/icons/hicolor/${p#assets/app-icon/hicolor/}"
86  n=$((n+1))
87done
88[ "$n" -gt 0 ] || { echo "ningún icono instalado — ¿cambió assets/app-icon/hicolor/?" >&2; exit 1; }
89install -Dm644 LICENSE-MIT /out/usr/share/licenses/photosuite/LICENSE-MIT
90install -Dm644 LICENSE-APACHE /out/usr/share/licenses/photosuite/LICENSE-APACHE
91
92test -s /out/usr/share/applications/io.github.eolix.PhotoSuite.desktop
93test -s /out/usr/bin/photosuite
94'''
95
96[deps]
97# El mismo juego que las doce de ArtCraft y que `boveda`/`mirada-greeter`: el stack gráfico se
98# consulta en build-time y se carga por `dlopen` en runtime. Sin fontconfig ni freetype: las
99# fuentes van EMBEBIDAS por `default_fonts` de eframe.
100build = ["mesa", "wayland", "wayland-protocols", "libdrm", "expat", "zlib", "zstd", "libffi", "pkgconf"]