gnome onda 3: CAE LA ÚLTIMA FRONTERA — evolution-data-server SELLADO (b3:ad335cfb) + nss

La cima de GNOME ya no tiene fronteras: gnome-shell exige libecal-2.0 y
libedataserver-1.2 (meson.build:72-73) y el artefacto trae los dos .pc más los
8 typelibs (ECal-2.0, EDataServer-1.2, Camel-1.2, EBook…).

NSS: el atajo que no era. Primero se intentó esquivarla con -DENABLE_SMIME=OFF.
eds declara esa opción y su cabecera promete honrarla, pero en 3.56.2 el guard NO
EXISTE: include(FindSMIME) es incondicional (:303) y el fichero nunca vuelve a
mirar la variable. Se cableó el guard que faltaba y el configure pasó… y el build
cortó igual en el 11%: src/camel/camel.c incluye <nspr.h>/"nss.h"/<ssl.h> SIN
guardar por el #ifdef y hace init/shutdown reales de NSS. ENABLE_SMIME=OFF sólo
compila fuera camel-smime-context.c, no camel. El modo está roto de verdad.

Así que se pagó: nss 3.126 (b3:d0659c9c), y selló A LA PRIMERA pese a coreconf.
La receta absorbe lo que ese build system no da — no hay ./configure, no hay make
install, el OBJDIR lleva la versión del kernel del constructor (se resuelve por
GLOB, no se hornea, o el artefacto dependería del uname del anfitrión), y el
nss.pc se rellena del template. nss_build_all no sirve: reconstruiría NSPR, y el
nuestro ya está sellado desde spidermonkey. Tampoco era deuda huérfana: NSS es la
base criptográfica del frente del navegador.

json-glib dada vuelta a la isla dinámica (b3:9bc69a4b): su .gir es entrada del
.gir de eds. El comentario viejo de la receta había previsto exactamente este
caso. Radio medido con yupana ANTES de tocar: 3 sellados caen a deuda.

