diff --git a/docs/state/build-state-gnome.json b/docs/state/build-state-gnome.json index b18c699d..52da48a2 100644 --- a/docs/state/build-state-gnome.json +++ b/docs/state/build-state-gnome.json @@ -1,14 +1,14 @@ { "schema": "hammer-build-state/1", "totals": { - "recipes": 808, - "nodes": 808, - "sealed": 798, + "recipes": 812, + "nodes": 812, + "sealed": 802, "never": 8, "debt": 2 }, "by_class": { - "c": 174, + "c": 178, "go": 362, "gui": 40, "kernel": 6, @@ -26,7 +26,7 @@ "debt": 2 }, "incoming-gnome": { - "sealed": 40, + "sealed": 44, "never": 6 } }, @@ -54,7 +54,7 @@ "debt": 2 } }, - "sin_perfil": 649, + "sin_perfil": 653, "orphan_deps": [], "topo_ok": true, "nodes": { @@ -4128,6 +4128,38 @@ "perfiles": [], "dependientes_total": 0 }, + "gcr": { + "iname": "gcr", + "version": "4.4.0.1", + "link": "dynamic", + "compiler": "zig-cc", + "deps": [ + "meson", + "samurai", + "python3", + "pkgconf", + "gettext-tiny", + "py3-setuptools", + "gi-foreign-girs", + "gobject-introspection", + "glib", + "glib-introspected", + "p11-kit", + "libgcrypt-shared", + "libgpg-error-shared", + "libffi", + "pcre2", + "zlib" + ], + "cls": "c", + "queue": "incoming-gnome", + "hash": "b3:698096b035c82ad5facb2b705aedb9a2b70ff78c9baef1c19522a5e6efef8bee", + "state": "sealed", + "blocked_by": [], + "unblocks": 0, + "perfiles": [], + "dependientes_total": 0 + }, "gdk-pixbuf": { "iname": "gdk-pixbuf", "version": "2.44.6", @@ -4238,7 +4270,7 @@ "escritorio-gnome", "escritorio-kde" ], - "dependientes_total": 82 + "dependientes_total": 83 }, "gh": { "iname": "gh", @@ -4323,7 +4355,7 @@ "perfiles": [ "escritorio-gnome" ], - "dependientes_total": 4 + "dependientes_total": 5 }, "giflib": { "iname": "giflib", @@ -4725,7 +4757,7 @@ "perfiles": [ "escritorio-gnome" ], - "dependientes_total": 24 + "dependientes_total": 25 }, "glib-introspected": { "iname": "glib-introspected", @@ -4753,7 +4785,7 @@ "perfiles": [ "escritorio-gnome" ], - "dependientes_total": 8 + "dependientes_total": 9 }, "glow": { "iname": "glow", @@ -5163,7 +5195,7 @@ "perfiles": [ "escritorio-gnome" ], - "dependientes_total": 13 + "dependientes_total": 14 }, "gobuster": { "iname": "gobuster", @@ -8249,7 +8281,7 @@ "escritorio-kde", "escritorio-mirada" ], - "dependientes_total": 73 + "dependientes_total": 75 }, "libgcrypt": { "iname": "libgcrypt", @@ -8272,6 +8304,24 @@ ], "dependientes_total": 1 }, + "libgcrypt-shared": { + "iname": "libgcrypt-shared", + "version": "1.12.2", + "link": "dynamic", + "compiler": "zig-cc", + "deps": [ + "make", + "libgpg-error-shared" + ], + "cls": "c", + "queue": "incoming-gnome", + "hash": "b3:0219f2ee56ba8c2192ec4fd0a2884e26ce86eca097d7987e77235d8d8e0131ac", + "state": "sealed", + "blocked_by": [], + "unblocks": 0, + "perfiles": [], + "dependientes_total": 1 + }, "libgpg-error": { "iname": "libgpg-error", "version": "1.61", @@ -8292,6 +8342,23 @@ ], "dependientes_total": 4 }, + "libgpg-error-shared": { + "iname": "libgpg-error-shared", + "version": "1.61", + "link": "dynamic", + "compiler": "zig-cc", + "deps": [ + "make" + ], + "cls": "c", + "queue": "incoming-gnome", + "hash": "b3:e0a7d62ecd6aa7447f09ebc5794bce4ff0591434dc5d92bde52f5c06d6636a70", + "state": "sealed", + "blocked_by": [], + "unblocks": 0, + "perfiles": [], + "dependientes_total": 2 + }, "libgudev": { "iname": "libgudev", "version": "238", @@ -9085,7 +9152,7 @@ "escritorio-kde", "escritorio-mirada" ], - "dependientes_total": 88 + "dependientes_total": 90 }, "mako": { "iname": "mako", @@ -9443,7 +9510,7 @@ "escritorio-kde", "escritorio-mirada" ], - "dependientes_total": 86 + "dependientes_total": 88 }, "micro": { "iname": "micro", @@ -10556,6 +10623,27 @@ "perfiles": [], "dependientes_total": 0 }, + "p11-kit": { + "iname": "p11-kit", + "version": "0.26.4", + "link": "dynamic", + "compiler": "zig-cc", + "deps": [ + "meson", + "samurai", + "python3", + "pkgconf", + "libffi" + ], + "cls": "c", + "queue": "incoming-gnome", + "hash": "b3:8dbec39048f0cf52019e804bbc587e410051a21cb88bdd0ea078dbf98445991e", + "state": "sealed", + "blocked_by": [], + "unblocks": 0, + "perfiles": [], + "dependientes_total": 1 + }, "packaging": { "iname": "packaging", "version": "26.2", @@ -10740,7 +10828,7 @@ "escritorio-gnome", "escritorio-kde" ], - "dependientes_total": 59 + "dependientes_total": 60 }, "peco": { "iname": "peco", @@ -10923,7 +11011,7 @@ "escritorio-kde", "escritorio-mirada" ], - "dependientes_total": 301 + "dependientes_total": 303 }, "plow": { "iname": "plow", @@ -11275,7 +11363,7 @@ "perfiles": [ "escritorio-gnome" ], - "dependientes_total": 10 + "dependientes_total": 11 }, "python3": { "iname": "python3", @@ -11299,7 +11387,7 @@ "escritorio-kde", "escritorio-mirada" ], - "dependientes_total": 244 + "dependientes_total": 246 }, "qrcp": { "iname": "qrcp", @@ -11845,7 +11933,7 @@ "escritorio-kde", "escritorio-mirada" ], - "dependientes_total": 218 + "dependientes_total": 220 }, "sassc": { "iname": "sassc", @@ -14602,7 +14690,7 @@ "escritorio-kde", "escritorio-mirada" ], - "dependientes_total": 97 + "dependientes_total": 98 }, "zlib-ng": { "iname": "zlib-ng", diff --git a/recipes/incoming-gnome/gcr.toml b/recipes/incoming-gnome/gcr.toml new file mode 100644 index 00000000..2bfbdf0a --- /dev/null +++ b/recipes/incoming-gnome/gcr.toml @@ -0,0 +1,52 @@ +# gcr 4.4.0.1 — criptografía y almacén de claves para el escritorio (parseo de certificados, prompts +# de contraseña, agente ssh). gnome-shell la exige por `gcr-4` (meson.build:74). +# +# Feature-minimal, y cada apagado se paga en recetas que NO hay que autorar: +# -Dssh_agent=false → libsecret sólo es requerida por el agente ssh (meson.build:96). Sin él, +# libsecret deja de ser frontera. El shell usa gcr para prompts, no como +# agente ssh (eso lo hace gnome-keyring, que no está en esta campaña). +# -Dsystemd=disabled → libsystemd es `required: get_option('systemd')` (:104), o sea que acá SÍ +# hay perilla. Es la tercera vez que aparece la C-ABI de logind en este +# frente y la tercera que se esquiva; mutter sigue siendo la única sin salida. +# -Dgtk4=false → la UI de prompts es opcional; `gcr-4` (lo que el shell enlaza) es la lib base. +# -Dcrypto=libgcrypt -Dgpg_path=/usr/bin/gpg → de las dos opciones (libgcrypt/gnutls), libgcrypt YA está en el corpus y +# sellada, con su libgpg-error. gnutls no existe acá. +# +# -Dgpg_path=… → gcr sólo quiere la RUTA del binario gpg para hornearla en el código +# (meson.build:63-66: si la opción está vacía, hace find_program). No compila +# ni ejecuta nada de gnupg, así que fijar la ruta evita meter gnupg entero al +# sandbox por un string. La ruta es la del futuro artefacto, no la del host. +# +# El sed saca `subdir('po')` (:153). NO es capricho: el msgfmt de gettext-tiny —lo único que hay en +# el corpus— ABORTA con SIGABRT en po/ar.po (src/msgfmt.c:183). Es la segunda vez que ese msgfmt +# marca el límite (en iso-codes lo esquivé de antemano); si aparece una tercera, conviene autorar el +# gettext de GNU de verdad en vez de seguir apagando traducciones receta por receta. Lo que se pierde +# son los textos traducidos de los prompts de contraseña; la librería que enlaza el shell es la misma. +# +#: libgcrypt en el corpus es SÓLO estática, y su libgcrypt.pc pone +# gpg-error en `Requires.private`, que pkg-config expande únicamente con --static. Al enlazar el .a +# dentro de un .so ese cierre se pierde y el linker corta con `undefined symbol: +# gpg_err_code_to_errno` (referenciado desde libgcrypt.a). Se agrega a mano en vez de tocar +# libgcrypt.toml: re-hashearla arrastraría a todo lo que ya la tiene sellada. +# +# p11-kit es la única frontera que gcr abrió, y se cerró con -Dtrust_module=disabled del lado de ella. +# ISLA DINÁMICA: produce .so con GObject ⇒ glib dinámica, un registro de GType. +name = "gcr" +version = "4.4.0.1" + +[source] +tarball = "https://download.gnome.org/sources/gcr/4.4/gcr-4.4.0.1.tar.xz" +sha256 = "0c3c341e49f9f4f2532a4884509804190a0c2663e6120360bb298c5d174a8098" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = "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=shared -Dgtk4=false -Dssh_agent=false -Dsystemd=disabled -Dcrypto=libgcrypt -Dgpg_path=/usr/bin/gpg -Dintrospection=true -Dvapi=false -Dgtk_doc=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", "gi-foreign-girs", "gobject-introspection", "glib", "glib-introspected", "p11-kit", "libgcrypt-shared", "libgpg-error-shared", "libffi", "pcre2", "zlib"] diff --git a/recipes/incoming-gnome/libgcrypt-shared.toml b/recipes/incoming-gnome/libgcrypt-shared.toml new file mode 100644 index 00000000..46aa9372 --- /dev/null +++ b/recipes/incoming-gnome/libgcrypt-shared.toml @@ -0,0 +1,33 @@ +# libgcrypt-shared 1.12.2 — variante DINÁMICA de libgcrypt para el escritorio GNOME. +# +# La pide gcr (-Dcrypto=libgcrypt), que es un .so; la canónica (recipes/libgcrypt.toml) es estática +# sin PIC y no entra en una librería compartida. Ver libgpg-error-shared.toml para el razonamiento +# completo de por qué se hace variante en vez de tocar la canónica (radio medido, ajuste fino +# documentado en la receta original). +# +# -fno-sanitize=undefined: zig cc inyecta el runtime UBSan y el .so queda con referencias a +# __ubsan_handle_* que nadie define, que `--no-allow-shlib-undefined` rechaza. Es exactamente lo que +# zlib-shared ya tenía documentado para este mismo frente. +# +# compiler = zig-cc, NO gcc: la canónica sigue en gcc y es una de las 16 que quedan en la lista de +# matar-gcc. Esta variante nace ya del lado correcto — si compila bien acá, es evidencia de que la +# canónica también puede migrar cuando le toque. +name = "libgcrypt-shared" +version = "1.12.2" + +[source] +tarball = "https://www.gnupg.org/ftp/gcrypt/libgcrypt/libgcrypt-1.12.2.tar.bz2" +sha256 = "7ce33c2492221a0436f96a8500215e9f3e3dcb5fd26a757cd415e7a843babd5e" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = 'CFLAGS="-O2 -fPIC -fno-sanitize=undefined" ./configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static --with-pic --with-libgpg-error-prefix=/usr --disable-doc' +compile = 'make -j"$(nproc)"' +install = 'make DESTDIR=/out install' + +[deps] +build = ["make", "libgpg-error-shared"] diff --git a/recipes/incoming-gnome/libgpg-error-shared.toml b/recipes/incoming-gnome/libgpg-error-shared.toml new file mode 100644 index 00000000..a160b0a7 --- /dev/null +++ b/recipes/incoming-gnome/libgpg-error-shared.toml @@ -0,0 +1,33 @@ +# libgpg-error-shared 1.61 — variante DINÁMICA de libgpg-error para el escritorio GNOME. +# +# Mismo patrón y misma razón que zlib-shared / cairo-shared / freetype-shared de este frente: la +# canónica (recipes/libgpg-error.toml) es `--disable-shared` y además está afinada para que sus +# binarios salgan 100% estáticos (`-all-static -no-pie`). Sus objetos NO son PIC, así que al meter +# libgpg-error.a dentro de un .so el linker corta con «relocation R_X86_64_32 ... recompile with +# -fPIC» (medido al construir gcr). +# +# POR QUÉ NO SE ARREGLA LA CANÓNICA: `yupana radio libgpg-error` da 5 sellados que caerían a deuda +# en las imágenes base y cli, y esa receta tiene un ajuste fino documentado (el `-all-static` va en +# compile Y en install, nunca en configure) que no conviene mover por una necesidad del escritorio. +# La regla del frente es clara: variante `-shared` en la cola, canónica intacta. +# (Ojo: yupana muestra que existe TAMBIÉN una libgpg-error en incoming-kde con 39 dependientes. +# Ésta no la toca ninguna de las dos.) +name = "libgpg-error-shared" +version = "1.61" + +[source] +tarball = "https://gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-1.61.tar.bz2" +sha256 = "7a85413f2bc354f4f8aa832b718af122e48965e9e0eb9012ee659c13c6385c93" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --enable-shared --disable-static --with-pic --disable-doc --disable-tests --enable-install-gpg-error-config' +compile = 'make -j"$(nproc)"' +install = 'make DESTDIR=/out install' + +[deps] +build = ["make"] diff --git a/recipes/incoming-gnome/p11-kit.toml b/recipes/incoming-gnome/p11-kit.toml new file mode 100644 index 00000000..76314710 --- /dev/null +++ b/recipes/incoming-gnome/p11-kit.toml @@ -0,0 +1,32 @@ +# p11-kit 0.26.4 — capa común de PKCS#11: carga y comparte módulos criptográficos entre procesos. +# Entra por gcr, que la exige sin perilla (gcr-4.4.0.1/meson.build:91), y gcr entra por gnome-shell. +# +# -Dtrust_module=disabled: el módulo de confianza (el que expone el almacén de CAs del sistema como +# un token PKCS#11) es lo ÚNICO que arrastra libtasn1, que no está en el corpus. gcr no lo usa: le +# alcanza con la carga de módulos. Ahorra una receta entera; si algún día hace falta el almacén de +# CAs por PKCS#11, vuelve junto con libtasn1. +# +# systemd=disabled (arje-zero es PID1). Completions de shell fuera: son datos de un shell que esta +# imagen no fija. +# +# Dinámica por diseño, no por la regla de GType: p11-kit ES un dlopen()-eador de módulos; su razón de +# ser es el enlace tardío. +name = "p11-kit" +version = "0.26.4" + +[source] +tarball = "https://github.com/p11-glue/p11-kit/releases/download/0.26.4/p11-kit-0.26.4.tar.xz" +sha256 = "89c3ffb10e076ee036e14732bf6547a1e1c4fb48699a5dee7ceb5ce4f7c0c462" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Ddefault_library=shared -Dtrust_module=disabled -Dsystemd=disabled -Dbash_completion=disabled -Dzsh_completion=disabled -Dlibffi=enabled -Dc_args=-Wno-error=date-time" +compile = "ninja -C output" +install = "DESTDIR=/out ninja -C output install" + +[deps] +build = ["meson", "samurai", "python3", "pkgconf", "libffi"]