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…

chino: la distro escribe los TRES grandes, y sin tocar nada de GNOME

fcitx5-chinese-addons sella con 6 addons (pinyin, tabla, helper de trazos,
chttrans, puntuación, ancho completo), chttrans enlazado a libopencc de verdad y
chaizi.dict presente. Los 15 artefactos de la campaña verificados contra el
store CON CONTENIDO, no sólo por presencia (regla 3).

El último muro fue consecuencia directa de hacer libime estática, y es correcto:
en una biblioteca estática cmake no resuelve las deps, así que incluso las
PRIVATE quedan en la interfaz exportada como $<LINK_ONLY:…>, y los
*Targets.cmake nombran targets importados que el consumidor debe definir —

    The link interface of target "LibIME::kenlm" contains: PkgConfig::ZSTD
    but the target was not found.

libime nombra PkgConfig::ZSTD en cuatro targets y Boost::iostreams en tres; con
.so nada salía al exterior. Se parchea en el CONSUMIDOR a propósito: que una
estática pida su interfaz de enlace es su contrato, no un defecto.

DECLARADO en los 5 escritorios: fcitx5-chinese-addons, opencc, libime-lm,
libime-dict, libime-table, fcitx5-pinyin-stroke, fcitx5-pinyin-table. 189 MB.

⚠ libime NO se declara, y es medido: con BUILD_SHARED_LIBS=Off entra entera
dentro de los addons — comprobado con readelf que NINGÚN .so de los addons
declara libIME*. Declararla metería 159 MB por imagen para nada, y el 90 % de
eso es .debug_* (143 de 159 MB, sumado con readelf), que es la norma del corpus
y le toca al SDD 23.

⚠ Y la estimación vieja de targets.toml era FALSA por TERCERA vez con el mismo
defecto: decía «chino 6 (libime, libpinyin, opencc, fcitx5-lua, fcitx5-qt y
qt6-qtwebengine)» y que haría falta sacar Qt de incoming-kde al corpus. Medido
sobre los CMakeLists: cero Qt, cero libpinyin, cero fcitx5-lua, cero
qtwebengine. Qt sólo aparecía detrás de ENABLE_GUI y el navegador detrás de
ENABLE_BROWSER. El mismo error estaba ya anotado dos párrafos arriba para el
japonés — leer los makedepends de otra distro en vez del CMakeLists.

Queda afuera y se dice: sin ENABLE_GUI no hay ventana de configuración (es Qt y
no tenemos fcitx5-qt), así que elegir diccionarios se hace editando ficheros. Y
ENABLE_CLOUDPINYIN=Off es decisión y no falta de dep.

1bf4a9406841d3366879dabdadd0f0a6991ca839 · by Sergio · (1 d ago) · parent f9d6b4ca7 · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

2 files · +208 −0

