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…
promoción + receta: boost al corpus con iostreams, y libime — el chino tiene camino
1# libime 1.1.17 — el motor de conversión pinyin→hanzi. La pieza que faltaba para escribir chino.
2#
3# ══ QUÉ ES ═════════════════════════════════════════════════════════════════════════════════════
4# El chino se escribe tecleando la pronunciación en pinyin y eligiendo entre los caracteres que
5# suenan igual. Con decenas de miles de hanzi eso no es una tabla: es un modelo de lenguaje que
6# ordena los candidatos por probabilidad en contexto. libime es ese motor (un kenlm recortado más
7# los índices de pinyin y de tabla), y `fcitx5-chinese-addons` es su cara.
8#
9# ══ ⚠ `ENABLE_DATA=Off`, Y NO ES UN RECORTE: ES QUE LOS DATOS SE DESCARGAN ═════════════════════
10# `data/CMakeLists.txt` hace **dos descargas en tiempo de build** desde el servidor de fcitx:
11# lm_sc.arpa-20260629.tar.zst 75 MB → el modelo de lenguaje
12# dict-20260907.tar.zst → el diccionario de pinyin
13# y el sandbox de takana no tiene red, a propósito: una fuente que se baja al construir no es
14# reproducible ni auditable. ⇒ los datos salen a **recetas hermanas** (`libime-lm`,
15# `libime-dict`) con su tarball pineado por sha256, que es el modelo del repo — y upstream hasta
16# nos da los sha en ese mismo CMakeLists, así que no hay que confiar en nadie para pinearlos.
17#
18# ⚠ **Por eso `ENABLE_TOOLS=On` es obligatorio acá y no adorno.** Las recetas de datos necesitan
19# los ejecutables de ESTA para convertir el `.arpa` y el `.txt` en los binarios que el motor lee:
20# `libime_slm_build_binary` (el modelo), `libime_prediction` y `libime_pinyindict`. Si esta receta
21# se construyera sin herramientas, las otras dos no tendrían con qué trabajar.
22#
23# ⇒ Y hasta que esas dos existan, **libime NO se declara en ningún perfil**: un motor de conversión
24# sin modelo de lenguaje carga y no convierte nada. Es la figura de `crun` sin podman, la misma por
25# la que `fcitx5` esperó un día a tener un motor.
26#
27# ══ LO QUE PIDE, MEDIDO EN SU CMakeLists ═══════════════════════════════════════════════════════
28# ECM · PkgConfig · libzstd · Fcitx5Utils · **Boost 1.61 COMPONENTS iostreams**
29# El último obligó a cambiar `boost`, que en este corpus era headers-only desde hacía un año: ahora
30# compila `libboost_iostreams.a` y está promovido al corpus (radio 1 verificado, `kactivitymanagerd`
31# con el hash intacto).
32#
33# `BUILD_SHARED_LIBS` se deja en On (su default): `fcitx5-chinese-addons` es un addon `.so` y
34# enlazarlo contra una libime estática no-PIC sería el muro del 19-oct otra vez.
35name = "libime"
36version = "1.1.17"
37license = "LGPL-2.1-or-later"
38
39[source]
40tarball = "https://github.com/fcitx/libime/archive/refs/tags/1.1.17/libime-1.1.17.tar.gz"
41sha256 = "6af056717edf99be8d4b83717de01b6404398d2fc47a301b609ca7d31331cafb"
42
43[build]
44compiler = "zig-cc"
45target = "x86_64-linux-musl"
46link = "dynamic"
47flags = []
48
49[build.phases]
50configure = '''
51ZW="$PWD/.zwrap"; mkdir -p "$ZW"
52# El envoltorio reescribe `--target`: es el patrón canónico del repo (30 recetas lo traen) y sin él
53# zig rechaza los triples que algunos builds inventan («UnknownOperatingSystem»).
54printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64-linux-musl ;; esac' 'set -- "$@" "$a"' 'shift' 'done' 'exec /opt/zig/zig cc -mcpu=baseline "$@"' > "$ZW/cc"
55printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64-linux-musl ;; esac' 'set -- "$@" "$a"' 'shift' 'done' 'exec /opt/zig/zig c++ -mcpu=baseline "$@"' > "$ZW/cxx"
56chmod +x "$ZW/cc" "$ZW/cxx"
57rm -rf build
58cmake -B build -G Ninja -Wno-dev \
59 -DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" \
60 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
61 -DPKG_CONFIG_ARGN=--static \
62 -DENABLE_DATA=Off -DENABLE_TOOLS=On -DENABLE_TEST=Off -DENABLE_DOC=Off
63'''
64compile = "cmake --build build"
65# El guardián pide las DOS cosas por las que esta receta existe: las bibliotecas y las TRES
66# herramientas. Sin las herramientas, `libime-lm` y `libime-dict` no pueden construirse — y eso se
67# descubriría dos recetas más tarde, con el artefacto ya sellado y pareciendo correcto.
68install = '''
69set -e
70DESTDIR=/out cmake --install build
71n=$(find /out/usr/lib -name 'libIME*.so*' 2>/dev/null | wc -l)
72[ "$n" -gt 0 ] || { echo "libime: no quedó ninguna libIME*.so — NO sello" >&2; ls -R /out/usr/lib 2>/dev/null | head -20 >&2; exit 1; }
73falta=""
74for t in libime_slm_build_binary libime_prediction libime_pinyindict; do
75 [ -x "/out/usr/bin/$t" ] || falta="$falta $t"
76done
77if [ -n "$falta" ]; then
78 echo "libime: faltan herramientas:$falta — sin ellas las recetas de datos no pueden construirse" >&2
79 ls /out/usr/bin 2>/dev/null >&2
80 exit 1
81fi
82echo "libime: $n biblioteca(s) + las 3 herramientas de datos"
83'''
84
85[deps]
86build = ["cmake", "samurai", "extra-cmake-modules", "pkgconf", "fcitx5", "boost", "zstd",
87 "gettext-tiny", "glib", "pcre2", "libffi", "expat", "zlib", "dbus"]