gioser

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 815Rust 56Shell 37Markdown 291229 Sutichaykuna

receta: el SEGUNDO método de entrada — japonés, y cuesta una receta, no dos

⚠ **ME CORRIJO ANTES DE EMPEZAR.** En `fcitx5-hangul` escribí que el japonés costaba «2 — `anthy` +
`fcitx5-qt`». Era falso: lo saqué de los `makedepends` de Alpine **sin abrir el `CMakeLists.txt`**,
el mismo error que inventar una dep `fmt` para `fcitx5`. Medido: el CMakeLists de fcitx5-anthy **no
menciona Qt ni una vez** — sus `find_package` son ECM, Fcitx5Core, `Fcitx5Module COMPONENTS
Clipboard TestFrontend`, Gettext y PkgConfig, y su única dep externa es el motor. El `fcitx5-qt-dev`
de Alpine será de un subpaquete suyo. ⇒ **japonés = 1 receta nueva**, igual que el coreano.

Y el japonés es el más exigente de los tres grandes: no elige entre homófonos puntuales, convierte
frases enteras de kana a una mezcla de kanji y kana con diccionario y estadística.

**`anthy-unicode` y no el `anthy` clásico**, y esto también está medido: el original vive en
sourceforge.jp y **Alpine lo re-hospeda** porque el origen no es fiable — el mismo punto feo que
`noto-fonts-cjk`, que acá sí se puede evitar. `anthy-unicode` es el fork mantenido, **lo prefiere el
propio consumidor** (`CMakeLists:21` prueba `anthy-unicode` primero y sólo cae a `anthy`) y publica
tarballs de GitHub desde un tag, sin depender de que un tercero siga sirviendo el fichero.

**Meson y no autotools, y eso evita los dos problemas que `libhangul` me hizo pagar ayer:**
· `meson.build:109` instala `anthy-unicode.pc` él mismo — el camino de cmake de libhangul ignoraba
  su propia plantilla y hubo que sustituirla a mano en el `install`;
· los `.a` de meson son PIC por defecto (`b_staticpic`), y este `.a` se enlaza dentro del `.so` del
  addon. Se pone explícito igual: una receta nueva que va a entrar en un `.so` no debería depender
  de un default.

`-Demacs=disabled` porque compila ficheros `.el` que no hacen falta y emacs no está en el corpus —
su `value: 'auto'` lo saltaría, pero un `auto` que depende de qué hay en el sandbox es una fuente de
no-determinismo entre máquinas.

Las tres lecciones de ayer entran aplicadas, no re-pagadas: el guardián del addon busca por
**subcadena** (`*anthy*.so`) porque la convención es `lib<nombre>.so` y pedir el nombre exacto
rechazó un build bueno; el de `anthy-unicode` exige la `.a`, el `.pc` **y el DICCIONARIO** —
`libhangul` enseñó que un motor de idioma lleva datos con la ruta horneada, así que sin ellos sella
y no convierte nada; y `PKG_CONFIG_ARGN=--static` porque en este corpus pkg-config sólo entrega las
privadas en ese modo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

