fcitx5: el quinto requisito del salto no salía de ningún CMakeLists
Los cuatro requisitos del 5.1.14 → 5.1.21 se encuentran comparando los dos
CMakeLists. Éste no, y mató el build: log.cpp usa std::osyncstream, que entró en
5.1.20 — o sea en TODA la ventana, no hay tag que lo esquive.
log.cpp:38:30: error: no type named 'osyncstream' in namespace 'std'
Lo primero que supuse era falso: NO falta el header. <syncstream> está en la
libc++ de zig; la clase está vallada tras _LIBCPP_ENABLE_EXPERIMENTAL
(__config:54), porque libc++ lo marca experimental por estabilidad de ABI en su
dylib — preocupación que acá no aplica, cada artefacto enlaza su runtime.
Dos comprobaciones acotan la cura a un define en UNA receta:
· el header no trae declaraciones fuera de línea ⇒ header-only, no hace falta
-lc++experimental
· osyncstream aparece sólo en log.cpp y en NINGUNA cabecera pública ⇒ hangul,
anthy, libime y los addons compilan sin enterarse. Cinco recetas no tocadas
Verificado: sella con 20 addons de fábrica (eran 17 en 5.1.14).
Y el control preventivo sobre las otras cuatro fuentes de la campaña, para no
descubrir la misma clase de muro en serie: el std::format de chinese-addons
depende sólo de -std=c++20 y no de la valla, y los generator/stacktrace de
OpenCC eran nombres propios y no la biblioteca.
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +34 −0
- recipes/fcitx5.toml +34 −0
diff --git a/recipes/fcitx5.toml b/recipes/fcitx5.toml
index f223b330..86dd4a4d 100644
--- a/recipes/fcitx5.toml
+++ b/recipes/fcitx5.toml
@@ -141,6 +141,39 @@
# vacío (el único directorio vacío del tarball), así que
# `USE_SYSTEM_YOGA=On` no es una preferencia: sin él
# `add_subdirectory(third_party/yoga/yoga)` falla al CONFIGURAR.
+
+# ══ ⚠ Y UN QUINTO REQUISITO QUE NO SALE DE NINGÚN CMakeLists: `std::osyncstream` ════════════════
+# Los cuatro de arriba se encuentran comparando los dos CMakeLists. **Éste no se ve ahí y mató el
+# build**: `src/lib/fcitx-utils/log.cpp` usa `std::osyncstream` (C++20, salida sincronizada), y el
+# compilador cortó con
+#
+# log.cpp:38:30: error: no type named 'osyncstream' in namespace 'std'
+#
+# Entró en **5.1.20** —o sea en TODAS las versiones de la ventana, no hay un tag que lo evite— y no
+# estaba en 5.1.14, que es por lo que esta receta nunca lo había pisado.
+#
+# ⚠ **Lo primero que supuse era falso: no es que falte el header.** `<syncstream>` está en la libc++
+# de zig. Lo que pasa es que la clase está VALLADA (`__config:54`):
+#
+# #if defined(_LIBCPP_ENABLE_EXPERIMENTAL) || defined(_LIBCPP_BUILDING_LIBRARY)
+# # define _LIBCPP_HAS_EXPERIMENTAL_LIBRARY 1
+# …
+# #define _LIBCPP_HAS_EXPERIMENTAL_SYNCSTREAM _LIBCPP_HAS_EXPERIMENTAL_LIBRARY
+#
+# y `<syncstream>` sólo declara `basic_osyncstream` si ese macro está en 1. ⇒ la cura es **un
+# define**, no un parche a la fuente ni una biblioteca extra: comprobado que el header no trae
+# ninguna declaración fuera de línea (`_LIBCPP_EXPORTED_FROM_ABI`, `extern template`), así que es
+# header-only y **no hace falta `-lc++experimental`**.
+#
+# Es la familia de [[cxx-runtime-debe-coincidir]]: zig trae libc++, y libc++ marca `<syncstream>`
+# como experimental por estabilidad de ABI en su dylib — una preocupación que acá no aplica, porque
+# cada artefacto enlaza su runtime y no compartimos una libc++ de sistema.
+#
+# ✅ **Y el define va SÓLO acá, que es el dato que evita cinco recetas tocadas**: se comprobó que
+# `osyncstream` aparece **únicamente** en `log.cpp` y en NINGUNA cabecera pública (`log.h` incluida),
+# así que `fcitx5-hangul`, `fcitx5-anthy`, `libime` y los addons compilan contra las cabeceras
+# instaladas sin enterarse. Si algún día upstream lo subiera a un header, el fallo saldría en los
+# consumidores y no acá — y esta nota es lo que haría reconocerlo.
#
# Lo que este salto arrastra: `fcitx5-hangul` y `fcitx5-anthy` rearman, porque dependen del marco.
# Son dos recetas del corpus y el coreano y el japonés ya estaban sellados — se reconstruyen y se
@@ -186,6 +219,7 @@ cmake -B build -G Ninja -Wno-dev \
-DENABLE_TEST=Off -DENABLE_TESTING_ADDONS=On -DENABLE_DOC=Off \
-DBUILD_SPELL_DICT=Off -DENABLE_LIBUUID=Off \
-DUSE_SYSTEM_YOGA=On -DUSE_SYSTEM_PLASMA_WAYLAND_PROTOCOLS=Off \
+ -DCMAKE_CXX_FLAGS=-D_LIBCPP_ENABLE_EXPERIMENTAL \
-DPKG_CONFIG_ARGN=--static
'''
compile = "cmake --build build"