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 1572Shell 203Rust 109Markdown 993728 Definiciones

⎇ main recipes/libime-dict.toml TOML · 79 líneas · 4.1 KB Historia crudo

libime: estática y PIC, porque había CUATRO libc++ en un proceso bd9c765e1 · Sergio ·

1# libime-dict — el DICCIONARIO de pinyin. Es lo que convierte la pronunciación en caracteres.
2#
3# Hermana de `libime-lm`: el `data/CMakeLists.txt` de libime baja tres tarballs en tiempo de build y
4# el sandbox de takana no tiene red, así que los datos salen a recetas con su sha pineado. El
5# `[source]` admite una sola fuente ⇒ un tarball, una receta. La nota larga está en `libime-lm.toml`.
6#
7# ══ QUÉ TRAE Y QUÉ SALE ════════════════════════════════════════════════════════════════════════
8# El tarball deja DOS ficheros de texto en la raíz, y los dos se compilan con la misma herramienta:
9#
10#     dict_sc.txt    → sc.dict     el diccionario del chino simplificado, el que se usa a diario
11#     dict_extb.txt  → extb.dict   la Extensión B de Unicode: caracteres raros e históricos
12#
13#     libime_pinyindict <entrada.txt> <salida.dict>
14#
15# Los dos se instalan, que es lo que hace upstream: `extb.dict` es opcional en el uso y el motor lo
16# carga sólo si hace falta, pero dejarlo afuera significa que un carácter poco común simplemente no
17# aparece entre los candidatos — un fallo silencioso y rarísimo de diagnosticar.
18#
19# `LIBIME_INSTALL_PKGDATADIR` = `${CMAKE_INSTALL_FULL_DATADIR}/libime` ⇒ `/usr/share/libime/`, y acá
20# **no se renombran** (a diferencia del modelo de lenguaje, que viaja como `zh_CN.lm`): el motor los
21# busca por estos nombres exactos.
22name    = "libime-dict"
23version = "20260907"
24license = "LGPL-2.1-or-later"
25
26[source]
27tarball = "https://download.fcitx-im.org/data/dict-20260907.tar.zst"
28sha256  = "fb75a179065e690dfc4559ce1807cbaf4fbe4f0111a5005615be9f435e6b9d76"
29# Los dos `.txt` están en la raíz del tarball (comprobado con `tar -tf`), sin directorio contenedor.
30strip_components = 0
31
32[build]
33compiler = "zig-cc"
34target   = "x86_64-linux-musl"
35link     = "static"
36flags    = []
37
38[build.phases]
39configure = '''
40set -e
41for f in dict_sc.txt dict_extb.txt; do
42  [ -f "$f" ] || { echo "libime-dict: el tarball no dejó $f en la raíz — ¿cambió strip_components?" >&2; ls -la >&2; exit 1; }
43done
44echo "libime-dict: dict_sc.txt $(stat -c%s dict_sc.txt) B · dict_extb.txt $(stat -c%s dict_extb.txt) B"
45'''
46compile = '''
47set -e
48libime_pinyindict dict_sc.txt   sc.dict
49libime_pinyindict dict_extb.txt extb.dict
50'''
51# Guardián con piso de tamaño, por lo de siempre: un `.dict` de cero bytes se sella igual y deja al
52# motor cargando un diccionario sin palabras — teclearías pinyin y no saldría ningún candidato.
53install = '''
54set -e
55mkdir -p /out/usr/share/libime
56cp sc.dict extb.dict /out/usr/share/libime/
57for f in sc.dict extb.dict; do
58  t=/out/usr/share/libime/$f
59  [ -s "$t" ] || { echo "libime-dict: $f quedó vacío o ausente — NO sello" >&2; exit 1; }
60  n=$(stat -c%s "$t")
61  [ "$n" -gt 102400 ] || { echo "libime-dict: $f son sólo $n bytes — esperaba >100 KiB; no se escribió" >&2; exit 1; }
62done
63echo "libime-dict: sc.dict $(stat -c%s /out/usr/share/libime/sc.dict) B + extb.dict $(stat -c%s /out/usr/share/libime/extb.dict) B"
64'''
65
66[deps]
67# ⚠ **`fcitx5` y `zstd` NO son opcionales acá, y el fallo NO dice que falten.** Las herramientas de
68# libime son binarios DINÁMICOS: `libime_pinyindict` declara
69# `NEEDED libIMEPinyin.so.0 libIMECore.so.0 libFcitx5Utils.so.2`. El sandbox sólo monta lo
70# declarado, así que con `libime` a secas el cargador no encuentra `libFcitx5Utils.so.2` y la fase
71# muere con **`exit 127`** — que se lee como «no existe el ejecutable» y es «no existe una de sus
72# bibliotecas». Cuesta un rato porque el ejecutable SÍ está.
73#
74# La lista no se adivinó: se recorrió el `NEEDED` recursivamente desde los tres binarios contra los
75# artefactos del store. Clausura completa = `libime` + `fcitx5` + `zstd`, cero sonames huérfanos.
76# Es la misma figura que la cadena de tres saltos de `espeak-ng`, con una diferencia: allá el `.a`
77# del medio CORTABA la propagación; acá todo es `.so` y propaga, pero **declarar sigue siendo
78# manual** porque el sandbox es hermético a propósito.
79build = ["libime", "fcitx5", "zstd"]