# dotconf 1.4.1 — el parser de ficheros de configuración de speech-dispatcher. # # ══ POR QUÉ ENTRA ══════════════════════════════════════════════════════════════════════════════ # Es la ÚNICA dep obligatoria de `speech-dispatcher` que el corpus no tenía. Medido sobre su # `configure.ac`, no sobre los paquetes de otra distro: de sus once `PKG_CHECK_MODULES`, los # obligatorios son `glib-2.0`/`gthread-2.0`/`gmodule-2.0`, `sndfile` y **`dotconf >= 1.3`**; el # resto va detrás de un `--with-*` (espeak-ng, pulse, libao, pipewire, alsa) y `libsystemd` trae su # propio fallback (`[:]`), que es lo que permite construirlo en una distro sin systemd. # # ══ ⚠ SE COMPILA A MANO, Y NO ES CAPRICHO ══════════════════════════════════════════════════════ # El archive del tag **no trae `configure` generado** (sólo `configure.ac`), y en este lab **no hay # autoconf ni automake** — `libtool` y `m4` sí, pero no alcanzan. Tampoco hay salida por el lado de # upstream: el proyecto **no publica releases**, sólo tags (comprobado: el asset # `releases/download/v1.4.1/…` da 404), así que el truco que salvó a `pcaudiolib` —usar el tarball # del release, que es un `make dist` con el `configure` ya hecho— acá no existe. # # ⇒ Las opciones eran escribir el autoconf o compilar los dos ficheros a mano. Se eligió lo # segundo **porque la biblioteca son dos `.c`**: `dotconf.c` (36 KB) y `readdir.c` (4,7 KB), los dos # fuentes incondicionales de su `Makefile.am`, y una sola cabecera instalable (`dotconf.h`). Un # autoconf para eso es más código que la biblioteca, y además mete una dep de build grande en el # corpus para siempre. # # `-fPIC` explícito: `speech-dispatcher` carga sus módulos de salida como `.so` con gmodule, y una # `.a` no-PIC no puede entrar en una compartida — el muro del 19-oct. # # ══ EL `.pc` SE SUSTITUYE, PORQUE ES LO QUE EL CONSUMIDOR BUSCA ═════════════════════════════════ # `speech-dispatcher` la encuentra con `PKG_CHECK_MODULES([DOTCONF], [dotconf >= 1.3])`, o sea # **por pkg-config y con una cota de versión**: sin `dotconf.pc` no hay forma de que la vea, y con # un `.pc` sin `Version:` la cota falla. Upstream trae la plantilla `dotconf.pc.in`; acá se # sustituyen sus cinco `@marcadores@` a mano, igual que en `libhangul`. # # El guardián comprueba las tres cosas por separado, porque fallan distinto: que no quede ningún # `@marcador@` sin sustituir, que la cabecera esté donde el `.pc` promete, y que **pkgconf lo # resuelva de verdad** con `PKG_CONFIG_LIBDIR` puesto — el chequeo fuerte, porque `pkgconf --exists` # sin eso lee el anfitrión y da verde en falso (pasado dos veces en este repo). name = "dotconf" version = "1.4.1" license = "LGPL-2.1-or-later" [source] tarball = "https://github.com/williamh/dotconf/archive/refs/tags/v1.4.1/dotconf-1.4.1.tar.gz" sha256 = "5922c46cacf99b2ecc4853d28a2bda4a489292e73276e604bd9cba29dfca892d" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" flags = [] [build.phases] configure = ''' set -e for f in src/dotconf.c src/readdir.c src/dotconf.h dotconf.pc.in; do [ -f "$f" ] || { echo "dotconf: falta $f — upstream reorganizó el árbol" >&2; ls -R . 2>/dev/null | head -20 >&2; exit 1; } done echo "dotconf: los 2 .c y la plantilla del .pc presentes" ''' compile = ''' set -e /opt/zig/zig cc -mcpu=baseline -target x86_64-linux-musl -O2 -fPIC -Isrc -c src/dotconf.c -o dotconf.o /opt/zig/zig cc -mcpu=baseline -target x86_64-linux-musl -O2 -fPIC -Isrc -c src/readdir.c -o readdir.o /opt/zig/zig ar rcs libdotconf.a dotconf.o readdir.o ''' install = ''' set -e mkdir -p /out/usr/lib/pkgconfig /out/usr/include cp libdotconf.a /out/usr/lib/ cp src/dotconf.h /out/usr/include/ # Sustitución de la plantilla de upstream. `sed` y no `configure`, por lo de arriba. sed -e 's|@prefix@|/usr|g' \ -e 's|@exec_prefix@|/usr|g' \ -e 's|@libdir@|/usr/lib|g' \ -e 's|@includedir@|/usr/include|g' \ -e 's|@VERSION@|1.4.1|g' \ dotconf.pc.in > /out/usr/lib/pkgconfig/dotconf.pc [ -f /out/usr/lib/libdotconf.a ] || { echo "dotconf: no quedó la .a — NO sello" >&2; exit 1; } [ -f /out/usr/include/dotconf.h ] || { echo "dotconf: falta include/dotconf.h" >&2; exit 1; } # Ningún marcador sin sustituir: un `.pc` con un `@libdir@` crudo se instala igual y el consumidor # recibe un `-L@libdir@` que el enlazador no entiende. Es la lección de libhangul. if grep -q '@[A-Za-z_]*@' /out/usr/lib/pkgconfig/dotconf.pc; then echo "dotconf: quedaron marcadores sin sustituir en dotconf.pc" >&2 grep -n '@[A-Za-z_]*@' /out/usr/lib/pkgconfig/dotconf.pc >&2 exit 1 fi # CHEQUEO FUERTE: con PKG_CONFIG_LIBDIR puesto, para no leer el anfitrión, y pidiendo cflags+libs # de verdad en vez de `--exists`, que no valida nada transitivo. PKG_CONFIG_LIBDIR=/out/usr/lib/pkgconfig pkgconf --cflags --libs dotconf >/dev/null 2>&1 || { echo "dotconf: pkgconf no resuelve 'dotconf' — el PKG_CHECK_MODULES de speech-dispatcher fallaría" >&2 PKG_CONFIG_LIBDIR=/out/usr/lib/pkgconfig pkgconf --cflags --libs dotconf >&2 exit 1 } # Y la cota de versión que el consumidor pide literalmente. PKG_CONFIG_LIBDIR=/out/usr/lib/pkgconfig pkgconf --atleast-version=1.3 dotconf || { echo "dotconf: el .pc no satisface 'dotconf >= 1.3', que es la cota exacta de speech-dispatcher" >&2 exit 1 } echo "dotconf: libdotconf.a (PIC) + dotconf.h + dotconf.pc $(PKG_CONFIG_LIBDIR=/out/usr/lib/pkgconfig pkgconf --modversion dotconf)" ''' [deps] build = ["pkgconf"]