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…

⎇ main recipes/fcitx5-hangul.toml TOML · 93 líneas · 5.7 KB Historia crudo

fix(fcitx5-hangul): mi guardián era demasiado literal y paró un build que había salido bien a1ef64ee4 · Sergio ·

1# fcitx5-hangul 5.1.11 — el PRIMER método de entrada de la distro. Con esto se escribe coreano.
2#
3# ══ LO QUE ESTO CIERRA ═════════════════════════════════════════════════════════════════════════
4# El 2026-10-19 entraron las fuentes Noto, así que la distro pasó a LEER chino, japonés, coreano,
5# árabe e hindi. Pero leer no es escribir: un teclado tiene cien teclas y esos sistemas no se
6# teclean uno-a-uno. `fcitx5` (el marco) selló el 2026-10-20 y **no se declaró en ningún perfil a
7# propósito**, porque un marco sin motor es una barra de candidatos que no convierte nada — la
8# figura de `crun` sin podman que este catálogo tiene documentada tres veces.
9#
10# Esto es el motor. El par marco+motor se declara JUNTO, y por eso los dos entran al mismo perfil
11# en el mismo movimiento.
12#
13# ══ POR QUÉ EL COREANO PRIMERO, Y NO ES PREFERENCIA ════════════════════════════════════════════
14# Medido contra el catálogo el 2026-10-20, deps nuevas que hace falta autorar por motor:
15#
16#   coreano  (fcitx5-hangul)          **1** — `libhangul`
17#   japonés  (fcitx5-anthy)            2  — `anthy` + `fcitx5-qt` (arrastra Qt)
18#   chino    (fcitx5-chinese-addons)   6  — `libime`, `libpinyin`, `opencc`, `fcitx5-lua`,
19#                                          `fcitx5-qt` y **qt6-qtwebengine**
20#
21# El coreano prueba la cadena COMPLETA —marco + motor + fuentes + los dos protocolos de Wayland que
22# `mirada-compositor` registra— por una receta nueva. Los otros dos son campañas con su propio
23# presupuesto, y el chino además necesita que Qt salga de `incoming-kde` al corpus (hoy `qtbase`
24# vive ahí, y una receta del corpus no alcanza una cola hermana).
25#
26# ⚠ `link = "dynamic"` y es obligatorio: esto NO es un ejecutable, es un `.so` que el daemon de
27# fcitx5 carga con `dlopen` desde `/usr/lib/fcitx5/`. Por eso su dep `libhangul` nace con
28# `CMAKE_POSITION_INDEPENDENT_CODE=ON`: un `.a` sin PIC no entra en un `.so`, y eso ayer costó una
29# decisión de arquitectura (el trío de fuentes con `--with-pic`, 40 recetas de cascada).
30#
31# `PKG_CONFIG_ARGN=--static` por lo mismo que en `fcitx5`: en un corpus estático, pkg-config
32# entrega los `Requires.private`/`Libs.private` **sólo** en modo estático, y sin eso faltan los
33# `-l` de las privadas — el síntoma es un `undefined symbol` a dos niveles de la causa.
34#
35# ⚠ Sin `fcitx5-qt`: el `cmake` de upstream lo usa para la UI de CONFIGURACIÓN (elegir el layout
36# desde un diálogo Qt), no para escribir. Apagarlo deja el motor entero y la configuración por
37# fichero, que es lo que una distro sin Qt en el corpus puede dar hoy.
38name    = "fcitx5-hangul"
39version = "5.1.11"
40license = "GPL-3.0-or-later"
41
42[source]
43tarball = "https://github.com/fcitx/fcitx5-hangul/archive/refs/tags/5.1.11/fcitx5-hangul-5.1.11.tar.gz"
44sha256  = "9f9d4714517d7148159972c6f1ca042f1d114cde29ec1b9f6d3462b82dba7960"
45
46[build]
47compiler = "zig-cc"
48target   = "x86_64-linux-musl"
49link     = "dynamic"
50flags    = []
51
52[build.phases]
53configure = '''
54ZW="$PWD/.zwrap"; mkdir -p "$ZW"
55printf '#!/bin/sh\nexec /opt/zig/zig cc -mcpu=baseline "$@"\n'  > "$ZW/cc"
56printf '#!/bin/sh\nexec /opt/zig/zig c++ -mcpu=baseline "$@"\n' > "$ZW/cxx"
57chmod +x "$ZW/cc" "$ZW/cxx"
58rm -rf build
59cmake -B build -G Ninja -Wno-dev \
60  -DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" \
61  -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
62  -DPKG_CONFIG_ARGN=--static \
63  -DENABLE_TEST=Off
64'''
65compile = "cmake --build build"
66# El guardián pide el `.so` del addon Y su `.conf`. Las dos piezas hacen falta y por razones
67# distintas: sin el `.so` no hay motor; sin el `.conf` en `share/fcitx5/addon/` el daemon no sabe
68# que existe y no lo carga nunca — sellaría con contenido, reproducible e inerte, que es lo que la
69# regla 3 persigue.
70#
71# ⚠ **Y NO SE CODIFICA EL NOMBRE EXACTO DEL FICHERO, porque mi primera versión lo hizo y dio un
72# FALSO POSITIVO.** Pedía `hangul.so` y el build instala **`libhangul.so`**: la convención de fcitx5
73# es `lib<nombre>.so` —estaba a la vista en su propio artefacto (`libclassicui.so`,
74# `libclipboard.so`, `libdbus.so`…)— y yo la supuse en vez de mirarla. El build había salido BIEN y
75# el guardián lo paró: un guardián demasiado literal rechaza trabajo bueno, que es la otra forma de
76# ser inútil. Se busca por SUBCADENA dentro del directorio de addons, que es lo que de verdad
77# importa (que haya un módulo de hangul ahí), y se exige el `.conf` por su nombre porque ése sí lo
78# fija fcitx5.
79install = '''
80set -e
81DESTDIR=/out cmake --install build
82so=$(find /out/usr/lib/fcitx5 -name '*hangul*.so' 2>/dev/null | head -1)
83[ -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; }
84[ -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; }
85echo "fcitx5-hangul: addon $(basename "$so") + hangul.conf · datos: $(ls /out/usr/share/fcitx5/hangul/ 2>/dev/null | tr '\n' ' ')"
86'''
87[deps]
88# `fcitx5` provee las cabeceras y los `.cmake` de `Fcitx5Core`/`Fcitx5Utils`; `libhangul`, el motor.
89# El resto es el cierre de `.pc` que el enlace de un `.so` necesita — la lección de ayer: declarar
90# la biblioteca no alcanza, hay que declarar el cierre de su `.pc`.
91build = ["cmake", "samurai", "extra-cmake-modules", "pkgconf", "fcitx5", "libhangul",
92         "gettext-tiny", "libxkbcommon", "wayland", "wayland-protocols", "glib", "pcre2",
93         "libffi", "expat", "zlib", "dbus"]