tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1543Shell 203Rust 109Markdown 993728 Definitions

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.

019761cad1dee88bdb80f0dee8372619e34c1819 · by Sergio · (2 d ago) · parent 9b5861d81 · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

1 files · +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"