gnome onda 3: gcr SELLADO (b3:698096b0) + p11-kit + las variantes shared de libgcrypt/libgpg-error

Tercera de la cima. gnome-shell la exige por gcr-4 (meson.build:74) y su JS importa gi://Gcr
(js/ui/components/keyring.js) ⇒ tenía que ser .so con typelib, no había opción estática.

Cadena nueva: p11-kit (b3:8dbec390) → gcr. p11-kit va con -Dtrust_module=disabled, que es lo
único que arrastraba libtasn1: una receta menos.

EL NUDO REAL fue el PIC, otra vez. libgcrypt y libgpg-error del corpus son estáticas SIN PIC
(y libgcrypt además está afinada para binarios -all-static -no-pie, con la advertencia escrita
de que el flag va en compile e install pero nunca en configure). Meterlas en un .so da
«relocation R_X86_64_32 ... recompile with -fPIC».

NO se tocaron las canónicas: `yupana radio` dio 5 sellados cayendo a deuda en base/cli, y
mostró además que existe OTRA libgpg-error en incoming-kde con 39 dependientes — justo el
tipo de colisión que el radio existe para ver. Se hicieron variantes -shared en la cola, que
es el idioma que este frente ya tiene (zlib-shared, cairo-shared, freetype-shared…).

libgcrypt-shared compiló con ZIG-CC, no gcc como la canónica: evidencia de que esa receta puede
migrar cuando le toque el turno de matar-gcc. Necesitó -fno-sanitize=undefined (el runtime UBSan
que inyecta zig deja __ubsan_handle_* sin definir en el .so), remedio ya documentado en zlib-shared.

Otros dos apagados de gcr, cada uno ahorrando una receta: -Dssh_agent=false (libsecret sólo la
pide el agente ssh) y -Dgpg_path fijo (gcr sólo quiere la RUTA de gpg para hornearla, no ejecuta
nada). Y el sed de subdir('po'): el msgfmt de gettext-tiny ABORTA con SIGABRT en po/ar.po. Es la
segunda vez que ese msgfmt marca el límite; si hay una tercera, conviene autorar el gettext de GNU.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-28 06:54:14 -04:00
co-authored by Claude Opus 5
parent 92977572a1
commit a79cc8d1ab
5 changed files with 258 additions and 20 deletions
+108 -20
View File
@@ -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",
+52
View File
@@ -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"]
@@ -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"]
@@ -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"]
+32
View File
@@ -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"]