Files
sergioandClaude Opus 5 a6a9d59e4f licencias: 936 de 1141 (82%) — detección por evidencia, con sus dos imprecisiones declaradas
Esta mañana eran 0. Tras la tabla curada (228) y este paso, 936. Ninguna receta se
re-hasheó: verificado en 30 de las 708 tocadas, 30 hashes idénticos, 0 cambiados.

DE DÓNDE SALE EL DATO, Y POR QUÉ NO ES ADIVINAR. `scripts/licencias-detectar.sh` consulta
la API /repos/{o}/{r}/license de GitHub para las 673 recetas cuya fuente vive allí. Eso
devuelve el resultado de DETECTAR el fichero LICENSE que el repo tiene de verdad
(licensee), no una etiqueta escrita a mano en una web: es la misma evidencia que veríamos
abriendo el tarball, obtenida sin bajar 673 tarballs por un enlace de 8 Mbps. 610 con SPDX
definido; las 63 que GitHub marca NOASSERTION/other se DESCARTAN — un «no sé» de la fuente
se propaga como hueco, no se redondea a una licencia plausible.

Las familias no-GitHub van curadas por la URL DE FUENTE, que es la evidencia que el nombre
no da. Y ahí cometí el error simétrico al que este mismo fichero advertía: había puesto
`knighttime` entre las «herramientas Go» POR SU NOMBRE, y su tarball sale de
download.kde.org — es un Framework de KDE, LGPL. Descartar por nombre falla igual que
aceptar por nombre. Corregido en la cabecera.

LAS DOS IMPRECISIONES, contables con `licencias.sh --revisar` en vez de escondidas:

 1. SPDX OBSOLETOS Y AMBIGUOS (71 recetas). GitHub devuelve `GPL-3.0`, `LGPL-2.1`,
    `AGPL-3.0`… identificadores que SPDX declaró obsoletos PRECISAMENTE porque no
    distinguen `-only` de `-or-later`, y esa diferencia decide con qué se puede combinar el
    paquete. NO se normalizan a ciegas: mapear GPL-3.0 → GPL-3.0-or-later sería inventar el
    dato que falta. Quedan marcadas para resolver mirando el fuente.

 2. LICENCIAS DOBLES COLAPSADAS. La API devuelve UNA sola licencia y muchos proyectos Rust
    son «MIT OR Apache-2.0» (p.ej. `fd` quedó como Apache-2.0). No es falso —cumplir una de
    las opciones concedidas basta— pero es incompleto. Lo resuelve el cierre estructural:
    leer el campo `license` del Cargo.toml en la fase de fetch.

Y un fallo que habría escrito basura en silencio: `licencias-detectadas.tsv` tiene TRES
columnas (añade el owner/repo consultado, para poder auditar) y el sembrador leía dos, así
que la licencia se habría llevado pegado el slug — `license = "MIT<TAB>owner/repo"`, sin
que nada lo validara. Arreglado antes de sembrar.

Quedan 205 sin licencia y 71 por desambiguar.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 13:26:22 -04:00

108 lines
7.4 KiB
TOML

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