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…

Rust 45TOML 36Markdown 26Shell 7878 Definitions

⎇ fee383ff64be0f09a065475ac72a0056f4054e4a recipes/shared-mime-info.toml TOML · 86 lines · 6.3 KB History raw

shared-mime-info 2.5.1: la base MIME sellada — KDE pasa de 4 wanted a 3 a6beb3b28 · Sergio ·

1# shared-mime-info 2.5.1 — la BASE DE DATOS MIME de freedesktop: qué tipo de fichero es cada cosa,
2# con qué icono se dibuja y con qué app se abre. Es el hueco de RUNTIME nº1 del triaje de la frontera
3# (docs/state/frontera-triaje.toml): ninguna receta la pide para CONSTRUIR —por eso el escritorio
4# sellaba 163/163 sin ella— pero sin la base el KDE arranca sin tipos de fichero, sin asociaciones y
5# con iconos genéricos. Qt6 (QMimeDatabase) y GLib (g_content_type_*) la leen los dos de
6# /usr/share/mime; GLib EXIGE el `mime.cache` binario, así que la receta no se conforma con instalar
7# el XML: lo compila (ver la fase install).
8#
9# ── POR QUÉ VIVE EN LA RAÍZ Y NO EN incoming-kde ────────────────────────────────────────────────
10# `targets.toml` la declara bajo `escritorio-kde` porque ahí se detectó el hueco, pero no tiene nada
11# de KDE: es freedesktop puro y GNOME/COSMIC la quieren igual (ver el comentario de gdk-pixbuf, que
12# hoy la ESQUIVA con -Dgio_sniffing=false). En `recipes/` la ven los cinco grafos; en incoming-kde
13# sólo la vería `--kde`.
14name    = "shared-mime-info"
15version = "2.5.1"
16license = "GPL-2.0-or-later"
17
18[source]
19# GIT, no tarball, A PROPÓSITO: freedesktop no publica downloads de release para este proyecto —la
20# API de releases sólo ofrece los `-/archive/` autogenerados de GitLab, y esos NO son estables byte
21# a byte, así que un sha256 pinneado sobre ellos se rompe solo (mismo criterio que wlr-randr).
22# El commit es el tag 2.5.1 PELADO (`git rev-parse 2.5.1^{commit}`): en este repo el tag es un
23# objeto tag, y el pin tiene que ser el commit (misma trampa que las 4 del mirror, ADR 0013).
24repo   = "https://gitlab.freedesktop.org/xdg/shared-mime-info.git"
25commit = "fd8ab89c20093f1bfba8fa9e302ba584fffd0fd7"
26
27[build]
28compiler = "zig-cc"
29target   = "x86_64-linux-musl"
30link     = "static"
31# El valor de este paquete son DATOS (384 KB de XML + la caché binaria); el único ejecutable es
32# update-mime-database. Nace con el split de debug puesto para que reproduzca desde el día uno:
33# es la deriva conocida del corpus (rutas /src dentro de .debug_*, ver why-differs).
34strip_debug = true
35
36[build.phases]
37# ── las cuatro perillas, y por qué ──────────────────────────────────────────────────────────────
38#  -Dbuild-tools=true      update-mime-database: es lo que compila el XML a mime.cache. LO QUEREMOS.
39#  -Dbuild-tests=false     el suite pide `xmllint`, que nuestra libxml2 no instala (--without-python,
40#                          binario aparte); y los binarios de test ni se instalan.
41#  -Dbuild-spec=false      la especificación en HTML pide `xmlto` + docbook-xsl: no están en el lab
42#                          y son documentación, no distro.
43#  -Dbuild-translations=false  el corpus no tiene un gettext real (sólo gettext-tiny), así que no hay
44#                          .mo que fusionar. Ver abajo: esto NO se lleva la base de datos puesta.
45#  -Dupdate-mimedb=false   es el DEFAULT y lo dejo explícito: esa opción corre update-mime-database
46#                          dentro de `meson install`, y el propio upstream avisa que no se enciende
47#                          con DESTDIR (apuntaría al /usr real). Lo corremos a mano contra /out.
48#
49# ⚠ `i18n.merge_file` de data/meson.build es INCONDICIONAL: no lo apaga `-Dbuild-translations=false`,
50# porque es el paso que PRODUCE freedesktop.org.xml —el payload entero— y no un extra de i18n. Eso
51# obliga a tener un `msgfmt` que entienda `--xml`. El del corpus es el de gettext-tiny, y hace
52# exactamente lo correcto acá: copia el `--template` al `-o`. Verificado a mano sobre el template
53# real (384036 bytes, copia byte a byte). Y es correcto, no una degradación disimulada: desde 2.x el
54# template ya es XML válido —las traducciones se marcan con reglas ITS externas, no con elementos
55# `<_comment>`— así que sin catálogos la salida de un msgfmt real ES el template. Comprobado: cero
56# ocurrencias de `<_`. La base sale en inglés, que es lo mismo que hace el resto del corpus (nls off).
57configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload --prefer-static -Ddefault_library=static -Dbuild-tools=true -Dbuild-tests=false -Dbuild-spec=false -Dbuild-translations=false -Dupdate-mimedb=false"
58compile   = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
59install   = '''
60set -e
61PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild
62
63# ── el paso que convierte un nombre en un artefacto ─────────────────────────────────────────────
64# `meson install` deja el XML fuente en /usr/share/mime/packages/ y NADA MÁS. Los consumidores no
65# leen ese XML: leen los índices que genera update-mime-database (mime.cache, globs2, magic,
66# aliases, subclasses, treemagic…). Sin este paso el artefacto pasa todas las verificaciones de
67# presencia —directorio con contenido, ficheros no vacíos— y el escritorio sigue sin saber qué es un
68# .png. Es justo la forma de vacío que la regla 3 del repo describe: llega hasta el final diciendo
69# que todo fue bien.
70test -x /out/usr/bin/update-mime-database
71/out/usr/bin/update-mime-database /out/usr/share/mime
72
73# Verificación por CONTENIDO, no por presencia: mime.cache vacío o de 0 tipos es indistinguible de
74# un éxito si sólo se mira que el fichero exista.
75test -s /out/usr/share/mime/mime.cache
76test -s /out/usr/share/mime/globs2
77grep -q "^image/png$" /out/usr/share/mime/types
78echo "  mime: $(wc -l < /out/usr/share/mime/types) tipos, $(wc -l < /out/usr/share/mime/globs2) globs"
79'''
80
81# `binutils` por `strip_debug = true` (el paso de strip del lab usa su `strip --strip-debug`).
82# `gettext-tiny` por el msgfmt --xml de arriba: no es opcional, sin él no hay freedesktop.org.xml.
83# pcre2/libffi/zlib son el `.pc Requires` de glib y gio, no un capricho: el link es estático y sin
84# ellos update-mime-database no cierra (patrón `.pc Requires`→`[deps]`).
85[deps]
86build = ["binutils", "meson", "samurai", "python3", "pkgconf", "gettext-tiny", "glib", "libxml2", "pcre2", "libffi", "zlib"]