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…

⎇ main recipes/incoming-gnome/gnome-shell-extension-blur-my-shell.toml TOML · 106 líneas · 6.3 KB Historia crudo

gnome: dash-to-panel, appindicator y gnome-tweaks — y la lista de activas sale de las recetas 4e4a2c8d2 · Sergio ·

1# blur-my-shell 72 — PRIMERA extensión de GNOME Shell del catálogo, y la que fija el patrón.
2#
3# ══ POR QUÉ EXISTE ═════════════════════════════════════════════════════════════════════════════
4# GNOME manda a propósito una cáscara mínima y el ecosistema la completa con extensiones. Sin
5# ninguna empaquetada, nuestra imagen de GNOME es esa cáscara: el shell SÍ sabe cargarlas
6# —`ui/extensionSystem.js` va en el gresource sin opción que lo apague, y su gschema sellado trae
7# `enabled-extensions`— pero no hay ninguna que cargar.
8#
9# ══ LA FUENTE ES EL REPO DEL AUTOR, NO EL ZIP DE extensions.gnome.org ══════════════════════════
10# EGO publica un `.zip` por versión con URL inmutable, que parecía la fuente obvia. Dos razones
11# para no usarlo:
12#   1. **takana no lo sabe abrir.** El fetch extrae con `tar -x` (fetch.rs:581) y GNU tar no lee
13#      zip — comprobado: «This does not look like a tar archive». Ninguna receta del corpus usa
14#      .zip. Soportarlo sería tocar el fetcher y sumarle una herramienta al host.
15#   2. **Y aunque lo abriera, no es la fuente.** El zip de EGO es un ARTEFACTO que construye EGO a
16#      partir de este mismo repo. Pinear el zip es pinear el binario de un tercero; pinear el
17#      commit es pinear el código del autor, que es lo que hace el resto del corpus.
18# El tag `v72` es el que EGO sirve para shell 48: verificado preguntándole
19# (`extension-info/?uuid=blur-my-shell@aunetx&shell_version=48` → version 72) y confirmado en el
20# `metadata.json` del propio zip, que declara shell-version ['46','47','48','49','50'].
21# ⚠ Eso hay que preguntarlo por extensión, no asumirlo: nixpkgs va por GNOME 50 y hay extensiones
22# que ya sólo declaran el major nuevo.
23#
24# ══ SE INSTALA A MANO Y NO CON `gnome-extensions pack` ═════════════════════════════════════════
25# El `make build` de upstream llama a `gnome-extensions pack`, que es el CLI `extensions-tool` del
26# propio gnome-shell — y nuestra receta del shell va con `-Dextensions_tool=false`. Encenderlo
27# costaría una receta nueva (gnome-autoar) y re-hashear gnome-shell entero.
28# No hace falta: `pack` sólo arma el zip que después alguien descomprime. Lo que el shell lee es un
29# DIRECTORIO en /usr/share/gnome-shell/extensions/<uuid>/, así que se copia el árbol directamente.
30# El layout no se inventó: se leyó del zip de EGO v72, que es la salida de ese mismo `pack` —
31# `src/*` va a la raíz, `resources/icons`→`icons/`, `resources/ui`→`ui/`, más metadata.json y
32# LICENSE.
33#
34# ⚠ El zip de EGO **no trae `gschemas.compiled`** (verificado): trae el .xml y quien instala
35# compila. Por eso `glib-compile-schemas` va en el install y `glib` en [deps] — sin eso la
36# extensión carga y muere al abrir sus preferencias, que es el fallo que no se ve al sellar.
37name    = "gnome-shell-extension-blur-my-shell"
38version = "72"
39# licencia: el README del commit pineado lo dice con todas las letras — «This program is distributed
40# under the terms of the GNU General Public License, version 3 or later». ⚠ La evidencia NO es el
41# fichero LICENSE: ahí sólo está el texto del GPL, y su apéndice «How to Apply» contiene la frase
42# «either version 3 … or any later version» SIEMPRE, así que grepearla da positivo aunque el
43# proyecto sea -only. Y el árbol JS no lleva cabecera de licencia en ningún fichero (verificado).
44license = "GPL-3.0-or-later"
45
46[source]
47repo   = "https://github.com/aunetx/blur-my-shell"
48commit = "444df605b34529dfab7be77d0f434bf54a6dd4cc"  # tag v72 (ADR 0006: commit fijo, nunca HEAD)
49
50[build]
51compiler = "zig-cc"
52target   = "x86_64-linux-musl"
53link     = "dynamic"
54
55[build.phases]
56# No hay nada que compilar: son JS, XML de esquema y catálogos de traducción.
57configure = "true"
58compile   = "true"
59install = '''
60set -e
61UUID="blur-my-shell@aunetx"
62D="/out/usr/share/gnome-shell/extensions/$UUID"
63mkdir -p "$D"
64
65# 1. El árbol, con la MISMA forma que produce `gnome-extensions pack` (leída del zip de EGO v72).
66cp -r src/. "$D/"
67cp metadata.json LICENSE "$D/"
68cp -r resources/icons "$D/icons"
69cp -r resources/ui    "$D/ui"
70
71# 2. El esquema: se copia el .xml Y se compila. El shell abre las preferencias con
72#    Gio.SettingsSchemaSource.new_from_directory, que necesita el gschemas.compiled.
73mkdir -p "$D/schemas"
74cp schemas/*.gschema.xml "$D/schemas/"
75glib-compile-schemas "$D/schemas"
76
77# 3. Traducciones: un .mo por idioma, nombrado por el UUID (así lo busca el shell).
78for po in po/*.po; do
79  lang="$(basename "$po" .po)"
80  mkdir -p "$D/locale/$lang/LC_MESSAGES"
81  msgfmt -o "$D/locale/$lang/LC_MESSAGES/$UUID.mo" "$po"
82done
83
84# 4. ⚠ INSTALADA ≠ ACTIVA, y eso NO se resuelve acá. El shell sólo carga lo que esté en
85#    `org.gnome.shell enabled-extensions`, que es un ARRAY: un override de GSettings lo escribe
86#    ENTERO. Si cada receta trajera el suyo no se sumarían — ganaría el que compile último y las
87#    demás quedarían instaladas y MUERTAS, sin un solo error. Por eso la lista se arma en UN sitio,
88#    `scripts/gnome/gnome-start-qemu.sh`, que ya compila los esquemas al arrancar y ahora enumera
89#    los uuid presentes en /usr/share/gnome-shell/extensions. La política es «lo que la imagen
90#    instala, se activa»; quien no quiera una la apaga desde su dconf, que gana sobre el default.
91#    (Una receta no puede ser ese sitio: hammer exige `[source]` en toda receta — «missing field
92#    `source`» —, así que no hay forma de escribir una receta de pura política.)
93
94# 5. Guardián barato: si el árbol quedara vacío o sin metadata, el artefacto sellaría igual y el
95#    fallo aparecería recién al arrancar el escritorio (regla 3 de CLAUDE.md — un vacío llega hasta
96#    el final diciendo que todo fue bien).
97test -s "$D/metadata.json"
98test -s "$D/extension.js"
99test -s "$D/schemas/gschemas.compiled"
100grep -q '"48"' "$D/metadata.json"   # falla ruidoso si un bump de versión deja de soportar shell 48
101'''
102
103[deps]
104# `glib` por glib-compile-schemas y `gettext-tiny` por msgfmt: las dos son herramientas del
105# sandbox, no librerías que la extensión enlace (no enlaza nada: es JavaScript).
106build = ["glib", "pcre2", "libffi", "zlib", "gettext-tiny"]