GNOME deja de ser la cáscara: tres extensiones y la app que el proyecto no instala y todo el mundo
termina instalando. El perfil queda 190/190 con 28 raíces, deuda 0.
dash-to-panel v73 junta dash, ventanas y bandeja en una sola barra (lo que más cambia el uso)
appindicator v64 devuelve los ICONOS DE BANDEJA que GNOME quitó; sin ella las apps que usan
StatusNotifierItem corren y no tienen dónde mostrarse
blur-my-shell v72 (ya estaba; se le saca el override, ver abajo)
gnome-tweaks 46.1 tema, iconos, cursor, tipografías, los botones de minimizar/maximizar que
GNOME esconde, y el interruptor de las extensiones
⚠ LA LISTA DE ACTIVAS SE MUEVE A UN SOLO SITIO, y esto era una bomba de relojería. `enabled-extensions`
es un ARRAY: un override de GSettings lo escribe ENTERO. Con la primera extensión el override vivía
en su receta y funcionaba; con la segunda NO se habrían sumado — ganaría la que compile última
(orden alfabético) y las otras quedarían instaladas y MUERTAS, sin un solo error. Ahora la arma
`scripts/gnome/gnome-start-qemu.sh`, que ya compilaba los esquemas al arrancar, enumerando los uuid
presentes en /usr/share/gnome-shell/extensions. La política es «lo que la imagen instala, se
activa»; el dconf del usuario gana sobre el default.
Una receta NO puede ser ese sitio: hammer exige `[source]` en toda receta («missing field `source`»),
así que no hay forma de escribir una receta de pura política. Se probó el bloque contra un árbol de
juguete: lista las dos extensiones, salta un directorio sin metadata.json, el override compila con
stderr vacío y `gsettings get` devuelve las dos. Y si la lista cambia borra `gschemas.compiled` para
forzar recompilación — sin eso, una imagen ya arrancada ignoraría la extensión nueva en silencio.
⚠ EL HALLAZGO CARO: `msgfmt` de gettext-tiny REVIENTA con las formas plurales del árabe. SIGILL,
exit 132, «index 6 out of bounds for type 'size_t[6]'», y deja un .mo de 0 bytes. Reproducido FUERA
de la receta con el binario sellado. No es el idioma sino el mensaje: blur-my-shell compila su
ar.po sin problema porque no tiene NINGÚN plural (msgstr[5] = 0); el de tweaks tiene exactamente
uno. Acá se saca `ar` del LINGUAS y se pierde la traducción de UNA app, con el diagnóstico escrito
en la receta. ARREGLARLO ES OTRA UNIDAD DE TRABAJO: gettext-tiny la usan 108 recetas.
Cada receta usa el mecanismo de SU upstream, que no es el mismo en las tres:
blur-my-shell `make build` llama a `gnome-extensions pack` —el CLI que nuestro shell apaga— así
que se copia el árbol a mano, con el layout LEÍDO del zip de EGO y comparado
contra él (idéntico, sin sobras ni faltantes)
dash-to-panel su Makefile tiene un `install` que honra DESTDIR y hace lo de un paquete de
distro: gschema y locale a los directorios GLOBALES. ⚠ `VERSION=73` se pasa a
mano porque sin ella el Makefile hace `git describe` y el árbol viene por
`git archive`, sin `.git` ⇒ metadata quedaría con el marcador "version": 9999
appindicator meson. ⚠ `-Dlocal_install=disabled` explícito: en `auto` decide mirando si el uid
es 0, o sea que hoy acierta POR ACCIDENTE — y si el lab dejara de correr como
root instalaría en $HOME/.local y el artefacto sellaría vacío. Y `jq` va en deps
aunque sea JavaScript puro: su meson saca el uuid del metadata.json con jq
⚠ gnome-tweaks NO costó ninguna receta nueva, y eso hubo que medirlo: su meson declara siete deps
mínimas de runtime y las siete ya estaban selladas. La que parecía traer una cadena de Python
entera —`pygobject-3.0`— la provee `py3-gobject`, que YA ESTABA en el corpus con otro nombre y
publica `pygobject-3.0.pc`. El nombre no es el hecho, otra vez.
Sí costó dos deps que el configure reclamó y que son el patrón `.pc Requires` → `[deps].build`:
`appstream` (la pide `libadwaita-1.pc` y el error culpa a libadwaita, que está bien instalada) y
`desktop-file-utils` (meson la busca como PROGRAMA para `update-desktop-database`).
Sus deps de RUNTIME —python3 y py3-gobject— van declaradas: es una app de Python, si no están en la
imagen se instala y no arranca, y ningún build lo delata.
Las cuatro licencias, verificadas en la fuente pineada y NINGUNA leída del COPYING —cuyo apéndice
«How to Apply» trae siempre la frase «or any later version»—: blur-my-shell del README del commit,
dash-to-panel y appindicator de la cabecera de sus fuentes, gnome-tweaks de su etiqueta SPDX.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LCt3ettR4Z7b6wPCBmbvEV
98 lines
6.5 KiB
TOML
98 lines
6.5 KiB
TOML
# gnome-tweaks 46.1 — el «tenés que instalarte esto» clásico de GNOME. Es la app que expone lo que
|
|
# el shell no deja tocar desde Configuración: tema, iconos, cursor, tipografías, botones de la barra
|
|
# de título (minimizar/maximizar, que GNOME esconde), comportamiento del touchpad, aplicaciones al
|
|
# inicio y el interruptor de las extensiones.
|
|
#
|
|
# ⚠ POR QUÉ 46.1 Y NO LA ÚLTIMA. gnome-tweaks NO tiene release 47 ni 48: la lista de
|
|
# download.gnome.org salta de 46.1 a 49.rc/49.0. Nuestro shell es el 48, así que la que corresponde
|
|
# es la ÚLTIMA anterior — la 49 apunta a la serie 49 de libadwaita/GTK y no hay motivo para
|
|
# arriesgar APIs nuevas contra un escritorio 48. Comprobado en el `cache.json` del propio servidor,
|
|
# no en una lista de memoria.
|
|
#
|
|
# ══ NO CUESTA NINGUNA RECETA NUEVA, y eso hubo que medirlo ═════════════════════════════════════
|
|
# Su `meson.build:22-28` declara las versiones mínimas de runtime en un bloque explícito «to make
|
|
# packaging more obvious», y las siete se cumplen con lo que ya está sellado:
|
|
# glib >= 2.78 ✓ 2.88 gobject-introspection >= 1.78 ✓ 1.84
|
|
# gtk4 >= 4.10 ✓ libadwaita-1 >= 1.4 ✓ 1.7.6
|
|
# pygobject-3.0 >= 3.46 ✓ 3.50 gudev-1.0 >= 238 ✓ 238
|
|
# gsettings-desktop-schemas >= 46 ✓ 48.0
|
|
#
|
|
# ⚠ El `pygobject-3.0` de esa lista lo provee `py3-gobject`, que YA ESTABA en el corpus con otro
|
|
# nombre —la escribió el frente GNOME para el build de libgweather— y publica `pygobject-3.0.pc`
|
|
# (verificado en su artefacto). Sin mirar eso, esta receta parecía arrastrar una cadena de Python
|
|
# entera. El nombre no es el hecho, otra vez.
|
|
#
|
|
# ⚠ Y NO necesita pycairo, que es la parte que `py3-gobject` construye con `-Dpycairo=disabled`:
|
|
# ningún fichero de `gtweak/` importa `cairo` (verificado sobre el tarball).
|
|
#
|
|
# ══ ES UNA APP DE PYTHON: SUS DEPS DE RUNTIME NO SON LAS DE BUILD ══════════════════════════════
|
|
# No se enlaza nada — `gnome-tweaks` es un script que importa `gi.repository`. Si `python3` y
|
|
# `py3-gobject` no están EN LA IMAGEN, la app se instala y no arranca, y el build no puede
|
|
# delatarlo. Por eso van en `[deps] runtime`, que es exactamente el caso de `xkbcomp` en xwayland.
|
|
name = "gnome-tweaks"
|
|
version = "46.1"
|
|
# licencia: no hace falta interpretar nada — los fuentes llevan etiqueta SPDX explícita.
|
|
# `gtweak/tweakmodel.py:2`: «SPDX-License-Identifier: GPL-3.0+», que es la forma vieja de
|
|
# `GPL-3.0-or-later`. El tarball no trae COPYING sino un directorio `LICENSES/`.
|
|
license = "GPL-3.0-or-later"
|
|
|
|
[source]
|
|
tarball = "https://download.gnome.org/sources/gnome-tweaks/46/gnome-tweaks-46.1.tar.xz"
|
|
sha256 = "2f192a7085fbd6843ecf825716d9da21ec9272029149ea35f3e159e0ac309b80"
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "dynamic"
|
|
|
|
[build.phases]
|
|
# ⚠ SE SACA EL ÁRABE, y NO es una decisión sobre el idioma: es un BUG del `msgfmt` de
|
|
# `gettext-tiny`, el único que hay en el corpus. Revienta con SIGILL —«index 6 out of bounds for
|
|
# type 'size_t[6]'», exit 132— al compilar un mensaje con SEIS formas plurales, que es justo lo que
|
|
# tiene el árabe. Reproducido FUERA de la receta, con el binario sellado:
|
|
# msgfmt -o /tmp/x.mo po/ar.po → panic, exit 132, y deja un .mo de 0 bytes
|
|
# No es el idioma: `blur-my-shell` compila su `ar.po` sin problema porque no tiene NINGÚN mensaje
|
|
# plural (msgstr[5] = 0 apariciones); el de tweaks tiene exactamente uno (msgstr[5] = 1).
|
|
# ⚠ ARREGLARLO DE VERDAD ES OTRA UNIDAD DE TRABAJO: `gettext-tiny` la usan 108 recetas, así que
|
|
# tocarla re-hashea el corpus entero. Acá se pierde la traducción al árabe de UNA app y se deja el
|
|
# diagnóstico escrito; lo que NO se hace es callarlo.
|
|
configure = "sed -i '/^ar$/d' po/LINGUAS && PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload"
|
|
compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
|
|
install = '''
|
|
set -e
|
|
PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild
|
|
|
|
# Guardián: `gnome.post_install()` de meson se SALTA sus pasos cuando DESTDIR está seteado (lo dice
|
|
# en el log: «Skipping custom install script because DESTDIR is set»), así que lo que hay que
|
|
# comprobar es lo que SÍ tiene que quedar en el árbol. El gschema va al directorio GLOBAL, que es el
|
|
# que compila el lanzador al arrancar — igual que el de las extensiones.
|
|
test -s /out/usr/bin/gnome-tweaks
|
|
test -s /out/usr/share/glib-2.0/schemas/org.gnome.tweaks.gschema.xml
|
|
test -s /out/usr/share/applications/org.gnome.tweaks.desktop
|
|
# El módulo Python tiene que estar donde el intérprete lo busque, no en cualquier lado.
|
|
test -d /out/usr/lib/python3.12/site-packages/gtweak
|
|
'''
|
|
|
|
[deps]
|
|
# ⚠ RUNTIME, no build: es una app de Python que importa gi.repository. Sin estas dos en la imagen se
|
|
# instala y no arranca, y ningún build lo delata.
|
|
runtime = ["python3", "py3-gobject"]
|
|
# La clausura ENTERA, que las deps de hammer no son transitivas. Copiada de la que ya usa
|
|
# xdg-desktop-portal-gnome, que es el otro consumidor de gtk4+libadwaita de esta cola.
|
|
build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "gobject-introspection",
|
|
"py3-gobject", "gsettings-desktop-schemas", "gtk4", "libadwaita", "glib", "glib-introspected",
|
|
"gi-foreign-girs", "libgudev", "libudev-zero",
|
|
"cairo-shared", "pango", "graphene", "libepoxy", "wayland", "wayland-protocols", "libdrm",
|
|
"harfbuzz", "fribidi", "libpng-shared", "pixman", "freetype-shared", "expat", "libffi", "pcre2",
|
|
"zlib-shared", "gdk-pixbuf", "libjpeg-turbo-shared", "libtiff-shared", "mesa",
|
|
"fontconfig-shared", "xkeyboard-config", "iso-codes", "libseccomp",
|
|
# ⚠ `appstream` y su cola NO son un capricho: `libadwaita-1.pc` la lleva en `Requires`, así que
|
|
# pkg-config la resuelve TRANSITIVAMENTE y sin ella el configure corta con «Package 'appstream',
|
|
# required by 'libadwaita-1', not found» — culpando a libadwaita, que está perfectamente
|
|
# instalada. Es el patrón `.pc Requires` → `[deps].build` que el corpus ya tiene documentado.
|
|
"appstream", "libxmlb", "curl", "openssl", "libxml2-shared", "libyaml-shared", "zstd",
|
|
# `desktop-file-utils` por `update-desktop-database`: su `gnome.post_install()` lo pide como
|
|
# PROGRAMA y meson corta en el configure si no está (no es una librería que se enlace). La receta
|
|
# ya existe y encima está en el perfil desde el 2026-09-09.
|
|
"desktop-file-utils"]
|