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:
@@ -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"]
|
||||
@@ -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"]
|
||||
|
||||
@@ -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"]
|
||||
Reference in New Issue
Block a user