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 604Rust 56Shell 36Markdown 281227 Definiciones

receta: el PRIMER método de entrada — con esto se escribe coreano

Las fuentes Noto del 19-oct hicieron que la distro LEA chino, japonés, coreano, árabe e hindi. Leer
no es escribir: un teclado tiene cien teclas y esos sistemas no se teclean uno-a-uno. `fcitx5` (el
marco) selló ayer y **no se declaró en ningún perfil a propósito** — un marco sin motor es una barra
de candidatos que no convierte nada, la figura de `crun` sin podman. Esto es el motor.

**Por qué el coreano primero, y no es preferencia.** Deps nuevas que hay que autorar por motor,
medido contra el catálogo:

    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 son campañas con su propio
presupuesto, y el chino además necesita que Qt salga de `incoming-kde` al corpus.

**Y las dos lecciones de ayer entran aplicadas, no re-pagadas:**

· `libhangul` nace con `CMAKE_POSITION_INDEPENDENT_CODE=ON`. Es dep de un ADDON —un `.so` que el
  daemon carga con `dlopen`— y un `.a` sin PIC no entra en un `.so`. Ayer eso costó 7365 errores y
  una decisión de arquitectura con 40 recetas de cascada; acá cuesta una línea. PIC y estático no
  son excluyentes: PIC cambia cómo se direccionan los globales, no dónde vive el código.
· Las dos llevan `rm -rf build` (el árbol de fuentes se reusa y un `CMakeCache.txt` viejo envenena
  los reintentos) y `fcitx5-hangul` lleva `PKG_CONFIG_ARGN=--static` (en un corpus estático
  pkg-config sólo entrega las privadas en ese modo).

Verificado ANTES de gastar un build, que es lo que me faltó cinco veces ayer:
· los hashes cargan — y de paso el validador cazó que había metido `fmt` en las deps, que no existe
  en el catálogo. Lo había inventado ayer también.
· el cierre de `.pc` con el chequeo FUERTE (`PKG_CONFIG_LIBDIR` + `--cflags --libs`, que es lo que
  pregunta el que falla): `Fcitx5Core`, `Fcitx5Utils`, `xkbcommon`, `wayland-client`, `glib-2.0`,
  `gio-2.0` y `dbus-1` resuelven los siete.
· y los `.cmake` que `find_package` busca de verdad están en el artefacto de fcitx5
  (`Fcitx5CoreConfig.cmake`, `Fcitx5ConfigConfig.cmake`, los módulos Wayland/Spell/Unicode).

