# x11-compose-data — la base de secuencias Compose de X11, y NADA de X11.
#
# QUÉ ES: los ficheros `/usr/share/X11/locale/…` que definen las teclas muertas y las combinaciones
# de `Multi_key` (`<Compose> a '` → `á`). Son **datos**, no código: 5192 líneas de reglas para
# `en_US.UTF-8`. Viven en el tarball de libX11 porque históricamente X11 fue quien las mantuvo, no
# porque necesiten X11 para existir.
#
# POR QUÉ LAS NECESITA UNA DISTRO SIN X11, y es una tensión real que conviene dejar escrita: **ibus
# las compila DENTRO de libibus**. Su `gen-internal-compose-table` (src/gencomposetable.c:70) lee un
# fichero `Compose` en tiempo de build y lo convierte en `compose/sequences-<endian>-endian`, que
# entra como GResource en `ibusresources.c`. Ese paso NO es opcional en su Makefile.am:310 — no hay
# `--disable-` que lo evite. Sin datos, el build de ibus muere con
# `Failed to open file "/X11/locale/en/Compose"`.
#
# O sea: el escritorio es Wayland-only por decisión, pero la tabla de teclas muertas del mundo Unix
# sigue publicándose dentro de libX11. Empaquetar esos datos NO reintroduce X11: no hay una sola
# línea de código, ni un `.so`, ni una dependencia. Es el mismo criterio que `iso-codes`.
#
# CÓMO SE GENERAN: los ficheros del tarball son `.pre` y hay que pasarlos por el preprocesador de C.
# La receta REPRODUCE la regla de upstream (`cpprules.in`) tal cual, en vez de improvisar:
#   · `cpp -undef -traditional -DWCHAR32=1` — `RAWCPP $(RAWCPPFLAGS) $(CPP_FILES_FLAGS)`.
#   · el `CPP_SED_MAGIC`, copiado literal. Traduce `XCOMM` a `#` con sed y no con `-DXCOMM=XCOMM`
#     —el comentario de upstream explica que ese truco no funciona en todos los preprocesadores—,
#     borra las marcas de línea de cpp, sustituye `X11_LOCALEDATADIR` por la ruta real y colapsa los
#     `@@` finales en barras invertidas.
# Verificado: la salida son 5192 líneas con 2337 secuencias de teclas muertas, sintaxis intacta.
#
# SÓLO en_US.UTF-8. Es la que ibus busca (`sys_langs[] = { "en_US.UTF-8", "en_US", "en" }`) y la que
# todas las demás locales incluyen por `include "%L"`. Traer las ~180 locales sería traer el árbol
# de i18n de X11 entero para que nadie lo lea.
#
# `locale.dir` no es decorativo: el configure de ibus decide `X11_LOCALEDATADIR` comprobando que
# EXISTA (configure.ac:394). Sin él cae a un `$(datadir)` sin expandir y el define queda en
# `"/X11/locale"`, que es exactamente el error de arriba.
name    = "x11-compose-data"
version = "1.8.13"

[source]
tarball = "https://gitlab.freedesktop.org/xorg/lib/libx11/-/archive/libX11-1.8.13/libx11-libX11-1.8.13.tar.gz"
sha256  = "d210291f5cd974e5029cce4bde0fc1b8bfc0ce88b8530ea6ba4b1fcf141506ab"

[build]
compiler = "zig-cc"
target   = "x86_64-linux-musl"
link     = "dynamic"

[build.phases]
configure = "true"
compile   = "true"
install   = '''
set -e
LOCALEDIR=/usr/share/X11/locale
mkdir -p "/out$LOCALEDIR/en_US.UTF-8"
# La regla de upstream, literal (cpprules.in): cpp crudo + el CPP_SED_MAGIC.
gen() {
  cpp -undef -traditional -DWCHAR32=1 < "$1" | LC_CTYPE=C sed \
    -e '/^\#  *[0-9][0-9]*  *.*$/d' \
    -e '/^\#line  *[0-9][0-9]*  *.*$/d' \
    -e '/^[	 ]*XCOMM$/s/XCOMM/\#/' \
    -e '/^[	 ]*XCOMM[^a-zA-Z0-9_]/s/XCOMM/\#/' \
    -e '/^[	 ]*XHASH/s/XHASH/\#/' \
    -e "s,X11_LOCALEDATADIR,$LOCALEDIR,g" \
    -e '/\@\@$/s/\@\@$/\\/' \
    -e '/^$/d' > "$2"
}
gen nls/en_US.UTF-8/Compose.pre    "/out$LOCALEDIR/en_US.UTF-8/Compose"
gen nls/en_US.UTF-8/XLC_LOCALE.pre "/out$LOCALEDIR/en_US.UTF-8/XLC_LOCALE"
gen nls/locale.dir.pre             "/out$LOCALEDIR/locale.dir"
gen nls/compose.dir.pre            "/out$LOCALEDIR/compose.dir"
gen nls/locale.alias.pre           "/out$LOCALEDIR/locale.alias"
cp nls/en_US.UTF-8/XI18N_OBJS      "/out$LOCALEDIR/en_US.UTF-8/XI18N_OBJS"
wc -l "/out$LOCALEDIR/en_US.UTF-8/Compose"
'''

[deps]
build = ["make", "pkgconf"]