diff --git a/docs/state/targets.toml b/docs/state/targets.toml
index 3a03d96f..1de0061f 100644
--- a/docs/state/targets.toml
+++ b/docs/state/targets.toml
@@ -546,6 +546,42 @@ paquetes = [
   # menciona Qt ni una vez. `anthy-unicode` viaja por su DICCIONARIO (4 ficheros), igual que
   # `libhangul` por el hanja: sin los datos el motor carga y no convierte nada.
   "fcitx5", "fcitx5-hangul", "libhangul", "fcitx5-anthy", "anthy-unicode",
+  # Y el CHINO (2026-10-20), que cierra los tres grandes. ⚠ **La estimación de la nota de arriba era
+  # FALSA, y es la TERCERA vez con el mismo defecto**: decía «chino 6 (`libime`, `libpinyin`,
+  # `opencc`, `fcitx5-lua`, `fcitx5-qt` y **qt6-qtwebengine**)» y que haría falta sacar Qt de
+  # `incoming-kde` al corpus. Medido sobre los `CMakeLists` y no sobre los `makedepends` de Alpine:
+  # **cero Qt, cero libpinyin, cero fcitx5-lua, cero qtwebengine.** Qt sólo aparecía detrás de
+  # `ENABLE_GUI`, que es la ventana de configuración y se apaga; el navegador embebido, detrás de
+  # `ENABLE_BROWSER`. Mismo error que ya está anotado dos párrafos arriba para el japonés.
+  #
+  # ⚠ **`libime` NO se declara acá, y eso es medido, no un olvido.** Se construye con
+  # `BUILD_SHARED_LIBS=Off` (por el segfault de las cuatro copias de libc++), así que entra ENTERA
+  # dentro de los addons: comprobado con `readelf -d` que **ningún** `.so` de
+  # `fcitx5-chinese-addons` declara `libIME*`. Declararla metería 159 MB en cada imagen para nada.
+  # Lo que sí viaja son sus DATOS, que el addon busca en ejecución.
+  #
+  #   `fcitx5-chinese-addons`  pinyin + tabla + helper de trazos + chttrans + puntuación +
+  #                            ancho completo. 6 addons
+  #   `opencc`                 simplificado ↔ tradicional. Viaja porque `libchttrans.so` enlaza
+  #                            `libopencc.so` de verdad (lo exige el guardián): sin él la mitad del
+  #                            chino escrito queda afuera, y no con un error sino en silencio
+  #   `libime-lm`              el modelo de lenguaje (`zh_CN.lm`, 35 MB). Sin esto el pinyin carga
+  #                            y **no ordena candidatos**
+  #   `libime-dict`            el diccionario de pinyin + la Extensión B de Unicode
+  #   `libime-table`           las 8 tablas (wubi, cangjie, erbi…): quien escribe por FORMA y no
+  #                            por pronunciación. Sin ellas el método por tabla existe y no carga nada
+  #   `fcitx5-pinyin-stroke`   buscar un carácter por sus TRAZOS — el caso de quien no sabe cómo se
+  #   `fcitx5-pinyin-table`    pronuncia, que es justo cuando un método por pinyin no sirve
+  #
+  # ⚠ PESO: 189 MB los siete. El gordo es el addon (105) y el modelo (35), y **el 90 % de libime es
+  # `.debug_*`** (143 de 159 MB, sumado con readelf) — la norma del corpus, cuyo sitio es el SDD 23.
+  #
+  # ⚠ QUEDA AFUERA Y SE DICE: `ENABLE_GUI=Off` ⇒ **no hay ventana de configuración** (es Qt y no
+  # tenemos `fcitx5-qt`), así que elegir diccionarios o disposición se hace editando ficheros. Y
+  # `ENABLE_CLOUDPINYIN=Off` es DECISIÓN y no falta de dep: manda lo que teclea el usuario a un
+  # servidor remoto.
+  "fcitx5-chinese-addons", "opencc", "libime-lm", "libime-dict", "libime-table",
+  "fcitx5-pinyin-stroke", "fcitx5-pinyin-table",
   # ── LA MÁQUINA HABLA (2026-10-20) ────────────────────────────────────────────────────────────
   # `censo-distro.py` marcaba «accesibilidad» **4 de 4 ausente**, y es el hueco que deja gente
   # afuera de verdad: sin voz, una distro no es incómoda para quien no ve — es INUSABLE. Y ninguna
@@ -707,6 +743,42 @@ paquetes = [
   # menciona Qt ni una vez. `anthy-unicode` viaja por su DICCIONARIO (4 ficheros), igual que
   # `libhangul` por el hanja: sin los datos el motor carga y no convierte nada.
   "fcitx5", "fcitx5-hangul", "libhangul", "fcitx5-anthy", "anthy-unicode",
+  # Y el CHINO (2026-10-20), que cierra los tres grandes. ⚠ **La estimación de la nota de arriba era
+  # FALSA, y es la TERCERA vez con el mismo defecto**: decía «chino 6 (`libime`, `libpinyin`,
+  # `opencc`, `fcitx5-lua`, `fcitx5-qt` y **qt6-qtwebengine**)» y que haría falta sacar Qt de
+  # `incoming-kde` al corpus. Medido sobre los `CMakeLists` y no sobre los `makedepends` de Alpine:
+  # **cero Qt, cero libpinyin, cero fcitx5-lua, cero qtwebengine.** Qt sólo aparecía detrás de
+  # `ENABLE_GUI`, que es la ventana de configuración y se apaga; el navegador embebido, detrás de
+  # `ENABLE_BROWSER`. Mismo error que ya está anotado dos párrafos arriba para el japonés.
+  #
+  # ⚠ **`libime` NO se declara acá, y eso es medido, no un olvido.** Se construye con
+  # `BUILD_SHARED_LIBS=Off` (por el segfault de las cuatro copias de libc++), así que entra ENTERA
+  # dentro de los addons: comprobado con `readelf -d` que **ningún** `.so` de
+  # `fcitx5-chinese-addons` declara `libIME*`. Declararla metería 159 MB en cada imagen para nada.
+  # Lo que sí viaja son sus DATOS, que el addon busca en ejecución.
+  #
+  #   `fcitx5-chinese-addons`  pinyin + tabla + helper de trazos + chttrans + puntuación +
+  #                            ancho completo. 6 addons
+  #   `opencc`                 simplificado ↔ tradicional. Viaja porque `libchttrans.so` enlaza
+  #                            `libopencc.so` de verdad (lo exige el guardián): sin él la mitad del
+  #                            chino escrito queda afuera, y no con un error sino en silencio
+  #   `libime-lm`              el modelo de lenguaje (`zh_CN.lm`, 35 MB). Sin esto el pinyin carga
+  #                            y **no ordena candidatos**
+  #   `libime-dict`            el diccionario de pinyin + la Extensión B de Unicode
+  #   `libime-table`           las 8 tablas (wubi, cangjie, erbi…): quien escribe por FORMA y no
+  #                            por pronunciación. Sin ellas el método por tabla existe y no carga nada
+  #   `fcitx5-pinyin-stroke`   buscar un carácter por sus TRAZOS — el caso de quien no sabe cómo se
+  #   `fcitx5-pinyin-table`    pronuncia, que es justo cuando un método por pinyin no sirve
+  #
+  # ⚠ PESO: 189 MB los siete. El gordo es el addon (105) y el modelo (35), y **el 90 % de libime es
+  # `.debug_*`** (143 de 159 MB, sumado con readelf) — la norma del corpus, cuyo sitio es el SDD 23.
+  #
+  # ⚠ QUEDA AFUERA Y SE DICE: `ENABLE_GUI=Off` ⇒ **no hay ventana de configuración** (es Qt y no
+  # tenemos `fcitx5-qt`), así que elegir diccionarios o disposición se hace editando ficheros. Y
+  # `ENABLE_CLOUDPINYIN=Off` es DECISIÓN y no falta de dep: manda lo que teclea el usuario a un
+  # servidor remoto.
+  "fcitx5-chinese-addons", "opencc", "libime-lm", "libime-dict", "libime-table",
+  "fcitx5-pinyin-stroke", "fcitx5-pinyin-table",
   # ── LA MÁQUINA HABLA (2026-10-20) ────────────────────────────────────────────────────────────
   # `censo-distro.py` marcaba «accesibilidad» **4 de 4 ausente**, y es el hueco que deja gente
   # afuera de verdad: sin voz, una distro no es incómoda para quien no ve — es INUSABLE. Y ninguna
@@ -1378,6 +1450,42 @@ paquetes = [
   # menciona Qt ni una vez. `anthy-unicode` viaja por su DICCIONARIO (4 ficheros), igual que
   # `libhangul` por el hanja: sin los datos el motor carga y no convierte nada.
   "fcitx5", "fcitx5-hangul", "libhangul", "fcitx5-anthy", "anthy-unicode",
+  # Y el CHINO (2026-10-20), que cierra los tres grandes. ⚠ **La estimación de la nota de arriba era
+  # FALSA, y es la TERCERA vez con el mismo defecto**: decía «chino 6 (`libime`, `libpinyin`,
+  # `opencc`, `fcitx5-lua`, `fcitx5-qt` y **qt6-qtwebengine**)» y que haría falta sacar Qt de
+  # `incoming-kde` al corpus. Medido sobre los `CMakeLists` y no sobre los `makedepends` de Alpine:
+  # **cero Qt, cero libpinyin, cero fcitx5-lua, cero qtwebengine.** Qt sólo aparecía detrás de
+  # `ENABLE_GUI`, que es la ventana de configuración y se apaga; el navegador embebido, detrás de
+  # `ENABLE_BROWSER`. Mismo error que ya está anotado dos párrafos arriba para el japonés.
+  #
+  # ⚠ **`libime` NO se declara acá, y eso es medido, no un olvido.** Se construye con
+  # `BUILD_SHARED_LIBS=Off` (por el segfault de las cuatro copias de libc++), así que entra ENTERA
+  # dentro de los addons: comprobado con `readelf -d` que **ningún** `.so` de
+  # `fcitx5-chinese-addons` declara `libIME*`. Declararla metería 159 MB en cada imagen para nada.
+  # Lo que sí viaja son sus DATOS, que el addon busca en ejecución.
+  #
+  #   `fcitx5-chinese-addons`  pinyin + tabla + helper de trazos + chttrans + puntuación +
+  #                            ancho completo. 6 addons
+  #   `opencc`                 simplificado ↔ tradicional. Viaja porque `libchttrans.so` enlaza
+  #                            `libopencc.so` de verdad (lo exige el guardián): sin él la mitad del
+  #                            chino escrito queda afuera, y no con un error sino en silencio
+  #   `libime-lm`              el modelo de lenguaje (`zh_CN.lm`, 35 MB). Sin esto el pinyin carga
+  #                            y **no ordena candidatos**
+  #   `libime-dict`            el diccionario de pinyin + la Extensión B de Unicode
+  #   `libime-table`           las 8 tablas (wubi, cangjie, erbi…): quien escribe por FORMA y no
+  #                            por pronunciación. Sin ellas el método por tabla existe y no carga nada
+  #   `fcitx5-pinyin-stroke`   buscar un carácter por sus TRAZOS — el caso de quien no sabe cómo se
+  #   `fcitx5-pinyin-table`    pronuncia, que es justo cuando un método por pinyin no sirve
+  #
+  # ⚠ PESO: 189 MB los siete. El gordo es el addon (105) y el modelo (35), y **el 90 % de libime es
+  # `.debug_*`** (143 de 159 MB, sumado con readelf) — la norma del corpus, cuyo sitio es el SDD 23.
+  #
+  # ⚠ QUEDA AFUERA Y SE DICE: `ENABLE_GUI=Off` ⇒ **no hay ventana de configuración** (es Qt y no
+  # tenemos `fcitx5-qt`), así que elegir diccionarios o disposición se hace editando ficheros. Y
+  # `ENABLE_CLOUDPINYIN=Off` es DECISIÓN y no falta de dep: manda lo que teclea el usuario a un
+  # servidor remoto.
+  "fcitx5-chinese-addons", "opencc", "libime-lm", "libime-dict", "libime-table",
+  "fcitx5-pinyin-stroke", "fcitx5-pinyin-table",
   # ── LA MÁQUINA HABLA (2026-10-20) ────────────────────────────────────────────────────────────
   # `censo-distro.py` marcaba «accesibilidad» **4 de 4 ausente**, y es el hueco que deja gente
   # afuera de verdad: sin voz, una distro no es incómoda para quien no ve — es INUSABLE. Y ninguna
@@ -1689,6 +1797,42 @@ paquetes = [
   # menciona Qt ni una vez. `anthy-unicode` viaja por su DICCIONARIO (4 ficheros), igual que
   # `libhangul` por el hanja: sin los datos el motor carga y no convierte nada.
   "fcitx5", "fcitx5-hangul", "libhangul", "fcitx5-anthy", "anthy-unicode",
+  # Y el CHINO (2026-10-20), que cierra los tres grandes. ⚠ **La estimación de la nota de arriba era
+  # FALSA, y es la TERCERA vez con el mismo defecto**: decía «chino 6 (`libime`, `libpinyin`,
+  # `opencc`, `fcitx5-lua`, `fcitx5-qt` y **qt6-qtwebengine**)» y que haría falta sacar Qt de
+  # `incoming-kde` al corpus. Medido sobre los `CMakeLists` y no sobre los `makedepends` de Alpine:
+  # **cero Qt, cero libpinyin, cero fcitx5-lua, cero qtwebengine.** Qt sólo aparecía detrás de
+  # `ENABLE_GUI`, que es la ventana de configuración y se apaga; el navegador embebido, detrás de
+  # `ENABLE_BROWSER`. Mismo error que ya está anotado dos párrafos arriba para el japonés.
+  #
+  # ⚠ **`libime` NO se declara acá, y eso es medido, no un olvido.** Se construye con
+  # `BUILD_SHARED_LIBS=Off` (por el segfault de las cuatro copias de libc++), así que entra ENTERA
+  # dentro de los addons: comprobado con `readelf -d` que **ningún** `.so` de
+  # `fcitx5-chinese-addons` declara `libIME*`. Declararla metería 159 MB en cada imagen para nada.
+  # Lo que sí viaja son sus DATOS, que el addon busca en ejecución.
+  #
+  #   `fcitx5-chinese-addons`  pinyin + tabla + helper de trazos + chttrans + puntuación +
+  #                            ancho completo. 6 addons
+  #   `opencc`                 simplificado ↔ tradicional. Viaja porque `libchttrans.so` enlaza
+  #                            `libopencc.so` de verdad (lo exige el guardián): sin él la mitad del
+  #                            chino escrito queda afuera, y no con un error sino en silencio
+  #   `libime-lm`              el modelo de lenguaje (`zh_CN.lm`, 35 MB). Sin esto el pinyin carga
+  #                            y **no ordena candidatos**
+  #   `libime-dict`            el diccionario de pinyin + la Extensión B de Unicode
+  #   `libime-table`           las 8 tablas (wubi, cangjie, erbi…): quien escribe por FORMA y no
+  #                            por pronunciación. Sin ellas el método por tabla existe y no carga nada
+  #   `fcitx5-pinyin-stroke`   buscar un carácter por sus TRAZOS — el caso de quien no sabe cómo se
+  #   `fcitx5-pinyin-table`    pronuncia, que es justo cuando un método por pinyin no sirve
+  #
+  # ⚠ PESO: 189 MB los siete. El gordo es el addon (105) y el modelo (35), y **el 90 % de libime es
+  # `.debug_*`** (143 de 159 MB, sumado con readelf) — la norma del corpus, cuyo sitio es el SDD 23.
+  #
+  # ⚠ QUEDA AFUERA Y SE DICE: `ENABLE_GUI=Off` ⇒ **no hay ventana de configuración** (es Qt y no
+  # tenemos `fcitx5-qt`), así que elegir diccionarios o disposición se hace editando ficheros. Y
+  # `ENABLE_CLOUDPINYIN=Off` es DECISIÓN y no falta de dep: manda lo que teclea el usuario a un
+  # servidor remoto.
+  "fcitx5-chinese-addons", "opencc", "libime-lm", "libime-dict", "libime-table",
+  "fcitx5-pinyin-stroke", "fcitx5-pinyin-table",
   # ── LA MÁQUINA HABLA (2026-10-20) ────────────────────────────────────────────────────────────
   # `censo-distro.py` marcaba «accesibilidad» **4 de 4 ausente**, y es el hueco que deja gente
   # afuera de verdad: sin voz, una distro no es incómoda para quien no ve — es INUSABLE. Y ninguna
@@ -2019,6 +2163,42 @@ paquetes = [
   # menciona Qt ni una vez. `anthy-unicode` viaja por su DICCIONARIO (4 ficheros), igual que
   # `libhangul` por el hanja: sin los datos el motor carga y no convierte nada.
   "fcitx5", "fcitx5-hangul", "libhangul", "fcitx5-anthy", "anthy-unicode",
+  # Y el CHINO (2026-10-20), que cierra los tres grandes. ⚠ **La estimación de la nota de arriba era
+  # FALSA, y es la TERCERA vez con el mismo defecto**: decía «chino 6 (`libime`, `libpinyin`,
+  # `opencc`, `fcitx5-lua`, `fcitx5-qt` y **qt6-qtwebengine**)» y que haría falta sacar Qt de
+  # `incoming-kde` al corpus. Medido sobre los `CMakeLists` y no sobre los `makedepends` de Alpine:
+  # **cero Qt, cero libpinyin, cero fcitx5-lua, cero qtwebengine.** Qt sólo aparecía detrás de
+  # `ENABLE_GUI`, que es la ventana de configuración y se apaga; el navegador embebido, detrás de
+  # `ENABLE_BROWSER`. Mismo error que ya está anotado dos párrafos arriba para el japonés.
+  #
+  # ⚠ **`libime` NO se declara acá, y eso es medido, no un olvido.** Se construye con
+  # `BUILD_SHARED_LIBS=Off` (por el segfault de las cuatro copias de libc++), así que entra ENTERA
+  # dentro de los addons: comprobado con `readelf -d` que **ningún** `.so` de
+  # `fcitx5-chinese-addons` declara `libIME*`. Declararla metería 159 MB en cada imagen para nada.
+  # Lo que sí viaja son sus DATOS, que el addon busca en ejecución.
+  #
+  #   `fcitx5-chinese-addons`  pinyin + tabla + helper de trazos + chttrans + puntuación +
+  #                            ancho completo. 6 addons
+  #   `opencc`                 simplificado ↔ tradicional. Viaja porque `libchttrans.so` enlaza
+  #                            `libopencc.so` de verdad (lo exige el guardián): sin él la mitad del
+  #                            chino escrito queda afuera, y no con un error sino en silencio
+  #   `libime-lm`              el modelo de lenguaje (`zh_CN.lm`, 35 MB). Sin esto el pinyin carga
+  #                            y **no ordena candidatos**
+  #   `libime-dict`            el diccionario de pinyin + la Extensión B de Unicode
+  #   `libime-table`           las 8 tablas (wubi, cangjie, erbi…): quien escribe por FORMA y no
+  #                            por pronunciación. Sin ellas el método por tabla existe y no carga nada
+  #   `fcitx5-pinyin-stroke`   buscar un carácter por sus TRAZOS — el caso de quien no sabe cómo se
+  #   `fcitx5-pinyin-table`    pronuncia, que es justo cuando un método por pinyin no sirve
+  #
+  # ⚠ PESO: 189 MB los siete. El gordo es el addon (105) y el modelo (35), y **el 90 % de libime es
+  # `.debug_*`** (143 de 159 MB, sumado con readelf) — la norma del corpus, cuyo sitio es el SDD 23.
+  #
+  # ⚠ QUEDA AFUERA Y SE DICE: `ENABLE_GUI=Off` ⇒ **no hay ventana de configuración** (es Qt y no
+  # tenemos `fcitx5-qt`), así que elegir diccionarios o disposición se hace editando ficheros. Y
+  # `ENABLE_CLOUDPINYIN=Off` es DECISIÓN y no falta de dep: manda lo que teclea el usuario a un
+  # servidor remoto.
+  "fcitx5-chinese-addons", "opencc", "libime-lm", "libime-dict", "libime-table",
+  "fcitx5-pinyin-stroke", "fcitx5-pinyin-table",
   # ── LA MÁQUINA HABLA (2026-10-20) ────────────────────────────────────────────────────────────
   # `censo-distro.py` marcaba «accesibilidad» **4 de 4 ausente**, y es el hueco que deja gente
   # afuera de verdad: sin voz, una distro no es incómoda para quien no ve — es INUSABLE. Y ninguna
diff --git a/recipes/fcitx5-chinese-addons.toml b/recipes/fcitx5-chinese-addons.toml
index 2124f600..5798a5fb 100644
--- a/recipes/fcitx5-chinese-addons.toml
+++ b/recipes/fcitx5-chinese-addons.toml
@@ -115,6 +115,34 @@ PYEOF
 grep -qE 'fcitx5_download|fcitx5_extract|download\.fcitx-im\.org' "$PH" && { echo "fcitx5-chinese-addons: $PH todavía referencia la red tras el parche" >&2; grep -nE 'fcitx5_download|fcitx5_extract|download' "$PH" >&2; exit 1; }
 echo "fcitx5-chinese-addons: pinyinhelper sin descargas"
 
+# ⚠ **PARCHE 2: una libime ESTÁTICA exige que el consumidor provea su interfaz de enlace.**
+# `recipes/libime.toml` construye con `BUILD_SHARED_LIBS=Off` (por el segfault de las cuatro copias
+# de libc++; la nota larga está allá). Consecuencia directa: en una biblioteca estática cmake NO
+# resuelve las deps, así que **incluso las `PRIVATE` quedan en la interfaz exportada** como
+# `$<LINK_ONLY:…>` — y los `*Targets.cmake` instalados nombran targets importados que ESTA receta
+# tiene que definir antes de buscarlos:
+#
+#     CMake Error at /usr/lib/cmake/LibIMECore/LibIMECoreTargets.cmake:70 (set_target_properties):
+#       The link interface of target "LibIME::kenlm" contains: PkgConfig::ZSTD
+#       but the target was not found.
+#
+# libime nombra `PkgConfig::ZSTD` en cuatro targets (`kenlm`, `IMECore`, `IMEPinyin`, `IMETable`) y
+# `Boost::iostreams` en tres. Con `.so` nada de eso salía al exterior; con `.a` sí.
+#
+# ⇒ Se parchea ACÁ y no en libime a propósito: que una estática pida su interfaz es correcto, no un
+# defecto. Lo que faltaba es que el consumidor la declare. Dos cambios, cada uno comprobado:
+#   · `pkg_check_modules(ZSTD … IMPORTED_TARGET libzstd)` ANTES del `find_package(LibIMEPinyin…)`
+#   · el `find_package(Boost …)` ya existente pasa a pedir el componente `iostreams`
+CA=CMakeLists.txt
+grep -q 'find_package(LibIMEPinyin' "$CA" || { echo "fcitx5-chinese-addons: no encuentro find_package(LibIMEPinyin …) donde insertar el target de zstd" >&2; exit 1; }
+sed -i 's|^find_package(LibIMEPinyin|pkg_check_modules(ZSTD REQUIRED IMPORTED_TARGET "libzstd")\nfind_package(LibIMEPinyin|' "$CA"
+grep -q 'pkg_check_modules(ZSTD REQUIRED IMPORTED_TARGET' "$CA" || { echo "fcitx5-chinese-addons: el parche del target PkgConfig::ZSTD no se aplicó" >&2; exit 1; }
+
+grep -q 'find_package(Boost 1.61 OPTIONAL_COMPONENTS json)' "$CA" || { echo "fcitx5-chinese-addons: el find_package(Boost …) no tiene la forma esperada; REVISAR" >&2; grep -n 'find_package(Boost' "$CA" >&2; exit 1; }
+sed -i 's|find_package(Boost 1.61 OPTIONAL_COMPONENTS json)|find_package(Boost 1.61 REQUIRED CONFIG COMPONENTS iostreams OPTIONAL_COMPONENTS json)|' "$CA"
+grep -q 'COMPONENTS iostreams' "$CA" || { echo "fcitx5-chinese-addons: el parche del componente iostreams no se aplicó" >&2; exit 1; }
+echo "fcitx5-chinese-addons: interfaz de enlace de la libime estática declarada (zstd + boost iostreams)"
+
 rm -rf build
 cmake -B build -G Ninja -Wno-dev \
   -DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" \