Files
sergioandClaude Opus 5 a6a9d59e4f licencias: 936 de 1141 (82%) — detección por evidencia, con sus dos imprecisiones declaradas
Esta mañana eran 0. Tras la tabla curada (228) y este paso, 936. Ninguna receta se
re-hasheó: verificado en 30 de las 708 tocadas, 30 hashes idénticos, 0 cambiados.

DE DÓNDE SALE EL DATO, Y POR QUÉ NO ES ADIVINAR. `scripts/licencias-detectar.sh` consulta
la API /repos/{o}/{r}/license de GitHub para las 673 recetas cuya fuente vive allí. Eso
devuelve el resultado de DETECTAR el fichero LICENSE que el repo tiene de verdad
(licensee), no una etiqueta escrita a mano en una web: es la misma evidencia que veríamos
abriendo el tarball, obtenida sin bajar 673 tarballs por un enlace de 8 Mbps. 610 con SPDX
definido; las 63 que GitHub marca NOASSERTION/other se DESCARTAN — un «no sé» de la fuente
se propaga como hueco, no se redondea a una licencia plausible.

Las familias no-GitHub van curadas por la URL DE FUENTE, que es la evidencia que el nombre
no da. Y ahí cometí el error simétrico al que este mismo fichero advertía: había puesto
`knighttime` entre las «herramientas Go» POR SU NOMBRE, y su tarball sale de
download.kde.org — es un Framework de KDE, LGPL. Descartar por nombre falla igual que
aceptar por nombre. Corregido en la cabecera.

LAS DOS IMPRECISIONES, contables con `licencias.sh --revisar` en vez de escondidas:

 1. SPDX OBSOLETOS Y AMBIGUOS (71 recetas). GitHub devuelve `GPL-3.0`, `LGPL-2.1`,
    `AGPL-3.0`… identificadores que SPDX declaró obsoletos PRECISAMENTE porque no
    distinguen `-only` de `-or-later`, y esa diferencia decide con qué se puede combinar el
    paquete. NO se normalizan a ciegas: mapear GPL-3.0 → GPL-3.0-or-later sería inventar el
    dato que falta. Quedan marcadas para resolver mirando el fuente.

 2. LICENCIAS DOBLES COLAPSADAS. La API devuelve UNA sola licencia y muchos proyectos Rust
    son «MIT OR Apache-2.0» (p.ej. `fd` quedó como Apache-2.0). No es falso —cumplir una de
    las opciones concedidas basta— pero es incompleto. Lo resuelve el cierre estructural:
    leer el campo `license` del Cargo.toml en la fase de fetch.

Y un fallo que habría escrito basura en silencio: `licencias-detectadas.tsv` tiene TRES
columnas (añade el owner/repo consultado, para poder auditar) y el sembrador leía dos, así
que la licencia se habría llevado pegado el slug — `license = "MIT<TAB>owner/repo"`, sin
que nada lo validara. Arreglado antes de sembrar.

Quedan 205 sin licencia y 71 por desambiguar.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 13:26:22 -04:00

78 lines
3.8 KiB
TOML

# 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"
license = "MIT"
[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"]