receta: fcitx5 — el marco para ESCRIBIR chino, japonés y coreano
Las fuentes Noto de esta tarde hicieron que la distro LEA esos alfabetos. Escribirlos es otra cosa: un teclado tiene cien teclas y el chino decenas de miles de caracteres, así que hace falta un motor de conversión. `censo-distro.py` marcaba «escribir en esos idiomas» 5 de 6 ausente. Lo medido antes de escribir la receta, que es lo que decide si esto es trabajo o trabajo tirado: · **No hay muro estructural** — era la primera duda, y la que descartó a `kitty`. Un IME en Wayland necesita que el COMPOSITOR implemente dos protocolos, y `mirada-compositor` los registra los dos (`setup.rs:600-602`): `TextInputManagerState` ⇒ `zwp_text_input_v3` e `InputMethodManagerState` ⇒ `zwp_input_method_v2`. · **Las dos deps que faltaban eran de COLA**, promovidas en el commit anterior y gratis. · **Cinco deps se caen con dos perillas**: upstream mete XCB y `XCBImdkit` como REQUIRED sólo dentro de `if(ENABLE_X11)` (CMakeLists:138-139) y `enchant2` sólo con `ENABLE_ENCHANT`. Con las dos en Off desaparecen `xcb-imdkit`, `xcb-util-keysyms`, `xcb-util-wm`, `libxkbfile` y `enchant2`. Y apagar X11 no es un recorte: **la distro es Wayland-only**, ese código sería muerto. `USE_SYSTEMD=Off` porque acá el init es `arje-zero` y upstream cae a libuv/libdbus, que sí están. `link = "dynamic"` y no es opcional: los métodos de entrada son addons que el daemon carga con `dlopen`, y un binario `crt-static` no puede dlopen — estático sellaría un daemon incapaz de cargar un solo motor. Guardián en el `install` que exige el daemon Y al menos un addon, porque un `cmake --install` que deje sólo cabeceras y `.cmake` sellaría con contenido y sin función. ⚠ **NO SE DECLARA EN NINGÚN PERFIL, a propósito.** Esto es el marco —daemon, protocolo, barra de candidatos— y no escribe chino solo: cada idioma es un addon aparte que todavía no existe (`fcitx5-chinese-addons`/libime, `fcitx5-anthy`, `fcitx5-hangul`, `fcitx5-rime`). Declarar el marco ya daría una barra de IME que no convierte nada, que es exactamente la figura de `crun` sin podman y de `cups` sin filtros — tres veces documentada en este catálogo. Primero construye el marco, después un motor, y el par se declara junto. Sin construir todavía. Se publica antes de moler para que el clon que siembra al worker no muela una receta que no está en ningún commit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +103 −0
- recipes/fcitx5.toml +103 −0
diff --git a/recipes/fcitx5.toml b/recipes/fcitx5.toml
new file mode 100644
index 00000000..63f90342
--- /dev/null
+++ b/recipes/fcitx5.toml
@@ -0,0 +1,103 @@
+# fcitx5 — el marco de métodos de entrada. Lo que falta para ESCRIBIR en chino, japonés y coreano.
+#
+# ══ POR QUÉ ENTRA ══════════════════════════════════════════════════════════════════════════════
+# El 2026-10-19 entraron las fuentes Noto (`noto-fonts`, `noto-fonts-cjk`, `noto-fonts-emoji`), así
+# que la distro pasó de mostrar cuadraditos a LEER esos alfabetos. Escribirlos es otra cosa: un
+# teclado tiene cien teclas y el chino tiene decenas de miles de caracteres, así que hace falta un
+# motor que convierta lo que se teclea en lo que se escribe. `censo-distro.py` marcaba la categoría
+# «escribir en esos idiomas» 5 de 6 ausente.
+#
+# ══ LO QUE SE MIDIÓ ANTES DE ESCRIBIR ESTO ═════════════════════════════════════════════════════
+#
+# **1. NO hay muro estructural, y era la primera duda.** El camino de un IME en Wayland son dos
+# protocolos que el COMPOSITOR tiene que implementar; si no están, ningún paquete sirve y esto
+# habría sido trabajo tirado (como `kitty`, que no entra por falta de GL de escritorio).
+# `mirada-compositor` los registra los dos — `setup.rs:600-602`:
+# smithay::wayland::text_input::TextInputManagerState ⇒ zwp_text_input_v3
+# smithay::wayland::input_method::InputMethodManagerState ⇒ zwp_input_method_v2
+#
+# **2. Las dos deps que faltaban eran de COLA, no inexistentes.** `extra-cmake-modules` vivía en
+# `incoming-kde` y `iso-codes` en `incoming-gnome`, y una receta del corpus resuelve sibling-first y
+# después el catálogo padre — **nunca una cola hermana**. Se promovieron al corpus en el commit
+# anterior, verificando que es gratis: los 109 dependientes de ecm en incoming-kde conservan su hash
+# uno por uno.
+#
+# **3. Cinco deps se caen con dos perillas.** El `CMakeLists.txt` de upstream mete XCB y
+# `XCBImdkit` como REQUIRED **sólo dentro de `if(ENABLE_X11)`** (líneas 138-139), y `enchant2` sólo
+# con `ENABLE_ENCHANT`. Con las dos en Off desaparecen `xcb-imdkit`, `xcb-util-keysyms`,
+# `xcb-util-wm`, `libxkbfile` y `enchant2`. Y apagar X11 no es un recorte: **esta distro es
+# Wayland-only**, el X11 de fcitx5 sería código muerto.
+#
+# ══ LAS PERILLAS, UNA POR UNA ══════════════════════════════════════════════════════════════════
+# ENABLE_X11=Off Wayland-only por decisión de distro; se lleva cuatro deps
+# ENABLE_ENCHANT=Off predicción de palabras por diccionario: no la pide nadie y trae enchant2
+# USE_SYSTEMD=Off acá el init es `arje-zero`. Upstream dice que cae a libuv/libdbus, que SÍ
+# están — dejarlo en Auto haría que el build busque algo que no existe
+# ENABLE_TEST=Off y `ENABLE_TESTING_ADDONS=Off`, que es su requisito (su propio `option()`
+# lo dice). Los addons de prueba son un frontend falso para el test suite
+# ENABLE_DOC=Off doxygen no está en el corpus
+# BUILD_SPELL_DICT=Off construye `en_dict.fscd` para el corrector inglés — depende de enchant
+#
+# ⚠ `link = "dynamic"` **y no es opcional**: fcitx5 es un daemon cuyos métodos de entrada son
+# addons que carga con `dlopen` en tiempo de ejecución (`libexec/` + `lib/fcitx5/`). Un binario
+# `crt-static` no puede dlopen, así que estático sellaría un daemon incapaz de cargar un solo motor
+# — sellado, con contenido, reproducible e inerte.
+#
+# ══ ⚠ ESTO ES EL MARCO, NO UN MÉTODO DE ENTRADA ════════════════════════════════════════════════
+# fcitx5 solo no escribe chino: es la plomería (el daemon, el protocolo, la UI de la barra de
+# candidatos). Cada idioma es un addon APARTE y son recetas que todavía no existen:
+# fcitx5-chinese-addons pinyin (arrastra libime y libpinyin)
+# fcitx5-anthy japonés (arrastra anthy)
+# fcitx5-hangul coreano (arrastra libhangul)
+# fcitx5-rime los tres (arrastra librime, que es grande)
+# Declarar sólo esto en un perfil daría una barra de IME que no convierte nada. **Por eso NO se
+# declara en ningún perfil en este commit**: primero el marco construye, después un motor, y recién
+# entonces el par se declara junto. La alternativa —declarar el marco ya— es exactamente la figura
+# de `crun` sin podman y de `cups` sin filtros que este catálogo tiene documentada tres veces.
+name = "fcitx5"
+version = "5.1.14"
+license = "LGPL-2.1-or-later"
+
+[source]
+tarball = "https://github.com/fcitx/fcitx5/archive/refs/tags/5.1.14/fcitx5-5.1.14.tar.gz"
+sha256 = "c81bbf0156d083e4c7e7817e658122c33a8c1e585962467f251bc9614bdfee47"
+
+[build]
+compiler = "zig-cc"
+target = "x86_64-linux-musl"
+link = "dynamic"
+flags = []
+
+[build.phases]
+configure = '''
+ZW="$PWD/.zwrap"; mkdir -p "$ZW"
+printf '#!/bin/sh\nexec /opt/zig/zig cc -mcpu=baseline "$@"\n' > "$ZW/cc"
+printf '#!/bin/sh\nexec /opt/zig/zig c++ -mcpu=baseline "$@"\n' > "$ZW/cxx"
+chmod +x "$ZW/cc" "$ZW/cxx"
+cmake -B build -G Ninja -Wno-dev \
+ -DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" -DCMAKE_ASM_COMPILER="$ZW/cc" \
+ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
+ -DENABLE_X11=Off -DENABLE_ENCHANT=Off -DUSE_SYSTEMD=Off \
+ -DENABLE_TEST=Off -DENABLE_TESTING_ADDONS=Off -DENABLE_DOC=Off \
+ -DBUILD_SPELL_DICT=Off
+'''
+compile = "cmake --build build"
+# El guardián de presencia, por la regla 3: lo que tiene que quedar es el DAEMON y su directorio de
+# addons. Un `cmake --install` que deje las cabeceras y los `.cmake` y ningún binario sellaría un
+# artefacto con contenido y sin función — y eso llega hasta el final diciendo que todo fue bien.
+install = '''
+set -e
+DESTDIR=/out cmake --install build
+[ -x /out/usr/bin/fcitx5 ] || { echo "fcitx5: no quedó /usr/bin/fcitx5 — NO sello un marco sin daemon" >&2; exit 1; }
+n=$(find /out/usr/lib/fcitx5 -name '*.so' 2>/dev/null | wc -l)
+echo "fcitx5: daemon + $n addon(s) de fábrica"
+[ "$n" -gt 0 ] || { echo "fcitx5: cero addons en /usr/lib/fcitx5 — el daemon no podría cargar ni su propia UI" >&2; exit 1; }
+'''
+
+[deps]
+# `iso-codes` y `extra-cmake-modules` son las dos promovidas al corpus para esto.
+# `util-linux` por `libuuid` (`find_package(LibUUID REQUIRED)`), `gettext-tiny` por `LibIntl`.
+build = ["cmake", "samurai", "extra-cmake-modules", "pkgconf", "iso-codes", "xkeyboard-config",
+ "libxkbcommon", "wayland", "wayland-protocols", "cairo", "pango", "gdk-pixbuf",
+ "dbus", "libuv", "nlohmann-json", "expat", "zlib", "gettext-tiny", "util-linux",
+ "libxml2", "json-c", "python3"]