98edf488bbffd2dae507a6317a78bb61d5a9c07a · ruwaq Sergio · (2 p'unchaw ñawpaq) · tayta 82d78ddd4 · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

2 qillqakuna · +136 −0

diff --git a/recipes/anthy-unicode.toml b/recipes/anthy-unicode.toml
new file mode 100644
index 00000000..8cddd60b
--- /dev/null
+++ b/recipes/anthy-unicode.toml
@@ -0,0 +1,63 @@
+# anthy-unicode 1.0.0.20260213 — el motor de conversión kana→kanji para japonés.
+#
+# ══ PARA QUÉ ═══════════════════════════════════════════════════════════════════════════════════
+# El japonés se escribe tecleando la pronunciación en kana y eligiendo entre los kanji que suenan
+# igual. Eso es una conversión con diccionario y estadística, y es lo que hace esta biblioteca. Es
+# la única dep nueva que `fcitx5-anthy` necesita.
+#
+# ══ ⚠ POR QUÉ `anthy-unicode` Y NO EL `anthy` CLÁSICO ══════════════════════════════════════════
+# El `anthy` original vive en sourceforge.jp y **Alpine lo re-hospeda** porque el origen no es
+# fiable (`source="https://dev.alpinelinux.org/archive/anthy/anthy-9100h.tar.gz"`). Es el mismo
+# punto feo que `noto-fonts-cjk`, y acá se puede evitar: `anthy-unicode` es el fork mantenido
+# (fujiwarat), **lo prefiere el propio consumidor** —`fcitx5-anthy/CMakeLists:21` prueba
+# `anthy-unicode` primero y sólo cae a `anthy` si no está— y publica tarballs de GitHub a partir de
+# un tag, sin depender de que un tercero siga sirviendo el fichero.
+#
+# ══ MESON Y NO AUTOTOOLS, Y ESO EVITA LOS DOS PROBLEMAS DE `libhangul` ═════════════════════════
+# El tarball trae los dos caminos. Se usa meson por dos razones medidas sobre el árbol, no por
+# gusto:
+#
+#   1. **Genera el `.pc`.** `meson.build:109` instala `anthy-unicode.pc` en `libdir/pkgconfig`.
+#      `fcitx5-anthy` lo busca con `pkg_check_modules`, así que sin `.pc` no compila — y eso es
+#      exactamente lo que pasó con `libhangul`, cuyo camino de cmake ignora su propia plantilla y
+#      hubo que sustituirla a mano en el `install`.
+#   2. **Sus `.a` son PIC por defecto** (`b_staticpic` de meson vale `true`), y este `.a` se enlaza
+#      dentro de `libanthy.so`, el addon que el daemon carga con `dlopen`. Se pone explícito igual:
+#      la lección del 19-oct costó 7365 errores y una decisión de arquitectura, y una receta nueva
+#      que va a ser enlazada desde un `.so` no debería depender de un default.
+#
+# `-Demacs=disabled`: compila ficheros `.el` con emacs, que no está en el corpus y no hace falta
+# para convertir kana. Su `value: 'auto'` lo intentaría y lo saltaría, pero un `auto` que depende de
+# qué hay en el sandbox es una fuente de no-determinismo entre máquinas: se fija.
+name    = "anthy-unicode"
+version = "1.0.0.20260213"
+license = "LGPL-2.1-or-later"
+
+[source]
+tarball = "https://github.com/fujiwarat/anthy-unicode/archive/refs/tags/1.0.0.20260213/anthy-unicode-1.0.0.20260213.tar.gz"
+sha256  = "136469e2288658a80684b3f05a868b596a835c4adcf3de97ab657423c0132a55"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "static"
+flags    = []
+
+[build.phases]
+configure = "PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --default-library=static -Db_staticpic=true -Demacs=disabled --wrap-mode=nodownload"
+compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
+# Guardián: la `.a`, su `.pc` y el DICCIONARIO. Los tres, y el tercero es el que se olvida —
+# `libhangul` enseñó ayer que un motor de idioma lleva datos con la ruta HORNEADA en el binario, así
+# que un artefacto con la biblioteca y sin el diccionario sella con contenido y no convierte nada.
+install = '''
+set -e
+PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild
+[ -f /out/usr/lib/libanthy-unicode.a ] || [ -f /out/usr/lib/libanthy.a ] || { echo "anthy-unicode: no quedó la .a — NO sello" >&2; ls /out/usr/lib 2>/dev/null >&2; exit 1; }
+[ -f /out/usr/lib/pkgconfig/anthy-unicode.pc ] || { echo "anthy-unicode: falta anthy-unicode.pc — el consumidor lo busca con pkg_check_modules y no lo encontraría" >&2; exit 1; }
+n=$(find /out/usr/share/anthy-unicode /out/usr/share/anthy -type f 2>/dev/null | wc -l)
+[ "$n" -gt 0 ] || { echo "anthy-unicode: CERO ficheros de diccionario — la biblioteca cargaría y no convertiría nada" >&2; exit 1; }
+echo "anthy-unicode: .a + .pc + $n fichero(s) de diccionario"
+'''
+
+[deps]
+build = ["meson", "samurai", "python3", "pkgconf", "gettext-tiny"]
diff --git a/recipes/fcitx5-anthy.toml b/recipes/fcitx5-anthy.toml
new file mode 100644
index 00000000..3afdb1f4
--- /dev/null
+++ b/recipes/fcitx5-anthy.toml
@@ -0,0 +1,73 @@
+# fcitx5-anthy 5.1.11 — el SEGUNDO método de entrada. Con esto se escribe japonés.
+#
+# ══ QUÉ AÑADE ══════════════════════════════════════════════════════════════════════════════════
+# El 2026-10-20 entró el coreano (`fcitx5-hangul`) y con él la cadena completa quedó probada: marco
+# + motor + fuentes + los dos protocolos de Wayland. Esto es el segundo idioma por el mismo camino,
+# y el japonés es el caso MÁS exigente de los tres grandes: no elige entre candidatos homófonos
+# puntuales sino que convierte frases enteras de kana a una mezcla de kanji y kana, con diccionario
+# y estadística. Eso lo hace `anthy-unicode`; esto es el puente a fcitx5.
+#
+# ══ ⚠ ME CORRIJO: ESTO CUESTA UNA RECETA, NO DOS ═══════════════════════════════════════════════
+# En `fcitx5-hangul` escribí que el japonés costaba «2 — `anthy` + `fcitx5-qt`», y era FALSO. Lo
+# saqué de los `makedepends` de Alpine sin abrir el `CMakeLists.txt`, que es el mismo error que
+# cometí inventando una dep `fmt` para `fcitx5`.
+#
+# Medido: el `CMakeLists.txt` de fcitx5-anthy **no menciona Qt ni una vez**. Sus `find_package` son
+# `ECM`, `Fcitx5Core`, `Fcitx5Module COMPONENTS Clipboard TestFrontend`, `Gettext` y `PkgConfig`, y
+# su única dep externa es el motor (línea 21: prueba `anthy-unicode` y cae a `anthy`). El
+# `fcitx5-qt-dev` de Alpine será de algún subpaquete suyo; acá no hace falta. ⇒ japonés = 1 receta.
+#
+# `Fcitx5Module COMPONENTS Clipboard TestFrontend`: las dos las publica nuestro `fcitx5` —
+# `libclipboard.so` está entre sus 17 addons, y `TestFrontend` existe porque el 20-oct hubo que
+# poner `ENABLE_TESTING_ADDONS=On` (una perilla que parecía de test y publicaba interfaz).
+#
+# ⚠ `link = "dynamic"` obligatorio, como todo addon de fcitx5: es un `.so` que el daemon carga con
+# `dlopen` desde `/usr/lib/fcitx5/`. Por eso `anthy-unicode` se construye con `b_staticpic`.
+# `PKG_CONFIG_ARGN=--static` por lo de siempre en este corpus: pkg-config sólo entrega los
+# `Requires.private` en modo estático, y sin eso faltan los `-l` de las privadas.
+#
+# `ENABLE_TEST=Off`: su `option()` lo trae en On y el test suite no se corre acá.
+name    = "fcitx5-anthy"
+version = "5.1.11"
+license = "GPL-2.0-or-later"
+
+[source]
+tarball = "https://github.com/fcitx/fcitx5-anthy/archive/refs/tags/5.1.11/fcitx5-anthy-5.1.11.tar.gz"
+sha256  = "822aeb52b631cdd273735089dc775f8c1c5cbb5a4d74d47715aaf183d5bba48b"
+
+[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"
+# Guardián por SUBCADENA y no por nombre exacto: la convención de fcitx5 es `lib<nombre>.so`
+# —`libclassicui.so`, `libclipboard.so`— y pedir `anthy.so` daría un falso positivo que rechaza un
+# build bueno. Eso pasó ayer con `fcitx5-hangul` y costó una vuelta entera.
+install = '''
+set -e
+DESTDIR=/out cmake --install build
+so=$(find /out/usr/lib/fcitx5 -name '*anthy*.so' 2>/dev/null | head -1)
+[ -n "$so" ] || { echo "fcitx5-anthy: no hay ningún *anthy*.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/anthy.conf ] || { echo "fcitx5-anthy: falta share/fcitx5/addon/anthy.conf — sin él el daemon no sabe que el addon existe" >&2; exit 1; }
+echo "fcitx5-anthy: addon $(basename "$so") + anthy.conf"
+'''
+
+[deps]
+build = ["cmake", "samurai", "extra-cmake-modules", "pkgconf", "fcitx5", "anthy-unicode",
+         "gettext-tiny", "libxkbcommon", "wayland", "wayland-protocols", "glib", "pcre2",
+         "libffi", "expat", "zlib", "dbus"]