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

⎇ 8b1673d689b25a7854e74067da850d4a8f8a09ea recipes/libhangul.toml TOML · 103 líneas · 6.2 KB Historia crudo

fix(libhangul): el `.pc` lo genera autotools y el consumidor lo EXIGE — se sustituye su plantilla 52705cbcf · Sergio ·

1# libhangul 0.2.0 — la biblioteca que convierte pulsaciones en sílabas coreanas.
2#
3# ══ PARA QUÉ ═══════════════════════════════════════════════════════════════════════════════════
4# El hangul se escribe componiendo: cada sílaba se arma con una inicial, una vocal y a veces una
5# final, y el teclado manda las piezas por separado. Esto hace esa composición (y la conversión
6# hanja→hangul). Es la única dep nueva que `fcitx5-hangul` necesita — medido contra el catálogo
7# el 2026-10-20, y la razón por la que el coreano es el primer motor de IME que entra: el chino
8# arrastra seis recetas más (`libime`, `libpinyin`, `opencc`, `fcitx5-lua`, `fcitx5-qt`) y
9# **qt6-qtwebengine**, y el japonés arrastra `anthy` más Qt.
10#
11# ══ CMAKE Y NO AUTOTOOLS, AUNQUE TRAE LOS DOS ══════════════════════════════════════════════════
12# El tarball trae `CMakeLists.txt` Y `autogen.sh`+`configure.ac`. Se usa cmake porque es lo que usa
13# su consumidor (`fcitx5-hangul`) y porque el camino autotools de este proyecto exige regenerar con
14# `autogen.sh`, que mete autoconf/automake/libtool en la cadena para nada.
15#
16# ══ ⚠ PIC DESDE EL PRIMER DÍA, Y ESO ES LA LECCIÓN DE AYER APLICADA ════════════════════════════
17# `fcitx5-hangul` es un ADDON: un `.so` que el daemon carga con `dlopen`. Un `.a` sin PIC no entra
18# en un `.so`, y el corpus se construye estático-primero — así que una receta nueva que va a ser
19# enlazada desde un `.so` tiene que nacer PIC o cuesta un viaje de diagnóstico.
20#
21# Eso se pagó ayer: `libpng`, `freetype` y `fontconfig` publicaban su `.a` sin PIC y `fcitx5` murió
22# con **7365** errores `relocation … recompile with -fPIC`; arreglarlo fue una decisión de
23# arquitectura con 40 recetas de cascada y las cinco imágenes de escritorio rearmando. Poner
24# `CMAKE_POSITION_INDEPENDENT_CODE=ON` acá cuesta una línea.
25#
26# `BUILD_SHARED_LIBS=OFF` mantiene la convención del corpus (estático) — PIC y estático no son
27# excluyentes: lo que PIC cambia es cómo se direccionan los globales, no dónde vive el código.
28#
29# Las herramientas y los tests quedan fuera: el consumidor usa la biblioteca, no el `hangul`
30# interactivo de línea de comandos.
31name    = "libhangul"
32version = "0.2.0"
33license = "LGPL-2.1-or-later"
34
35[source]
36tarball = "https://github.com/libhangul/libhangul/archive/refs/tags/libhangul-0.2.0/libhangul-0.2.0.tar.gz"
37sha256  = "db9a256ff1e2c639ea8168f5e8741dae95ad7ea563f257b1dbd098afd8e48487"
38
39[build]
40compiler = "zig-cc"
41target   = "x86_64-linux-musl"
42link     = "static"
43flags    = []
44
45[build.phases]
46configure = '''
47ZW="$PWD/.zwrap"; mkdir -p "$ZW"
48printf '#!/bin/sh\nexec /opt/zig/zig cc -mcpu=baseline "$@"\n'  > "$ZW/cc"
49printf '#!/bin/sh\nexec /opt/zig/zig c++ -mcpu=baseline "$@"\n' > "$ZW/cxx"
50chmod +x "$ZW/cc" "$ZW/cxx"
51# `rm -rf build`: el árbol de fuentes se REUSA entre builds, así que un `build/` de un intento
52# anterior sobrevive con su `CMakeCache.txt` y los resultados cacheados de `pkg_check_modules`
53# — un primer fallo envenenaría todos los reintentos. Medido ayer con fcitx5: el build volvía a
54# morir con el MISMO error en 2 segundos. Toda receta cmake necesita esto.
55rm -rf build
56cmake -B build -G Ninja -Wno-dev \
57  -DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" \
58  -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
59  -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DBUILD_SHARED_LIBS=OFF \
60  -DENABLE_EXTERNAL_KEYBOARDS=OFF -DENABLE_UNIT_TEST=OFF
61'''
62compile = "cmake --build build"
63# ⚠ **EL `.pc` LO GENERA EL CAMINO AUTOTOOLS, NO EL DE CMAKE — y el consumidor lo EXIGE.**
64# Medido: `cmake --install` deja `lib/cmake/libhangul/hangul-config.cmake` y **ningún**
65# `lib/pkgconfig/libhangul.pc`. Pero `fcitx5-hangul` no usa `find_package`: su CMakeLists:21 hace
66#     pkg_check_modules(Hangul IMPORTED_TARGET "libhangul>=0.0.12" REQUIRED)
67# o sea que sin el `.pc` el motor no compila. El guardián de abajo lo cazó en el primer build, que
68# es exactamente para lo que estaba.
69#
70# ⇒ Se sustituye **la plantilla de upstream** (`libhangul.pc.in`, que el tarball trae y el camino de
71# cmake ignora), no un `.pc` inventado. La diferencia importa: los campos —y en particular el
72# `includedir=.../hangul-1.0`, que es el directorio VERSIONADO donde la cabecera cae de verdad— los
73# decide upstream, no yo. Un `.pc` escrito a mano se desalinea el día que cambien el prefijo de las
74# cabeceras, y nadie se enteraría hasta que un consumidor no encuentre `hangul.h`.
75#
76# La alternativa era construir por autotools para que el `.pc` saliera solo; se descartó porque
77# `autogen.sh` mete autoconf/automake/libtool en la cadena para obtener un fichero de diez líneas
78# cuya plantilla ya está en el árbol.
79install = '''
80set -e
81DESTDIR=/out cmake --install build
82[ -f /out/usr/lib/libhangul.a ] || { echo "libhangul: no quedó la .a — NO sello" >&2; exit 1; }
83
84[ -f libhangul.pc.in ] || { echo "libhangul: no está libhangul.pc.in — ¿cambió el árbol de upstream? sin su plantilla no genero el .pc" >&2; exit 1; }
85mkdir -p /out/usr/lib/pkgconfig
86sed -e 's|@prefix@|/usr|g' \
87    -e 's|@exec_prefix@|${prefix}|g' \
88    -e 's|@libdir@|${prefix}/lib|g' \
89    -e 's|@includedir@|${prefix}/include|g' \
90    -e 's|@PACKAGE_VERSION@|0.2.0|g' \
91    libhangul.pc.in > /out/usr/lib/pkgconfig/libhangul.pc
92# Que no quede ni un `@algo@` sin sustituir: un `.pc` con un marcador crudo resuelve a medias y el
93# error sale después, en el `-I` del consumidor, sin nombrar este fichero.
94if grep -q '@[A-Za-z_]*@' /out/usr/lib/pkgconfig/libhangul.pc; then
95  echo "libhangul: quedaron marcadores sin sustituir en el .pc:" >&2
96  grep -o '@[A-Za-z_]*@' /out/usr/lib/pkgconfig/libhangul.pc | sort -u >&2
97  exit 1
98fi
99[ -f /out/usr/include/hangul-1.0/hangul.h ] || { echo "libhangul: la cabecera no está donde el .pc dice (include/hangul-1.0) — el -I apuntaría al vacío" >&2; exit 1; }
100echo "libhangul: .a + .pc generado de su plantilla + cabecera en include/hangul-1.0"
101'''
102[deps]
103build = ["cmake", "samurai", "pkgconf", "gettext-tiny", "expat"]