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 1574Shell 204Rust 111Markdown 993763 Definitions

⎇ b0085e7cf6978a7f9e27aa863f756a463fc1407e recipes/dotconf.toml TOML · 102 lines · 5.7 KB History raw

accesibilidad: el SERVIDOR de voz, no sólo el sintetizador a709d76c2 · Sergio ·

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