# fcitx5-hangul 5.1.11 — el PRIMER método de entrada de la distro. Con esto se escribe coreano. # # ══ LO QUE ESTO CIERRA ═════════════════════════════════════════════════════════════════════════ # El 2026-10-19 entraron las fuentes Noto, así que la distro pasó a LEER chino, japonés, coreano, # árabe e hindi. Pero leer no es escribir: un teclado tiene cien teclas y esos sistemas no se # teclean uno-a-uno. `fcitx5` (el marco) selló el 2026-10-20 y **no se declaró en ningún perfil a # propósito**, porque un marco sin motor es una barra de candidatos que no convierte nada — la # figura de `crun` sin podman que este catálogo tiene documentada tres veces. # # Esto es el motor. El par marco+motor se declara JUNTO, y por eso los dos entran al mismo perfil # en el mismo movimiento. # # ══ POR QUÉ EL COREANO PRIMERO, Y NO ES PREFERENCIA ════════════════════════════════════════════ # Medido contra el catálogo el 2026-10-20, deps nuevas que hace falta autorar por motor: # # coreano (fcitx5-hangul) **1** — `libhangul` # japonés (fcitx5-anthy) 2 — `anthy` + `fcitx5-qt` (arrastra Qt) # chino (fcitx5-chinese-addons) 6 — `libime`, `libpinyin`, `opencc`, `fcitx5-lua`, # `fcitx5-qt` y **qt6-qtwebengine** # # El coreano prueba la cadena COMPLETA —marco + motor + fuentes + los dos protocolos de Wayland que # `mirada-compositor` registra— por una receta nueva. Los otros dos son campañas con su propio # presupuesto, y el chino además necesita que Qt salga de `incoming-kde` al corpus (hoy `qtbase` # vive ahí, y una receta del corpus no alcanza una cola hermana). # # ⚠ `link = "dynamic"` y es obligatorio: esto NO es un ejecutable, es un `.so` que el daemon de # fcitx5 carga con `dlopen` desde `/usr/lib/fcitx5/`. Por eso su dep `libhangul` nace con # `CMAKE_POSITION_INDEPENDENT_CODE=ON`: un `.a` sin PIC no entra en un `.so`, y eso ayer costó una # decisión de arquitectura (el trío de fuentes con `--with-pic`, 40 recetas de cascada). # # `PKG_CONFIG_ARGN=--static` por lo mismo que en `fcitx5`: en un corpus estático, pkg-config # entrega los `Requires.private`/`Libs.private` **sólo** en modo estático, y sin eso faltan los # `-l` de las privadas — el síntoma es un `undefined symbol` a dos niveles de la causa. # # ⚠ Sin `fcitx5-qt`: el `cmake` de upstream lo usa para la UI de CONFIGURACIÓN (elegir el layout # desde un diálogo Qt), no para escribir. Apagarlo deja el motor entero y la configuración por # fichero, que es lo que una distro sin Qt en el corpus puede dar hoy. name = "fcitx5-hangul" version = "5.1.11" license = "GPL-3.0-or-later" [source] tarball = "https://github.com/fcitx/fcitx5-hangul/archive/refs/tags/5.1.11/fcitx5-hangul-5.1.11.tar.gz" sha256 = "9f9d4714517d7148159972c6f1ca042f1d114cde29ec1b9f6d3462b82dba7960" [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" rm -rf build cmake -B build -G Ninja -Wno-dev \ -DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" \ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \ -DPKG_CONFIG_ARGN=--static \ -DENABLE_TEST=Off ''' compile = "cmake --build build" # El guardián pide el `.so` del addon Y su `.conf`. Las dos piezas hacen falta y por razones # distintas: sin el `.so` no hay motor; sin el `.conf` en `share/fcitx5/addon/` el daemon no sabe # que existe y no lo carga nunca — sellaría con contenido, reproducible e inerte, que es lo que la # regla 3 persigue. # # ⚠ **Y NO SE CODIFICA EL NOMBRE EXACTO DEL FICHERO, porque mi primera versión lo hizo y dio un # FALSO POSITIVO.** Pedía `hangul.so` y el build instala **`libhangul.so`**: la convención de fcitx5 # es `lib.so` —estaba a la vista en su propio artefacto (`libclassicui.so`, # `libclipboard.so`, `libdbus.so`…)— y yo la supuse en vez de mirarla. El build había salido BIEN y # el guardián lo paró: un guardián demasiado literal rechaza trabajo bueno, que es la otra forma de # ser inútil. Se busca por SUBCADENA dentro del directorio de addons, que es lo que de verdad # importa (que haya un módulo de hangul ahí), y se exige el `.conf` por su nombre porque ése sí lo # fija fcitx5. install = ''' set -e DESTDIR=/out cmake --install build so=$(find /out/usr/lib/fcitx5 -name '*hangul*.so' 2>/dev/null | head -1) [ -n "$so" ] || { echo "fcitx5-hangul: no hay ningún *hangul*.so en /usr/lib/fcitx5 — NO sello un motor que el daemon no puede cargar" >&2; ls -R /out/usr/lib 2>/dev/null | head -20 >&2; exit 1; } [ -f /out/usr/share/fcitx5/addon/hangul.conf ] || { echo "fcitx5-hangul: falta share/fcitx5/addon/hangul.conf — sin él el daemon no sabe que el addon existe" >&2; exit 1; } echo "fcitx5-hangul: addon $(basename "$so") + hangul.conf · datos: $(ls /out/usr/share/fcitx5/hangul/ 2>/dev/null | tr '\n' ' ')" ''' [deps] # `fcitx5` provee las cabeceras y los `.cmake` de `Fcitx5Core`/`Fcitx5Utils`; `libhangul`, el motor. # El resto es el cierre de `.pc` que el enlace de un `.so` necesita — la lección de ayer: declarar # la biblioteca no alcanza, hay que declarar el cierre de su `.pc`. build = ["cmake", "samurai", "extra-cmake-modules", "pkgconf", "fcitx5", "libhangul", "gettext-tiny", "libxkbcommon", "wayland", "wayland-protocols", "glib", "pcre2", "libffi", "expat", "zlib", "dbus"]