⚠ Sin `fcitx5-qt`: upstream lo usa para la UI de CONFIGURACIÓN (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.

Guardianes en los dos `install`: `libhangul` exige su `.a` Y su `.pc` (sin el `.pc` el consumidor no
la encuentra); `fcitx5-hangul` exige el `hangul.so` Y su `hangul.conf` en `share/fcitx5/addon/` —
sin el `.conf` el daemon no sabe que el addon existe y no lo carga nunca, o sea sellaría con
contenido, reproducible e inerte.

Sin construir todavía: se publican primero para que el clon que siembra al worker no muela recetas
que no están en ningún commit.

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

bcb84e31f016b174ce3731e0616a13e9c1f83726 · por Sergio · (hace 2 d) · padre 3c1374fbf · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

2 archivos · +159 −0

diff --git a/recipes/fcitx5-hangul.toml b/recipes/fcitx5-hangul.toml
new file mode 100644
index 00000000..86b96701
--- /dev/null
+++ b/recipes/fcitx5-hangul.toml
@@ -0,0 +1,85 @@
+# 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
+# exactamente lo que la regla 3 persigue.
+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 quedó el addon hangul.so — NO sello un motor que el daemon no puede cargar" >&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 $so + su .conf · $(ls /out/usr/share/fcitx5/inputmethod/*.conf 2>/dev/null | wc -l) método(s) de entrada declarado(s)"
+'''
+
+[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"]
diff --git a/recipes/libhangul.toml b/recipes/libhangul.toml
new file mode 100644
index 00000000..2340e438
--- /dev/null
+++ b/recipes/libhangul.toml
@@ -0,0 +1,74 @@
+# libhangul 0.2.0 — la biblioteca que convierte pulsaciones en sílabas coreanas.
+#
+# ══ PARA QUÉ ═══════════════════════════════════════════════════════════════════════════════════
+# El hangul se escribe componiendo: cada sílaba se arma con una inicial, una vocal y a veces una
+# final, y el teclado manda las piezas por separado. Esto hace esa composición (y la conversión
+# hanja→hangul). Es la única dep nueva que `fcitx5-hangul` necesita — medido contra el catálogo
+# el 2026-10-20, y la razón por la que el coreano es el primer motor de IME que entra: el chino
+# arrastra seis recetas más (`libime`, `libpinyin`, `opencc`, `fcitx5-lua`, `fcitx5-qt`) y
+# **qt6-qtwebengine**, y el japonés arrastra `anthy` más Qt.
+#
+# ══ CMAKE Y NO AUTOTOOLS, AUNQUE TRAE LOS DOS ══════════════════════════════════════════════════
+# El tarball trae `CMakeLists.txt` Y `autogen.sh`+`configure.ac`. Se usa cmake porque es lo que usa
+# su consumidor (`fcitx5-hangul`) y porque el camino autotools de este proyecto exige regenerar con
+# `autogen.sh`, que mete autoconf/automake/libtool en la cadena para nada.
+#
+# ══ ⚠ PIC DESDE EL PRIMER DÍA, Y ESO ES LA LECCIÓN DE AYER APLICADA ════════════════════════════
+# `fcitx5-hangul` es un ADDON: un `.so` que el daemon carga con `dlopen`. Un `.a` sin PIC no entra
+# en un `.so`, y el corpus se construye estático-primero — así que una receta nueva que va a ser
+# enlazada desde un `.so` tiene que nacer PIC o cuesta un viaje de diagnóstico.
+#
+# Eso se pagó ayer: `libpng`, `freetype` y `fontconfig` publicaban su `.a` sin PIC y `fcitx5` murió
+# con **7365** errores `relocation … recompile with -fPIC`; arreglarlo fue una decisión de
+# arquitectura con 40 recetas de cascada y las cinco imágenes de escritorio rearmando. Poner
+# `CMAKE_POSITION_INDEPENDENT_CODE=ON` acá cuesta una línea.
+#
+# `BUILD_SHARED_LIBS=OFF` mantiene la convención del corpus (estático) — PIC y estático no son
+# excluyentes: lo que PIC cambia es cómo se direccionan los globales, no dónde vive el código.
+#
+# Las herramientas y los tests quedan fuera: el consumidor usa la biblioteca, no el `hangul`
+# interactivo de línea de comandos.
+name    = "libhangul"
+version = "0.2.0"
+license = "LGPL-2.1-or-later"
+
+[source]
+tarball = "https://github.com/libhangul/libhangul/archive/refs/tags/libhangul-0.2.0/libhangul-0.2.0.tar.gz"
+sha256  = "db9a256ff1e2c639ea8168f5e8741dae95ad7ea563f257b1dbd098afd8e48487"
+
+[build]
+compiler = "zig-cc"
+target   = "x86_64-linux-musl"
+link     = "static"
+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`: el árbol de fuentes se REUSA entre builds, así que un `build/` de un intento
+# anterior sobrevive con su `CMakeCache.txt` y los resultados cacheados de `pkg_check_modules`
+# — un primer fallo envenenaría todos los reintentos. Medido ayer con fcitx5: el build volvía a
+# morir con el MISMO error en 2 segundos. Toda receta cmake necesita esto.
+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 \
+  -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_SHARED_LIBS=OFF \
+  -DENABLE_EXTERNAL_KEYBOARDS=OFF -DENABLE_UNIT_TEST=OFF
+'''
+compile = "cmake --build build"
+# Guardián de presencia (regla 3): sin la `.a` y sin su `.pc`, el consumidor no la encuentra y el
+# artefacto sellaría con contenido y sin función.
+install = '''
+set -e
+DESTDIR=/out cmake --install build
+[ -f /out/usr/lib/libhangul.a ] || { echo "libhangul: no quedó la .a — NO sello" >&2; exit 1; }
+[ -f /out/usr/lib/pkgconfig/libhangul.pc ] || { echo "libhangul: falta libhangul.pc — el consumidor no la va a encontrar" >&2; exit 1; }
+echo "libhangul: $(ls /out/usr/include/hangul*.h 2>/dev/null | wc -l) cabecera(s) + .a + .pc"
+'''
+
+[deps]
+build = ["cmake", "samurai", "pkgconf", "gettext-tiny", "expat"]