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