fix(libhangul): el `.pc` lo genera autotools y el consumidor lo EXIGE — se sustituye su plantilla
Primer build de `libhangul`: compiló e instaló entero, y **mi propio guardián lo paró**:
libhangul: falta libhangul.pc — el consumidor no la va a encontrar
Medido: `cmake --install` deja `lib/cmake/libhangul/hangul-config.cmake` y **ningún**
`lib/pkgconfig/libhangul.pc`. Y eso no es un detalle de estilo, porque `fcitx5-hangul` **no usa
`find_package`** — su `CMakeLists:21` hace
pkg_check_modules(Hangul IMPORTED_TARGET "libhangul>=0.0.12" REQUIRED)
o sea que sin el `.pc` el motor no compila. El guardián estaba pidiendo exactamente lo que hacía
falta, y lo cazó en el primer intento en vez de dejar sellar una biblioteca que su único consumidor
no puede encontrar. (`fcitx5-hangul` «falló» en la misma tanda, pero sólo porque su dep falló: su
árbol de fuentes ni se bajó.)
⇒ Se sustituye **la plantilla de upstream** — `libhangul.pc.in`, que el tarball trae y el camino de
cmake ignora (el de autotools sí la usa) — y no un `.pc` inventado. La diferencia importa: los
campos los decide upstream, y en particular el `includedir=${prefix}/include/hangul-1.0`, que es el
directorio VERSIONADO donde la cabecera cae de verdad. Un `.pc` escrito de memoria se desalinea el
día que cambien ese prefijo, y nadie se entera hasta que un consumidor no encuentra `hangul.h`.
Se descartó construir por autotools —que generaría el `.pc` solo— porque `autogen.sh` mete
autoconf/automake/libtool en la cadena para obtener un fichero de diez líneas cuya plantilla ya está
en el árbol.
Y la sustitución se verifica a sí misma, con dos guardianes que son la misma idea en dos sitios:
· **que no quede ni un `@marcador@`** sin sustituir — un `.pc` con un marcador crudo resuelve a
medias y el error sale después, en el `-I` del consumidor, sin nombrar este fichero;
· **que la cabecera esté donde el `.pc` dice** (`include/hangul-1.0/hangul.h`), porque un `-I` que
apunta al vacío compila hasta que alguien incluye algo.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
1 qillqakuna · +34 −5
- recipes/libhangul.toml +34 −5
diff --git a/recipes/libhangul.toml b/recipes/libhangul.toml
index 2340e438..9383f353 100644
--- a/recipes/libhangul.toml
+++ b/recipes/libhangul.toml
@@ -60,15 +60,44 @@ cmake -B build -G Ninja -Wno-dev \
-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.
+# ⚠ **EL `.pc` LO GENERA EL CAMINO AUTOTOOLS, NO EL DE CMAKE — y el consumidor lo EXIGE.**
+# Medido: `cmake --install` deja `lib/cmake/libhangul/hangul-config.cmake` y **ningún**
+# `lib/pkgconfig/libhangul.pc`. Pero `fcitx5-hangul` no usa `find_package`: su CMakeLists:21 hace
+# pkg_check_modules(Hangul IMPORTED_TARGET "libhangul>=0.0.12" REQUIRED)
+# o sea que sin el `.pc` el motor no compila. El guardián de abajo lo cazó en el primer build, que
+# es exactamente para lo que estaba.
+#
+# ⇒ Se sustituye **la plantilla de upstream** (`libhangul.pc.in`, que el tarball trae y el camino de
+# cmake ignora), no un `.pc` inventado. La diferencia importa: los campos —y en particular el
+# `includedir=.../hangul-1.0`, que es el directorio VERSIONADO donde la cabecera cae de verdad— los
+# decide upstream, no yo. Un `.pc` escrito a mano se desalinea el día que cambien el prefijo de las
+# cabeceras, y nadie se enteraría hasta que un consumidor no encuentre `hangul.h`.
+#
+# La alternativa era construir por autotools para que el `.pc` saliera solo; se descartó porque
+# `autogen.sh` mete autoconf/automake/libtool en la cadena para obtener un fichero de diez líneas
+# cuya plantilla ya está en el árbol.
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"
-'''
+[ -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; }
+mkdir -p /out/usr/lib/pkgconfig
+sed -e 's|@prefix@|/usr|g' \
+ -e 's|@exec_prefix@|${prefix}|g' \
+ -e 's|@libdir@|${prefix}/lib|g' \
+ -e 's|@includedir@|${prefix}/include|g' \
+ -e 's|@PACKAGE_VERSION@|0.2.0|g' \
+ libhangul.pc.in > /out/usr/lib/pkgconfig/libhangul.pc
+# Que no quede ni un `@algo@` sin sustituir: un `.pc` con un marcador crudo resuelve a medias y el
+# error sale después, en el `-I` del consumidor, sin nombrar este fichero.
+if grep -q '@[A-Za-z_]*@' /out/usr/lib/pkgconfig/libhangul.pc; then
+ echo "libhangul: quedaron marcadores sin sustituir en el .pc:" >&2
+ grep -o '@[A-Za-z_]*@' /out/usr/lib/pkgconfig/libhangul.pc | sort -u >&2
+ exit 1
+fi
+[ -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; }
+echo "libhangul: .a + .pc generado de su plantilla + cabecera en include/hangul-1.0"
+'''
[deps]
build = ["cmake", "samurai", "pkgconf", "gettext-tiny", "expat"]