gnome-console y gnome-keyring SELLADOS: cuatro muros más, dos de ellos de la distro
gnome-console b3:dec8319c · vte b3:715502c9 · libgtop b3:d772c3dc
gnome-keyring b3:5a93bd6b · gcr3 b3:75e7ac9f · libcap-ng b3:67a7a433
lz4-shared b3:6aa30b36 · fast-float b3:73094388
Lo que apareció, en orden, porque los cuatro son reutilizables:
1. gnome-console pedía `desktop-file-utils` como dep de BUILD (meson.build:168,
find_program('update-desktop-database') REQUERIDO). Lo había descartado mirando
data/meson.build:3-4, donde `desktop-file-validate` y `appstreamcli` sí son `required: false`:
miré una parte y generalicé al resto. El fallo estaba en otro fichero y con otro programa.
2. Y una cadena de tres saltos: gnome-console → libadwaita-1 → appstream → libxml-2.0. pkg-config
aborta el configure si falta el último eslabón, y el error sólo nombra al primero y al último.
3. gcr3: `getpass()` (gcr/console-interaction.c:100) existe en musl pero se declara sólo bajo
_XOPEN_SOURCE/_GNU_SOURCE/_BSD_SOURCE. Sin declaración, C asume que devuelve int y el error que
se lee es el SEGUNDO —«incompatible integer to pointer conversion»—, que despista. Se arregla
declarando la función, no silenciando la conversión. Segundo muro de la DISTRO en esta tanda,
después del W_EXITCODE de vte: los dos son código que da por sentada la glibc.
4. gcr3 otra vez, y éste es un bug de upstream que sólo se ve al APAGAR una opción: meson.build:55
llama `.path()` sobre el resultado de un `find_program(..., required: get_option('ssh_agent'))`
sin comprobar que se haya encontrado ⇒ con `ssh_agent=false` el configure muere con «Unable to
get the path of a not-found external program». Las distros no lo ven porque lo construyen con el
agente encendido.
5. gnome-keyring: `'gkm-marshal.h' file not found`. `libgkm_dep` exporta los DIRECTORIOS de la
cabecera generada (con comentario `# for gkm-marshal.h`) pero no el fichero generado, así que no
hay dependencia de ORDEN y ninja puede compilar al consumidor antes de generarla. Es una
carrera: reintentar probablemente «lo arregla», y por eso mismo no se arregla reintentando.
`sources: gkm_marshal` en el declare_dependency es la forma que meson tiene para esto.
Queda `gnome-text-editor`, el último `wanted` del perfil.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
3 qillqakuna · +67 −7
diff --git a/recipes/incoming-gnome/gcr3.toml b/recipes/incoming-gnome/gcr3.toml
index e84f2478..3fbb1942 100644
--- a/recipes/incoming-gnome/gcr3.toml
+++ b/recipes/incoming-gnome/gcr3.toml
@@ -33,6 +33,39 @@
# -Dgpg_path=/usr/bin/gpg → explícito, igual que en gcr4: sin esto el configure lo AUTODETECTA del
# sysroot de build y la ruta horneada dependería de qué hubiera ese día.
#
+# ── EL OTRO `sed`: UN BUG DE UPSTREAM QUE SÓLO SE VE AL APAGAR `ssh_agent` ─────────────────────
+# `meson.build:55-56` hace, sin guardar nada:
+#
+# ssh_add_path = find_program('ssh-add', required: get_option('ssh_agent')).path()
+# ssh_agent_path = find_program('ssh-agent', required: get_option('ssh_agent')).path()
+#
+# Con `ssh_agent=false` el `find_program` devuelve un programa NO encontrado —correctamente, porque
+# no es obligatorio— y acto seguido se le pide `.path()`, que en meson moderno es un error duro:
+#
+# meson.build:55:74: ERROR: Unable to get the path of a not-found external program
+#
+# O sea: la opción existe, apagarla es lo razonable, y apagarla rompe el configure. Nadie lo ve
+# porque las distros construyen esta serie con el agente encendido.
+# Los dos valores sólo alimentan `SSH_ADD_EXECUTABLE`/`SSH_AGENT_EXECUTABLE` en el `config.h`
+# (`:85-86`), que únicamente lee el código del agente — el que esta receta no compila. Se sustituyen
+# por las rutas que `openssh` instala en esta distro, en vez de por cadenas vacías: si algún día se
+# enciende el agente, el valor horneado ya es el correcto en vez de una mentira silenciosa.
+#
+# ── `-D_GNU_SOURCE`: `getpass()` EXISTE EN MUSL, PERO NO SE DECLARA SOLO ──────────────────────
+# `gcr/console-interaction.c:100` usa `getpass()` e incluye `<unistd.h>` (`:33`), que es donde vive.
+# En glibc con eso alcanza; **musl la esconde detrás de un guard de feature test** —la declara sólo
+# con `_XOPEN_SOURCE`, `_GNU_SOURCE` o `_BSD_SOURCE` definidos—, y clang moderno ya no acepta
+# declaraciones implícitas:
+#
+# error: call to undeclared function 'getpass'; ISO C99 and later do not support implicit …
+# error: incompatible integer to pointer conversion assigning to 'const gchar *' … from 'int'
+#
+# El segundo error es consecuencia del primero y es el que despista: sin declaración, C asume que
+# `getpass` devuelve `int`, y asignarlo a un `const gchar *` es lo que el compilador denuncia. Se
+# arregla en la raíz (declarar la función), no silenciando la conversión.
+# Segundo muro de esta tanda que es de la DISTRO y no de las herramientas, después del `W_EXITCODE`
+# de vte. Los dos son el mismo patrón: código que da por sentada la glibc.
+#
# ⚠ EL `sed` DEL `ar`: `po/ar.po` trae 1 `msgstr[5]` y con uno alcanza para el SIGILL del msgfmt de
# gettext-tiny ([[gettext-tiny-msgfmt-plural-arabe]]). Acá se saca SÓLO el árabe, en vez de borrar
# `subdir('po')` como hizo gcr4: esta receta conserva las otras ~40 traducciones.
@@ -50,7 +83,7 @@ target = "x86_64-linux-musl"
link = "dynamic"
[build.phases]
-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 -Ddefault_library=shared -Dgtk=false -Dssh_agent=false -Dsystemd=disabled -Dintrospection=false -Dgtk_doc=false -Dgpg_path=/usr/bin/gpg -Dc_args=-Wno-error=date-time"
+configure = "sed -i '/^ar$/d' po/LINGUAS && sed -i \"s@^ssh_add_path = find_program.*@ssh_add_path = '/usr/bin/ssh-add'@; s@^ssh_agent_path = find_program.*@ssh_agent_path = '/usr/bin/ssh-agent'@\" 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=shared -Dgtk=false -Dssh_agent=false -Dsystemd=disabled -Dintrospection=false -Dgtk_doc=false -Dgpg_path=/usr/bin/gpg -Dc_args=\"-Wno-error=date-time -D_GNU_SOURCE\""
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"
diff --git a/recipes/incoming-gnome/gnome-console.toml b/recipes/incoming-gnome/gnome-console.toml
index 609f2cb5..6a8e9f13 100644
--- a/recipes/incoming-gnome/gnome-console.toml
+++ b/recipes/incoming-gnome/gnome-console.toml
@@ -18,10 +18,19 @@
# `false` por defecto. Se declaran igual —como en gvfs— porque un default no es una decisión
# escrita, y el día que upstream cambie uno, esta receta no cambia de comportamiento en silencio.
#
-# ⚠ `desktop-file-validate` y `appstreamcli` los busca con `required: false` (`data/meson.build:3-4`)
-# ⇒ son validadores de sus propios ficheros, no deps. No se declaran: lo único que harían es
-# validar, y si no están el build sigue. Es lo contrario del `update-desktop-database` de nautilus,
-# que sí era `required` y sí tumbó el configure.
+# ⚠ `desktop-file-utils` es dep de BUILD, igual que en nautilus: `meson.build:168` hace
+# `find_program('update-desktop-database')` REQUERIDO y tumba el configure sin compilar una línea.
+# Lo comprobé por el camino largo: miré `data/meson.build:3-4`, vi `desktop-file-validate` y
+# `appstreamcli` con `required: false`, concluí que esta app no necesitaba el paquete… y el fallo
+# estaba en OTRO fichero y con OTRO programa. Mirar una parte y generalizar es lo que costó la
+# corrida — los validadores siguen siendo opcionales y eso no dice nada del resto.
+#
+# ⚠ `libxml2-shared` está en la lista por una cadena de TRES saltos, y costó una corrida: esta app
+# pide `libadwaita-1`, cuyo `.pc` declara `Requires.private: appstream`, cuyo `.pc` declara
+# `libxml-2.0`. pkg-config aborta el configure entero si falta el último eslabón — y el mensaje sólo
+# nombra al primero y al último: «Package 'libxml-2.0', required by 'appstream', not found», seguido
+# de `Run-time dependency libadwaita-1 found: NO`. La hidratación de takana es DIRECTA, no
+# transitiva: cada `.pc` del cierre tiene que estar nombrado acá aunque nada lo enlace.
#
# ⚠ SIN `sed` del `ar`: su `po/ar.po` tiene CERO `msgstr[5]` (medido) ⇒ el árabe de esta app se
# conserva. La mina de gettext-tiny es por-fichero, no por-proyecto.
@@ -44,4 +53,4 @@ 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", "glib", "gtk4", "libadwaita", "vte", "libgtop", "gsettings-desktop-schemas", "pango", "cairo-shared", "gdk-pixbuf", "graphene", "pcre2", "lz4-shared", "icu4c", "fribidi", "harfbuzz", "fontconfig-shared", "freetype-shared", "pixman", "libpng-shared", "expat", "libjpeg-turbo-shared", "libtiff-shared", "libepoxy", "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "mesa", "appstream", "libxmlb", "libyaml-shared", "curl", "openssl", "zstd", "libffi", "zlib-shared"]
+build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny", "desktop-file-utils", "glib", "gtk4", "libadwaita", "vte", "libgtop", "gsettings-desktop-schemas", "pango", "cairo-shared", "gdk-pixbuf", "graphene", "pcre2", "lz4-shared", "icu4c", "fribidi", "harfbuzz", "fontconfig-shared", "freetype-shared", "pixman", "libpng-shared", "expat", "libjpeg-turbo-shared", "libtiff-shared", "libepoxy", "wayland", "wayland-protocols", "libxkbcommon", "libdrm", "mesa", "appstream", "libxmlb", "libyaml-shared", "libxml2-shared", "curl", "openssl", "zstd", "libffi", "zlib-shared"]
diff --git a/recipes/incoming-gnome/gnome-keyring.toml b/recipes/incoming-gnome/gnome-keyring.toml
index 02b2c857..36f1e5d9 100644
--- a/recipes/incoming-gnome/gnome-keyring.toml
+++ b/recipes/incoming-gnome/gnome-keyring.toml
@@ -43,6 +43,24 @@
# primero. Sin la lib, quedarse con `CAP_IPC_LOCK` (para `mlock()` la memoria de los secretos, que
# no acabe en swap) y soltar el resto de privilegios se vuelve un no-op mudo. Ver `libcap-ng.toml`.
#
+# ── EL `sed` DEL MARSHAL: UNA DEPENDENCIA DE ORDEN QUE UPSTREAM NO DECLARA ────────────────────
+# ../pkcs11/gnome2-store/gkm-gnome2-file.c:30:10: fatal error: 'gkm-marshal.h' file not found
+#
+# `pkcs11/gkm/meson.build:47` genera `gkm-marshal.h` con `gnome.genmarshal()` y lo mete en las
+# `sources:` de `libgkm` (`:62`). Después, `libgkm_dep` (`:67-73`) exporta a los consumidores los
+# DIRECTORIOS donde esa cabecera va a estar —hay hasta un comentario, `# for gkm-marshal.h`— pero
+# NO el fichero generado. En meson eso es la diferencia entre «sé dónde buscarla» y «espera a que
+# exista»: sin `sources:` en el `declare_dependency`, ninja puede compilar `gkm-gnome2-file.c`
+# ANTES de generar la cabecera.
+#
+# ⚠ Es una CARRERA, no un fallo determinista, y ahí está lo peligroso: upstream y las distros no la
+# ven porque su ninja suele visitar `gkm` primero. Reintentar el build probablemente «lo arregla»,
+# y por eso mismo no se arregla reintentando — quedaría una receta que sella o no según el orden en
+# que ninja se despierte, que es justo lo que este repo no puede tener.
+#
+# El `sed` añade `sources: gkm_marshal,` al `declare_dependency`, que es la forma que meson tiene
+# para exactamente esto. Anclado a `^libgkm_dep = declare_dependency($`, que aparece una sola vez.
+#
# ⚠ SIN `sed` del `ar`: medido, su `po/ar.po` trae CERO `msgstr[5]` ⇒ la traducción se conserva.
#
# ⚠ SIN `[[service]]` TODAVÍA, y es una decisión que hay que mirar, no un olvido: el demonio se
@@ -64,7 +82,7 @@ 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 -Dssh-agent=false -Dpam=false -Dselinux=disabled -Dsystemd=disabled -Dmanpage=false -Ddebug-mode=false -Dc_args=-Wno-error=date-time"
+configure = "sed -i '/^libgkm_dep = declare_dependency($/a\\ sources: gkm_marshal,' pkcs11/gkm/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 -Dssh-agent=false -Dpam=false -Dselinux=disabled -Dsystemd=disabled -Dmanpage=false -Ddebug-mode=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"