diff --git a/recipes/incoming-gnome/evolution-data-server.toml b/recipes/incoming-gnome/evolution-data-server.toml new file mode 100644 index 00000000..8df3c48f --- /dev/null +++ b/recipes/incoming-gnome/evolution-data-server.toml @@ -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 , "nss.h" y 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"] diff --git a/recipes/incoming-gnome/json-glib.toml b/recipes/incoming-gnome/json-glib.toml index 44812cf1..982ce9f7 100644 --- a/recipes/incoming-gnome/json-glib.toml +++ b/recipes/incoming-gnome/json-glib.toml @@ -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 | 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"] diff --git a/recipes/incoming-gnome/nss.toml b/recipes/incoming-gnome/nss.toml new file mode 100644 index 00000000..6d072920 --- /dev/null +++ b/recipes/incoming-gnome/nss.toml @@ -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 , "nss.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/.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"]