El otro hallazgo: eds usa msgfmt DOS veces. Sacar add_subdirectory(po) no alcanza
porque i18n_merge_file (I18n.cmake:19) fusiona traducciones dentro de los .desktop
desde data/. Se reemplaza por `cmake -E copy`, y NO es aproximación: los templates
traen las claves PLANAS y msgfmt --desktop sólo AGREGA variantes Name[xx]=.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-28 20:22:26 -04:00
co-authored by Claude Opus 5
parent 5779cceae7
commit 0f7817a25f
3 changed files with 226 additions and 9 deletions
@@ -0,0 +1,127 @@
# evolution-data-server 3.56.2 — el almacén de contactos/calendario/correo de GNOME. Es LA frontera
# de la cima: gnome-shell exige libecal-2.0 y libedataserver-1.2 (meson.build:72-73) para el
# calendario del panel superior, y no hay opción para apagarlo — verificado que la serie 50.x lo
# sigue pidiendo igual, así que subir de versión tampoco lo esquiva.
#
# ── SMIME/NSS: EL ATAJO QUE NO ERA ──────────────────────────────────────────────────────────────
# Primer intento: esquivar NSS con -DENABLE_SMIME=OFF. eds declara esa opción (FindSMIME.cmake:19) y
# su cabecera hasta promete "Searches for Mozilla's NSS and NSPR libraries, unless -DENABLE_SMIME=OFF
# is used"… pero en 3.56.2 ese guard NO EXISTE: `include(FindSMIME)` es incondicional
# (CMakeLists.txt:303) y el fichero nunca vuelve a mirar la variable. Se cableó el guard que faltaba
# (tres líneas con el mismo `return()` que el fichero ya usa en :56) y el configure pasó.
#
# Y el build igual cortó, en el 11%: src/camel/camel.c incluye <nspr.h>, "nss.h" y <ssl.h> SIN
# guardar por el #ifdef, y hace init/shutdown reales de NSS (nss_initlock, NSS_Shutdown);
# camel-msgport.c y camel-operation.c también usan NSPR. O sea que ENABLE_SMIME=OFF sólo compila
# fuera camel-smime-context.c, no camel entero. El modo está roto de verdad en esta versión, y
# arrancarlo a parches sería reescribir camel.
#
# Conclusión honesta: NSS no se esquiva, se paga. Se autoró `nss.toml` (b3:d0659c9c, selló a la
# primera pese a coreconf) y con eso el parche a FindSMIME sobra — la rama de pkg-config de
# FindSMIME encuentra `nspr` y `nss` sola y S/MIME queda ENCENDIDO, que es el default del upstream.
# Tampoco era deuda huérfana: NSS es la base criptográfica del frente del navegador.
#
# ── LOS OTROS DOS PARCHES: traducciones ─────────────────────────────────────────────────────────
# Se saca `add_subdirectory(po)` (:1023) por la misma razón que en gcr e iso-codes: el msgfmt de
# gettext-tiny —lo único que hay en el corpus— aborta con SIGABRT en ciertos .po, y eds trae ~100.
#
# Pero eso NO alcanza, y ahí está la sorpresa: eds usa msgfmt DOS veces por motivos distintos. La
# segunda es `i18n_merge_file` (I18n.cmake:19), que corre `msgfmt --desktop --template` para fusionar
# traducciones dentro de los .desktop y los .metainfo. Esa regla vive en data/, no en po/, así que
# sobrevivió al primer parche y el build cortó en el 5% con
# `GETTEXT_MSGFMT_EXECUTABLE-NOTFOUND: not found`.
#
# Se reemplaza el COMMAND por `cmake -E copy`. NO es una aproximación: los templates traen las claves
# PLANAS (`Name=Events and Tasks Reminders`, verificado en
# data/org.gnome.Evolution-alarm-notify.desktop.in.in) y lo único que hace `msgfmt --desktop` es
# AGREGAR las variantes `Name[es]=`. Sin catálogos que fusionar, copiar produce exactamente el mismo
# fichero que produciría msgfmt. Se pierden los textos traducidos, no la librería que enlaza el shell.
#
# Es la TERCERA receta que choca con ese msgfmt; ya conviene autorar el gettext de GNU de verdad en
# vez de seguir apagando traducciones receta por receta.
#
# ── DEPS DURAS, contra el CMakeLists real ───────────────────────────────────────────────────────
# libsecret-1, libxml-2.0, libsoup-3.0 :932 (DATA_SERVER) — las tres selladas en esta cola.
# libical-glib :938 (CALENDAR) — sellada.
# json-glib-1.0, uuid, sqlite3 :423,424,850 — selladas.
# ICU :379 opcional, encendida: ya estaba paga por KDE.
# nspr/nss :932,944 — sólo si ENABLE_SMIME (ver arriba).
#
# ── APAGADOS, y la receta que cada uno ahorra ───────────────────────────────────────────────────
# -DENABLE_GTK=OFF → viene ON y pide gtk+-3.0, o sea GTK **3**, que no existe en este corpus
# (la onda 3 es Wayland/GTK4). Apagarlo también borra ENABLE_OAUTH2_WEBKITGTK
# (:427), que arrastraba WebKitGTK — el paquete más caro del ecosistema.
# -DENABLE_GTK4=OFF → mismo caso para WebKitGTK4 (:437). gtk4 SÍ está sellada, pero lo que el
# shell enlaza es libedataserver, no la UI de eds.
# -DENABLE_GOA=OFF → gnome-online-accounts.
# -DENABLE_WEATHER=OFF → libgweather (backend de calendario del clima).
# -DENABLE_CANBERRA=OFF→ libcanberra-gtk3 (sonido de la alarma).
# -DWITH_OPENLDAP=OFF → openldap (libreta de direcciones corporativa).
# -DWITH_KRB5=OFF → kerberos. Ojo: es variable_path con default "ON", no un option booleano.
# -DWITH_LIBDB=OFF → Berkeley DB (:516), backend heredado.
# -DWITH_PHONENUMBER=OFF → libphonenumber (C++ de Google).
# -DWITH_SYSTEMDUSERUNITDIR=no → eds instala units de usuario de systemd; acá PID1 es arje-zero.
# -DENABLE_TESTS=OFF -DENABLE_INSTALLED_TESTS=OFF -DENABLE_EXAMPLES=OFF -DENABLE_GTK_DOC=OFF
# -DENABLE_VALA_BINDINGS=OFF → no hay valac en el corpus.
#
# -DENABLE_INTROSPECTION=ON viene OFF por defecto y acá NO es opcional: gnome-shell es JavaScript y
# lee EDataServer/ECal por typelib. Isla dinámica, ver [[gnome-introspection-dinamica]].
name = "evolution-data-server"
version = "3.56.2"
[source]
tarball = "https://download.gnome.org/sources/evolution-data-server/3.56/evolution-data-server-3.56.2.tar.xz"
sha256 = "df4ec29950f29a76eac6fbe0f814c48d2cef7d3fdb905002a4a883dd761ce93c"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
[build.phases]
configure = '''
python3 - <<'PY'
p = 'CMakeLists.txt'
s = open(p).read()
assert 'add_subdirectory(po)\n' in s, 'ancla add_subdirectory(po) no encontrada'
s = s.replace('add_subdirectory(po)\n', '', 1)
open(p, 'w').write(s)
p = 'cmake/modules/I18n.cmake'
s = open(p).read()
anchor = """ COMMAND ${GETTEXT_MSGFMT_EXECUTABLE}
--${_I18N_TYPE}
--template=${_source}
-d ${_po_dir}
-o ${_target}
${_I18N_EXTRA_ARGS}
"""
assert anchor in s, 'ancla del COMMAND de i18n_merge_file no encontrada'
s = s.replace(anchor, '\t\tCOMMAND ${CMAKE_COMMAND} -E copy ${_source} ${_target}\n', 1)
open(p, 'w').write(s)
PY
PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages cmake -S . -B build \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE=Release \
-DENABLE_INTROSPECTION=ON \
-DENABLE_GTK=OFF \
-DENABLE_GTK4=OFF \
-DENABLE_GOA=OFF \
-DENABLE_WEATHER=OFF \
-DENABLE_CANBERRA=OFF \
-DENABLE_EXAMPLES=OFF \
-DENABLE_TESTS=OFF \
-DENABLE_INSTALLED_TESTS=OFF \
-DENABLE_GTK_DOC=OFF \
-DENABLE_VALA_BINDINGS=OFF \
-DWITH_OPENLDAP=OFF \
-DWITH_KRB5=OFF \
-DWITH_LIBDB=OFF \
-DWITH_PHONENUMBER=OFF \
-DWITH_SYSTEMDUSERUNITDIR=no
'''
compile = 'PYTHONPATH=/usr/lib/python3.12/site-packages cmake --build build -j"$(nproc)"'
install = 'PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out cmake --install build'
[deps]
build = ["cmake", "pkgconf", "python3", "gperf", "py3-setuptools", "gi-foreign-girs", "gobject-introspection", "glib", "glib-introspected", "libsoup", "libical", "libsecret", "nspr", "nss", "libxml2-shared", "libuuid-shared", "sqlite-shared", "json-glib", "icu4c", "libgcrypt-shared", "libgpg-error-shared", "nghttp2", "libpsl", "libffi", "pcre2", "zlib-shared"]
+18 -9
View File
@@ -3,12 +3,20 @@
# gnome-session. Por eso es el primer ladrillo de la onda 3 después de gnome-desktop. meson static.
# sha256 REAL de `curl -sL <url> | sha256sum`.
#
# Feature-minimal: introspection=false, docs/man/tests off, nls=false (las traducciones piden msgfmt
# completo y el corpus sólo tiene gettext-tiny — mismo motivo que iso-codes).
# Feature-minimal en lo demás: docs/man/tests off, nls=false (las traducciones piden msgfmt completo
# y el corpus sólo tiene gettext-tiny — mismo motivo que iso-codes).
#
# CUÁNDO SE DA VUELTA introspection: si gnome-shell resulta pedir Json-1.0.typelib desde JS
# (`imports.gi.Json`), esta receta tiene que pasar a la ISLA DINÁMICA como glib/gtk4 — el typelib
# exige un .so real que gjs pueda dlopen(). Mientras sólo la enlace mutter en C, static alcanza.
# INTROSPECTION DADA VUELTA el 2026-07-29, y el comentario viejo había previsto EXACTAMENTE este
# caso ("si alguien pide Json-1.0 desde JS, esto pasa a la isla dinámica"). Quien lo pidió no fue
# gnome-shell directamente sino evolution-data-server: su g-ir-scanner cortó con
# `Couldn't find include 'Json-1.0.gir'` al generar EDataServer-1.2.gir, o sea que el .gir de
# json-glib es entrada del .gir de eds, y el de eds es lo que gnome-shell lee desde JS.
#
# Un .gir instalado obliga a la ISLA DINÁMICA completa: el scanner necesita una .so real para
# introspectar, así que link=dynamic y default_library=shared, no sólo -Dintrospection=enabled.
# Costo medido con `yupana radio json-glib` ANTES de tocar: 5 dependientes transitivos, 3 sellados
# que caen a deuda. Se paga; es la misma decisión que se tomó con gsettings-desktop-schemas al
# destrabar mutter. Ver [[gnome-introspection-dinamica]].
name = "json-glib"
version = "1.10.8"
@@ -19,13 +27,14 @@ sha256 = "55c5c141a564245b8f8fbe7698663c87a45a7333c2a2c56f06f811ab73b212dd"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
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 --prefer-static -Ddefault_library=static -Dintrospection=disabled -Ddocumentation=disabled -Dman=false -Dtests=false -Dconformance=false -Dnls=disabled -Dinstalled_tests=false -Dc_args=-Wno-error=date-time"
configure = "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 -Dintrospection=enabled -Ddocumentation=disabled -Dman=false -Dtests=false -Dconformance=false -Dnls=disabled -Dinstalled_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"
# glib aporta gobject/gio + su cierre .pc (static ⇒ pkg-config resuelve Requires.private).
# glib + glib-introspected: la primera aporta gobject/gio, la segunda los typelibs CORE que el
# scanner necesita como entrada. py3-setuptools va porque g-ir-scanner importa distutils.
[deps]
build = ["meson", "samurai", "python3", "pkgconf", "glib", "libffi", "pcre2", "zlib"]
build = ["meson", "samurai", "python3", "pkgconf", "py3-setuptools", "gi-foreign-girs", "gobject-introspection", "glib", "glib-introspected", "libffi", "pcre2", "zlib-shared"]
+81
View File
@@ -0,0 +1,81 @@
# nss 3.126 — Network Security Services de Mozilla (TLS, S/MIME, PKCS#11, almacén de certificados).
#
# POR QUÉ ENTRA, después de haber intentado esquivarla: evolution-data-server declara
# `-DENABLE_SMIME=OFF` y hasta documenta ese modo, pero en 3.56.2 está ROTO — src/camel/camel.c
# incluye <nspr.h>, "nss.h", <ssl.h> SIN guardar por el #ifdef, y hace init/shutdown reales de NSS
# (nss_initlock, NSS_Shutdown). camel-msgport.c y camel-operation.c también usan NSPR. O sea que el
# apagado sólo compila fuera camel-smime-context.c, no camel entero. Se intentó cablear el guard que
# el upstream olvidó en FindSMIME.cmake y el build igual cortó en el 11%: la conclusión honesta es
# que camel REQUIERE NSS en esta versión, y arrancarlo a parches sería reescribir camel.
#
# Y no es deuda de una sola receta: NSS es también la base criptográfica del frente del navegador
# (Firefox/Zen la necesitan igual), así que era una cuenta que había que pagar de todas formas.
#
# ── EL BUILD, QUE NO ES AUTOTOOLS NI CMAKE ──────────────────────────────────────────────────────
# NSS usa `coreconf`, el sistema de make propio de Mozilla. Consecuencias que la receta absorbe:
# · NO hay ./configure. La fase configure existe igual porque si se deja vacía el lab inyecta su
# propio ./configure minimal, que aborta; definirla la desactiva (mismo truco que libxml2).
# · NO hay `make install`. Todo sale a ../dist/<OBJDIR>.OBJ/ y la instalación es a mano. El nombre
# del OBJDIR lo arma coreconf con la versión del kernel del constructor, así que se resuelve por
# glob y NO se hornea: si se escribiera literal, el artefacto dependería del uname del anfitrión.
# · `nss_build_all` NO sirve acá: su primer paso es build_nspr contra ../nspr, que no existe en
# este tarball (extrae sólo nss/). Se usa `make all` apuntando NSPR_{INCLUDE,LIB}_DIR al nspr
# YA SELLADO (b3:d7b71315, el que vino con spidermonkey) — se reusa, no se duplica.
# · NO hay nss.pc generado por el build; el tarball trae el template pkg/pkg-config/nss.pc.in y se
# rellena a mano. Es lo que FindSMIME.cmake de eds busca por pkg-config (`foreach(pkg nss …)`).
#
# NSS_USE_SYSTEM_SQLITE=1 usa la sqlite-shared de esta cola en vez de la copia in-tree de NSS:
# una sola sqlite en la distro, no dos con versiones distintas conviviendo en el mismo proceso.
#
# compiler=gcc, igual que nspr: coreconf está lleno de gcc-ismos y detecta el toolchain por NS_USE_GCC.
# Es deuda consciente del frente matar-gcc, y la misma que ya paga nspr — la pareja entra junta.
name = "nss"
version = "3.126"
[source]
tarball = "https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_126_RTM/src/nss-3.126.tar.gz"
sha256 = "7aa07c758be1453d82d739240b249ffb7aef0041be488067e1c0f348e1f9e337"
strip_components = 1
[build]
compiler = "gcc"
target = "x86_64-linux-musl"
link = "dynamic"
[build.phases]
configure = "cd nss && echo 'NSS no tiene configure: el build es coreconf/make (ver comentario de la receta)'"
compile = '''
cd nss && make all -j"$(nproc)" \
BUILD_OPT=1 \
USE_64=1 \
NS_USE_GCC=1 \
NSS_ENABLE_WERROR=0 \
NSS_DISABLE_GTESTS=1 \
NSS_USE_SYSTEM_SQLITE=1 \
NSPR_INCLUDE_DIR=/usr/include/nspr \
NSPR_LIB_DIR=/usr/lib
'''
install = '''
cd nss
OBJDIR=$(ls -d ../dist/*.OBJ | head -1)
echo "OBJDIR resuelto por glob: $OBJDIR"
install -d /out/usr/lib/pkgconfig /out/usr/include/nss /out/usr/bin
install -m755 "$OBJDIR"/lib/*.so /out/usr/lib/
install -m644 ../dist/public/nss/*.h /out/usr/include/nss/
for b in certutil pk12util modutil nss-policy-check; do
[ -x "$OBJDIR/bin/$b" ] && install -m755 "$OBJDIR/bin/$b" /out/usr/bin/ || true
done
sed -e 's|%prefix%|/usr|g' \
-e 's|%exec_prefix%|/usr|g' \
-e 's|%libdir%|/usr/lib|g' \
-e 's|%includedir%|/usr/include/nss|g' \
-e 's|%NSS_VERSION%|3.126|g' \
-e 's|%NSPR_VERSION%|4.36|g' \
pkg/pkg-config/nss.pc.in > /out/usr/lib/pkgconfig/nss.pc
cat /out/usr/lib/pkgconfig/nss.pc
'''
[deps]
build = ["make", "perl", "python3", "pkgconf", "nspr", "sqlite-shared", "zlib-shared"]