From 4d48edac0df15db856879a06d9359673aed91a3d Mon Sep 17 00:00:00 2001 From: sergio Date: Wed, 29 Jul 2026 13:43:06 -0400 Subject: [PATCH] =?UTF-8?q?gnome:=205=20de=20los=207=20typelibs=20de=20run?= =?UTF-8?q?time=20=E2=80=94=20gnome-desktop=20a=20la=20isla=20din=C3=A1mic?= =?UTF-8?q?a=20+=205=20recetas=20nuevas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit De los siete que faltaban quedan dos (Rsvg, IBus). Cerrados acá: GnomeDesktop-4.0 + GnomeBG-4.0 gnome-desktop b3:b3aed0d6 UPowerGlib-1.0 upower b3:95d1081a Geoclue-2.0 geoclue b3:50e9de94 GWeather-4.0 libgweather b3:d289ac66 gnome-desktop NO se duplicó en una variante `-introspected`, y la razón es la regla de los dos registros de GType: mutter y gnome-shell ENLAZAN libgnome-desktop y gjs además dlopearía la .so del typelib ⇒ convivirían la .a enlazada y la .so cargada, cada una con su tabla. Es el cuadro que costó el episodio de colord. `yupana radio` = 2 sellados a deuda (mutter, gnome-shell), el mismo par de siempre. Con introspección encendida los dos seds que borraban `libgnome_rr_gir`/`libgnome_bg_gir` dejan de hacer falta. Su cierre tuvo que pasar a las variantes `-shared`, y no por prolijidad: con `libpng` estática no hay libpng16.so, `libgdk_pixbuf-2.0.so.0` no relocaliza y el `ldd` con que g-ir-scanner resuelve las shlibs sale con 127. **Si una receta introspecta, su cierre entero tiene que ser CARGABLE** — el scanner compila y ejecuta un binario de verdad. Dos recetas entraron por transitividad, no por la lista del shell: - geocode-glib (b3:f24e4147), que pide libgweather. Su `-Dsoup2=false` es LA opción: con el default se construye `geocode-glib-1.0` contra libsoup2 —que esta distro no tiene— y libgweather no la encuentra aunque esté instalada. - py3-gobject/pygobject (b3:492930f2), y ésta ni siquiera va a la imagen: va al CONSTRUCTOR. `gen_locations_variant.py` de libgweather importa gi.repository.GLib para serializar la base de ciudades a un GVariant binario. El formato lo define GLib. Decisiones de alcance escritas en cada receta: geoclue va SIN demonio (-Denable-backend=false evita ModemManager, Avahi y libsoup; la librería cliente habla por D-Bus), upower sin libimobiledevice, y libgweather sin `po-locations` ⇒ las ciudades salen en inglés, la base de datos se genera igual. De upower, tres perillas que hay que fijar porque su `auto` significa "preguntale a un pkg-config de systemd": udevrulesdir/udevhwdbdir (nuestro udev-pc declara `udevdir`, no `udev_dir`) y systemdsystemunitdir=no. Co-Authored-By: Claude Opus 5 (1M context) --- recipes/incoming-gnome/geoclue.toml | 51 ++++++++++++++++++++ recipes/incoming-gnome/geocode-glib.toml | 46 ++++++++++++++++++ recipes/incoming-gnome/gnome-desktop.toml | 56 +++++++++++++++++----- recipes/incoming-gnome/libgweather.toml | 55 ++++++++++++++++++++++ recipes/incoming-gnome/py3-gobject.toml | 38 +++++++++++++++ recipes/incoming-gnome/upower.toml | 57 +++++++++++++++++++++++ 6 files changed, 291 insertions(+), 12 deletions(-) create mode 100644 recipes/incoming-gnome/geoclue.toml create mode 100644 recipes/incoming-gnome/geocode-glib.toml create mode 100644 recipes/incoming-gnome/libgweather.toml create mode 100644 recipes/incoming-gnome/py3-gobject.toml create mode 100644 recipes/incoming-gnome/upower.toml diff --git a/recipes/incoming-gnome/geoclue.toml b/recipes/incoming-gnome/geoclue.toml new file mode 100644 index 00000000..989ee6cb --- /dev/null +++ b/recipes/incoming-gnome/geoclue.toml @@ -0,0 +1,51 @@ +# geoclue 2.8.2 — SÓLO `libgeoclue` y su typelib `Geoclue-2.0`, sin el demonio. +# +# POR QUÉ ENTRA: gnome-shell lo importa desde JavaScript sin condicional +# (`js/misc/dependencies.js`: `import 'gi://Geoclue?version=2.0'`) — lo usa el indicador de +# «ubicación en uso» del panel y el ajuste automático de zona horaria. Dep de RUNTIME del shell, +# invisible a su grafo de build, destapada arrancando la sesión. +# +# `-Denable-backend=false` es la decisión de alcance de esta receta, y no es un recorte arbitrario: +# el demonio (`src/`) es el que arrastra ModemManager (fuentes 3G/CDMA/GPS de módem), Avahi (NMEA por +# red) y libsoup+json-glib (geolocalización por IP y por WiFi). La librería cliente no toca nada de +# eso: habla con el servicio por D-Bus. Como acá lo que hace falta es el typelib, se construye la +# mitad cliente y se deja escrito que la otra existe. Cuando haya un caso de uso real —ubicación de +# verdad, no el ícono— hay que volver por el demonio y traer esas dependencias. +# +# Sin el backend quedan `public-api`, `interface`, `libgeoclue` y `data`. Se borran a mano: +# · `subdir('demo')` → `where-am-i`, un ejecutable de ejemplo que nadie instala en una imagen. +# · `subdir('po')` → el msgfmt de gettext-tiny aborta. SÉPTIMA vez en la campaña; ya no es un +# gotcha, es la deuda de autorar el gettext de GNU. +# +# `-Dvapi=false` (no hay valac en el corpus) y `-Dgtk-doc=false`. +# +# ISLA DINÁMICA: el typelib nombra `libgeoclue-2.so.0` y gjs la dlopea. +# +# FUENTE: archivo de gitlab.freedesktop.org, como cairo/libdrm/libinput/pixman/modemmanager. +name = "geoclue" +version = "2.8.2" + +[source] +tarball = "https://gitlab.freedesktop.org/geoclue/geoclue/-/archive/2.8.2/geoclue-2.8.2.tar.gz" +sha256 = "5435f7d48105fe89a4259f807658281e854881267254bcd4eeac6e26c222055b" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = ''' +set -e +sed -i "/^subdir('demo')$/d; /^subdir('po')$/d" meson.build +PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output \ + --prefix=/usr --buildtype=release --wrap-mode=nodownload \ + -Ddefault_library=both -Denable-backend=false -Dlibgeoclue=true \ + -Dintrospection=true -Dvapi=false -Dgtk-doc=false -Ddemo-agent=false \ + -Dc_args=-Wno-error=date-time +''' +compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" +install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "py3-setuptools", "gobject-introspection", "gi-foreign-girs", "glib", "glib-introspected", "libffi", "pcre2", "zlib-shared"] diff --git a/recipes/incoming-gnome/geocode-glib.toml b/recipes/incoming-gnome/geocode-glib.toml new file mode 100644 index 00000000..36c4cf3b --- /dev/null +++ b/recipes/incoming-gnome/geocode-glib.toml @@ -0,0 +1,46 @@ +# geocode-glib 3.26.4 — geocodificación (dirección ↔ coordenadas) contra Nominatim, sobre libsoup. +# +# POR QUÉ ENTRA, y no por donde se esperaba: no la pide el shell directamente. La pide **libgweather** +# (`libgweather/meson.build:115`, `dependency('geocode-glib-2.0')`), y libgweather sí es dep de +# runtime del shell — `import 'gi://GWeather?version=4.0'` en `js/misc/dependencies.js`, para el +# clima del calendario. O sea que es la única de esta tanda que entra por transitividad y no por +# aparecer en la lista del shell. +# +# `-Dsoup2=false` es LA opción de esta receta. El default de upstream es `true`, y con él pide +# `libsoup-2.4`, que esta distro no tiene ni va a tener: el corpus va con libsoup 3. Con `false` el +# proyecto se renombra a sí mismo `geocode-glib-2.0` (mismo código, otro `.pc` y otro soname), que es +# exactamente el nombre que libgweather busca. Sin esto se construye la variante equivocada y +# libgweather no la encuentra aunque esté instalada. +# +# `-Denable-installed-tests=false`: sus tests instalados descargan de Nominatim en tiempo de test. +# `-Denable-gtk-doc=false`: gtk-doc no está en el corpus. +# +# ISLA DINÁMICA: la introspección genera `GeocodeGlib-2.0.typelib`, que gjs no carga directamente +# pero el `.gir` de GWeather sí referencia. +name = "geocode-glib" +version = "3.26.4" + +[source] +tarball = "https://download.gnome.org/sources/geocode-glib/3.26/geocode-glib-3.26.4.tar.xz" +sha256 = "2d9a6826d158470449a173871221596da0f83ebdcff98b90c7049089056a37aa" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = ''' +set -e +sed -i "/^subdir('po')$/d" meson.build +PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output \ + --prefix=/usr --buildtype=release --wrap-mode=nodownload \ + -Ddefault_library=both -Dsoup2=false -Denable-introspection=true \ + -Denable-gtk-doc=false -Denable-installed-tests=false \ + -Dc_args=-Wno-error=date-time +''' +compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" +install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "py3-setuptools", "gobject-introspection", "gi-foreign-girs", "glib", "glib-introspected", "json-glib", "libsoup", "libpsl", "nghttp2", "sqlite-shared", "icu4c", "libffi", "pcre2", "zlib-shared"] diff --git a/recipes/incoming-gnome/gnome-desktop.toml b/recipes/incoming-gnome/gnome-desktop.toml index a516b327..3a077068 100644 --- a/recipes/incoming-gnome/gnome-desktop.toml +++ b/recipes/incoming-gnome/gnome-desktop.toml @@ -9,8 +9,31 @@ # correcta para un escritorio GNOME 48. sha256 REAL de `curl -sL | sha256sum`. # # Feature-minimal: build_gtk4=true, legacy_library=false (SIN libgnome-desktop-3/gtk3 — no está en -# el corpus), introspection/docs/debug_tools/installed_tests OFF, udev/systemd disabled (Wayland-only, +# el corpus), docs/debug_tools/installed_tests OFF, udev/systemd disabled (Wayland-only, # el logind/udev lo cubre arje). backend GL vía gtk4 (ya wayland-only, sin X11). +# +# ══ PASA A LA ISLA DINÁMICA CON INTROSPECCIÓN (2026-07-29) ══════════════════════════════════════ +# Antes iba estática y con `-Dintrospection=false`. Lo cambió el arranque de la sesión: gnome-shell +# importa `GnomeDesktop` y `GnomeBG` desde JavaScript sin condicional +# (`js/misc/dependencies.js`), o sea que los DOS typelibs son dep de runtime del shell. +# +# **No se hizo una variante `-introspected` aparte, y la razón es la regla de los dos registros de +# GType**: mutter y gnome-shell ENLAZAN libgnome-desktop, y gjs además dlopearía la `.so` que el +# typelib nombra. Con una variante convivirían la `.a` enlazada y la `.so` cargada, cada una con su +# tabla de GType — el mismo cuadro que costó el episodio de colord (`assertion 'G_IS_FILE (file)' +# failed` + SIGSEGV en binarios que el propio build acababa de enlazar). Acá la variante sería el +# error; el idioma `-shared` vale para librerías de C sin GObject, no para ésta. +# +# `yupana radio gnome-desktop` = **2 sellados a deuda** (mutter y gnome-shell), el mismo par que ya +# se reconstruyó dos veces en esta campaña. Barato y correcto. +# +# `default_library=both` y no `shared`: es el mismo remedio que json-glib. Los consumidores que +# siguen estáticos piden la `.a` y con shared-only cortan; la introspección sólo necesita que EXISTA +# la `.so`. +# +# Con `introspection=true` los dos seds de abajo que borraban las referencias a `libgnome_rr_gir` / +# `libgnome_bg_gir` **dejan de hacer falta y serían dañinos**: ahora esos .gir SÍ se generan, y +# borrarlos de `sources:` es justo lo que impediría que se declaren. name = "gnome-desktop" version = "44.5" @@ -21,24 +44,25 @@ sha256 = "20e0995a6e3a03e8c1026c5a27bc3f45e69ffcc392ad743dcab6107a541d232f" [build] compiler = "zig-cc" target = "x86_64-linux-musl" -link = "static" +link = "dynamic" -# El sed cierra un bug UPSTREAM que sólo aparece con introspection=false y meson moderno: dos -# declare_dependency() alimentan `sources:` con el .gir que no se generó. gnome-rr lo deja como -# cadena VACÍA (meson 1.x la trata como fichero ⇒ «ERROR: File does not exist») y gnome-bg lo -# deja directamente SIN DEFINIR (⇒ «unknown variable»). El tercer sitio, libgnome-desktop/ -# meson.build:163, NO se toca: ése sí inicializa a `[]`, que meson aplana sin ruido — es el -# patrón correcto y la prueba de que los otros dos son el descuido. Sin gir no hay nada que -# declarar, así que se borra la referencia. Anclado con [[:space:]]* para no depender del sangrado. +# (HISTÓRICO, por si alguien vuelve a apagar la introspección: con `-Dintrospection=false` hacían +# falta dos seds más, que borraban `libgnome_rr_gir` y `libgnome_bg_gir` de sendos +# `declare_dependency()`. Es un bug upstream que sólo aparece en esa combinación — alimentan +# `sources:` con un .gir que no se generó; gnome-rr lo deja como cadena VACÍA (meson 1.x la trata +# como fichero ⇒ «File does not exist») y gnome-bg SIN DEFINIR (⇒ «unknown variable»). El tercer +# sitio, libgnome-desktop/meson.build:163, inicializa a `[]`, que meson aplana sin ruido: es el +# patrón correcto y la prueba de que los otros dos son el descuido. Con introspección encendida los +# .gir existen y los seds sobran.) # -# El segundo sed saca `subdir('tests')`: `-Dinstalled_tests=false` sólo decide si los tests se +# El sed que SÍ queda saca `subdir('tests')`: `-Dinstalled_tests=false` sólo decide si los tests se # INSTALAN, no si se compilan, y el subdir se incluye incondicionalmente. Su único ejecutable # (bg-slide-show) se enlaza con `-static` contra `-lgtk-4`, y desde la onda 2 gtk4 es DINÁMICA # (isla dinámica de la introspección) ⇒ no existe libgtk-4.a y el link muere. La librería —lo # único que esta receta produce para el escritorio— ya está enlazada cuando eso pasa: 26 de 27 # targets. No se compila un exe de prueba que nadie instala. [build.phases] -configure = "sed -i '/^[[:space:]]*libgnome_rr_gir,[[:space:]]*$/d' libgnome-desktop/gnome-rr/meson.build && sed -i '/^[[:space:]]*libgnome_bg_gir,[[:space:]]*$/d' libgnome-desktop/gnome-bg/meson.build && sed -i \"/^subdir('tests')$/d\" meson.build && PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload --prefer-static -Ddefault_library=static -Dbuild_gtk4=true -Dlegacy_library=false -Dintrospection=false -Ddesktop_docs=false -Ddebug_tools=false -Dgtk_doc=false -Dinstalled_tests=false -Dudev=disabled -Dsystemd=disabled -Dc_args=-Wno-error=date-time" +configure = "sed -i \"/^subdir('tests')$/d\" meson.build && PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=both -Dbuild_gtk4=true -Dlegacy_library=false -Dintrospection=true -Ddesktop_docs=false -Ddebug_tools=false -Dgtk_doc=false -Dinstalled_tests=false -Dudev=disabled -Dsystemd=disabled -Dc_args=-Wno-error=date-time" compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" @@ -54,4 +78,12 @@ install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson ins # (b3:bcf9b766) ⇒ cache-hit del artefacto que KDE ya selló, cero rebuild. # libseccomp → receta nueva en esta misma cola (autotools estático, gperf de build-dep). [deps] -build = ["meson", "samurai", "python3", "pkgconf", "gsettings-desktop-schemas", "gtk4", "glib", "gdk-pixbuf", "fontconfig", "libxkbcommon", "cairo", "pango", "graphene", "libepoxy", "wayland", "wayland-protocols", "libdrm", "harfbuzz", "fribidi", "libpng", "pixman", "freetype", "expat", "libffi", "pcre2", "zlib", "libjpeg-turbo", "libtiff", "mesa", "iso-codes", "xkeyboard-config", "libseccomp"] +# Las variantes `-shared` (cairo, fontconfig, freetype, libpng, zlib, libjpeg-turbo, libtiff) NO son +# cosmética: con las estáticas el scanner MUERE. g-ir-scanner compila y EJECUTA un binario temporal +# contra la librería recién construida, y para eso carga todo el árbol dinámico. Con `libpng` estática +# no hay `libpng16.so`, así que `libgdk_pixbuf-2.0.so.0` —que sí es dinámica— no relocaliza: +# Error relocating /usr/lib/libgdk_pixbuf-2.0.so.0: png_set_write_fn: symbol not found +# y el `ldd` con que el scanner resuelve las shlibs sale con 127 («Error loading shared library»), +# que es lo que se ve en el traceback de shlibs.py:106. Es la misma lista que declara gtk4, por la +# misma razón. Regla: si una receta introspecta, su cierre entero tiene que ser cargable. +build = ["meson", "samurai", "python3", "pkgconf", "py3-setuptools", "gobject-introspection", "gi-foreign-girs", "glib-introspected", "gsettings-desktop-schemas", "gtk4", "glib", "gdk-pixbuf", "fontconfig-shared", "libxkbcommon", "cairo-shared", "pango", "graphene", "libepoxy", "wayland", "wayland-protocols", "libdrm", "harfbuzz", "fribidi", "libpng-shared", "pixman", "freetype-shared", "expat", "libffi", "pcre2", "zlib-shared", "libjpeg-turbo-shared", "libtiff-shared", "mesa", "iso-codes", "xkeyboard-config", "libseccomp"] diff --git a/recipes/incoming-gnome/libgweather.toml b/recipes/incoming-gnome/libgweather.toml new file mode 100644 index 00000000..da1b4fb1 --- /dev/null +++ b/recipes/incoming-gnome/libgweather.toml @@ -0,0 +1,55 @@ +# libgweather 4.4.4 — el clima y la base de datos de ubicaciones (ciudades, estaciones METAR, zonas +# horarias). De acá sale el typelib `GWeather-4.0`. +# +# POR QUÉ ENTRA: gnome-shell lo importa desde JavaScript sin condicional +# (`js/misc/dependencies.js`: `import 'gi://GWeather?version=4.0'`) — lo usa el widget de clima del +# calendario y el selector de ciudades del reloj mundial. Dep de RUNTIME del shell, invisible a su +# grafo de build. +# +# ARRASTRA DOS RECETAS MÁS, y son de naturaleza distinta: +# · `geocode-glib` (libgweather/meson.build:115) — dep de ENLACE. Ojo con su `-Dsoup2=false`: sin +# eso se construye la variante `geocode-glib-1.0` contra libsoup2 y ésta no la encuentra. +# · `py3-gobject` (pygobject) — dep del CONSTRUCTOR, no de la imagen. meson.build:50 exige +# `find_installation('python3', modules: ['gi'])` porque `gen_locations_variant.py` importa +# `gi.repository.GLib` para serializar la base de ubicaciones a un GVariant binario. El formato lo +# define GLib; el script sólo lo alimenta. Reescribirlo sin `gi` sería reimplementar el +# serializador de GVariant. +# +# `-Dsoup2=false` acá también, por lo mismo: el corpus va con libsoup 3. +# +# `-Dtests=false` no alcanza para el `subdir('po-locations')`: ese catálogo NO es de traducciones de +# interfaz sino de los NOMBRES de las ciudades de la base de datos, y su `gen_locations_variant.py` +# corre msgfmt sobre él. Igual que `po`, se borra — el msgfmt de gettext-tiny aborta (OCTAVA vez). +# Consecuencia honesta y acotada: las ciudades salen en inglés. La base de datos en sí (`Locations.xml` +# y su variante compilada) se genera igual, que es lo que el shell consulta. +# +# `-Dgtk_doc=false` y `-Denable_vala=false`: no hay gtk-doc ni valac en el corpus. +# +# ISLA DINÁMICA: el typelib nombra `libgweather-4.so.0` y gjs la dlopea. +name = "libgweather" +version = "4.4.4" + +[source] +tarball = "https://download.gnome.org/sources/libgweather/4.4/libgweather-4.4.4.tar.xz" +sha256 = "7017677753cdf7d1fdc355e4bfcdb1eba8369793a8df24d241427a939cbf4283" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = ''' +set -e +sed -i "/^subdir('doc')$/d; /^subdir('po')$/d; /^subdir('po-locations')$/d" meson.build +PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output \ + --prefix=/usr --buildtype=release --wrap-mode=nodownload \ + -Ddefault_library=both -Dintrospection=true -Dsoup2=false \ + -Dgtk_doc=false -Denable_vala=false -Dtests=false \ + -Dc_args=-Wno-error=date-time +''' +compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" +install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "py3-setuptools", "py3-gobject", "gobject-introspection", "gi-foreign-girs", "glib", "glib-introspected", "geocode-glib", "json-glib", "libsoup", "libpsl", "nghttp2", "sqlite-shared", "icu4c", "libxml2-shared", "libffi", "pcre2", "zlib-shared"] diff --git a/recipes/incoming-gnome/py3-gobject.toml b/recipes/incoming-gnome/py3-gobject.toml new file mode 100644 index 00000000..e804846b --- /dev/null +++ b/recipes/incoming-gnome/py3-gobject.toml @@ -0,0 +1,38 @@ +# pygobject 3.50.0 — los bindings de GObject-Introspection para Python (`from gi.repository import …`). +# +# POR QUÉ APARECE ACÁ, y es un tipo de dep distinto a todos los de esta tanda: **no va a la imagen, +# va al CONSTRUCTOR**. libgweather no la enlaza ni la carga; la usa su build: +# +# meson.build:50 py = import('python').find_installation('python3', modules: ['gi']) +# +# y `build-aux/meson/gen_locations_variant.py` importa `gi.repository.GLib` para serializar la base +# de datos de ubicaciones —miles de ciudades, estaciones METAR y zonas horarias— a un GVariant +# binario. O sea que el formato de salida lo define GLib y el script sólo lo alimenta: reescribirlo +# sin `gi` sería reimplementar el serializador de GVariant, que es exactamente el error de +# reimplementar lo que ya existe. Se paga la receta. +# +# `-Dpycairo=disabled`: la integración con pycairo sólo sirve para pasar objetos `cairo.Context` +# entre Python y C, y no hay pycairo en el corpus. `gen_locations_variant.py` no toca cairo. +# `-Dtests=false`: la suite pide `pytest` y arranca un bucle de GLib. +# +# ISLA DINÁMICA por obligación: el módulo `gi._gi` ES un objeto compartido que Python dlopea, y su +# cierre entero (glib, girepository, libffi) tiene que ser cargable. Con las estáticas no hay módulo. +name = "py3-gobject" +version = "3.50.0" + +[source] +tarball = "https://download.gnome.org/sources/pygobject/3.50/pygobject-3.50.0.tar.xz" +sha256 = "8d836e75b5a881d457ee1622cae4a32bcdba28a0ba562193adb3bbb472472212" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Dpycairo=disabled -Dtests=false -Dc_args=-Wno-error=date-time" +compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" +install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "py3-setuptools", "gobject-introspection", "gi-foreign-girs", "glib", "glib-introspected", "libffi", "pcre2", "zlib-shared"] diff --git a/recipes/incoming-gnome/upower.toml b/recipes/incoming-gnome/upower.toml new file mode 100644 index 00000000..f6c4e364 --- /dev/null +++ b/recipes/incoming-gnome/upower.toml @@ -0,0 +1,57 @@ +# upower 1.90.10 — el servicio de energía (batería, carga, suspensión por batería crítica) y su +# librería cliente `libupower-glib`, de donde sale el typelib `UPowerGlib-1.0`. +# +# POR QUÉ ENTRA: gnome-shell lo importa desde JavaScript sin condicional +# (`js/misc/dependencies.js`: `import 'gi://UPowerGlib?version=1.0'`). O sea que **es dep de RUNTIME +# del shell** aunque no aparezca en su meson.build — el indicador de batería del panel se apoya en +# esto. Se destapó arrancando la sesión, no compilando. +# +# FUENTE: el archivo de gitlab.freedesktop.org y no `upower.freedesktop.org/releases/`, que hoy sirve +# un índice generado por `tree` sin los tarballs de la serie 1.90. Es el mismo patrón que ya usan +# cairo, libdrm, libinput, pixman y modemmanager en este repo. +# +# LAS TRES PERILLAS QUE HAY QUE FIJAR A MANO, y las tres por el mismo motivo — el `auto` de upower +# significa «preguntale a un pkg-config de systemd», que acá no existe: +# +# -Dudevrulesdir / -Dudevhwdbdir: con `auto` hace `udev_dep.get_variable(pkgconfig: 'udev_dir')` +# (meson.build:97 y :103). Nuestro `udev-pc` declara la variable **`udevdir`**, no `udev_dir` — +# el nombre con guión bajo es de systemd-udev; el sin guión es el histórico de eudev, que es el que +# copiamos. En vez de tocar `udev-pc` (que arrastraría a libudev-zero y sus 51 dependientes) se +# fijan los dos directorios acá, que es lo que la opción existe para permitir. +# +# -Dsystemdsystemunitdir=no: con la cadena vacía hace `dependency('systemd')` DURA +# (meson.build:120-122). El valor `no` está contemplado por upstream y saltea la instalación de la +# unit (src/meson.build:107). Acá PID1 es arje-zero. +# +# -Dintrospection=enabled es el punto de todo esto. `-Didevice=disabled` saca libimobiledevice (el +# soporte de batería de iPhone), que no está en el corpus. `-Dpolkit=enabled` porque polkit YA está +# sellada y es lo que decide quién puede suspender. +# +# ISLA DINÁMICA: el typelib nombra `libupower-glib.so.3` y gjs la dlopea. +name = "upower" +version = "1.90.10" + +[source] +tarball = "https://gitlab.freedesktop.org/upower/upower/-/archive/v1.90.10/upower-v1.90.10.tar.gz" +sha256 = "7fcd51bece2526dbee5170feb3ffd1adab5b0cd023575f1fd119d969b73f4b90" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = ''' +set -e +PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output \ + --prefix=/usr --buildtype=release --wrap-mode=nodownload \ + -Ddefault_library=both -Dos_backend=linux -Dintrospection=enabled \ + -Didevice=disabled -Dpolkit=enabled -Dman=false -Dgtk-doc=false \ + -Dudevrulesdir=/usr/lib/udev/rules.d -Dudevhwdbdir=/usr/lib/udev/hwdb.d \ + -Dsystemdsystemunitdir=no -Dc_args=-Wno-error=date-time +''' +compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output" +install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "py3-setuptools", "gobject-introspection", "gi-foreign-girs", "glib", "glib-introspected", "libgudev", "udev-pc", "libudev-zero", "polkit", "libffi", "pcre2", "zlib-shared", "expat", "dbus-shared"]