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

Primero de los cuatro huecos de RUNTIME del triaje de la frontera. Ninguna receta
lo pedía para construir (por eso escritorio-kde cerraba 163/163 sin él), pero sin
la base el escritorio no sabe qué es un fichero: ni asociaciones, ni iconos, ni
abrir-con. Qt6 y GLib lo leen los dos de /usr/share/mime.

Vive en recipes/ y no en incoming-kde: es freedesktop puro, y en la raíz lo ven
los cinco grafos (GNOME y COSMIC lo quieren igual — gdk-pixbuf hoy lo ESQUIVA con
-Dgio_sniffing=false).

Tres cosas que no eran obvias:

1. Fuente por GIT, no tarball. Freedesktop no publica downloads de release para
   este proyecto: la API sólo ofrece los -/archive/ autogenerados de GitLab, que
   no son estables byte a byte (mismo criterio ya escrito en wlr-randr). El pin
   es el tag 2.5.1 PELADO — acá el tag es objeto tag, la trampa de las 4 del
   mirror (ADR 0013).

2. 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. Eso exige un msgfmt que entienda --xml. El de gettext-tiny
   sirve y no degrada nada: desde 2.x el template ya es XML válido (las
   traducciones se marcan con reglas ITS externas, cero ocurrencias de "<_"), así
   que sin catálogos la salida de un msgfmt real ES el template. Verificado a mano:
   copia byte a byte de los 384036 del template.

3. meson install deja SÓLO el XML fuente. Los consumidores no leen ese XML: leen
   los índices que genera update-mime-database (mime.cache, globs2, magic,
   aliases, subclasses). Sin ese paso el artefacto pasa toda verificación de
   presencia y el escritorio sigue sin saber qué es un .png — la regla 3 del repo
   en su forma exacta. La fase install lo corre contra /out y verifica por
   CONTENIDO: mime.cache y globs2 no vacíos, image/png en types. Salieron 1038
   tipos y 1448 globs.

Nace con strip_debug = true y REPRODUCE bit a bit (verificar-repro.sh: 1/1, cero
divergencias), caché binaria incluida. Estático, 0 NEEDED.

corpus 788/788 sealed · escritorio-kde 165/165 · grafo CIERRA · gate --check OK
Quedan 3 wanted en KDE: xwayland, polkit-qt-1, qqc2-breeze-style.
This commit is contained in:
Sergio
2026-09-02 22:28:54 +00:00
parent 48ce856246
commit a6beb3b28d
6 changed files with 320 additions and 96 deletions
+48 -17
View File
@@ -1,12 +1,12 @@
{
"schema": "hammer-build-state/1",
"totals": {
"recipes": 833,
"nodes": 833,
"sealed": 833
"recipes": 834,
"nodes": 834,
"sealed": 834
},
"by_class": {
"c": 181,
"c": 182,
"go": 362,
"gui": 34,
"kernel": 6,
@@ -15,7 +15,7 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
"sealed": 786
"sealed": 787
},
"incoming-cosmic": {
"sealed": 47
@@ -846,7 +846,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 42
"dependientes_total": 43
},
"biome": {
"iname": "biome",
@@ -4766,7 +4766,7 @@
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 98
"dependientes_total": 99
},
"gh": {
"iname": "gh",
@@ -5204,9 +5204,10 @@
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 24
"dependientes_total": 25
},
"glib-shared": {
"iname": "glib-shared",
@@ -8497,7 +8498,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 97
"dependientes_total": 98
},
"libffi-shared": {
"iname": "libffi-shared",
@@ -9004,9 +9005,10 @@
"unblocks": 0,
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome"
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 10
"dependientes_total": 11
},
"libxml2-shared": {
"iname": "libxml2-shared",
@@ -9800,7 +9802,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 115
"dependientes_total": 116
},
"micro": {
"iname": "micro",
@@ -11104,7 +11106,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 73
"dependientes_total": 74
},
"pcre2-shared": {
"iname": "pcre2-shared",
@@ -11348,7 +11350,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 372
"dependientes_total": 373
},
"plow": {
"iname": "plow",
@@ -11717,7 +11719,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 281
"dependientes_total": 282
},
"qrcp": {
"iname": "qrcp",
@@ -12272,7 +12274,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 247
"dependientes_total": 248
},
"sassc": {
"iname": "sassc",
@@ -12512,6 +12514,35 @@
],
"dependientes_total": 0
},
"shared-mime-info": {
"iname": "shared-mime-info",
"version": "2.5.1",
"link": "static",
"compiler": "zig-cc",
"deps": [
"binutils",
"meson",
"samurai",
"python3",
"pkgconf",
"gettext-tiny",
"glib",
"libxml2",
"pcre2",
"libffi",
"zlib"
],
"cls": "c",
"queue": "corpus",
"hash": "b3:c6513399906bc433b6a9523749ed74b15e78ad3fb88cae9fa4085d6d4cddb109",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 0
},
"shellharden": {
"iname": "shellharden",
"version": "4.3.1",
@@ -15108,7 +15139,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 96
"dependientes_total": 97
},
"zlib-ng": {
"iname": "zlib-ng",
+46 -16
View File
@@ -1,12 +1,12 @@
{
"schema": "hammer-build-state/1",
"totals": {
"recipes": 858,
"nodes": 858,
"sealed": 858
"recipes": 859,
"nodes": 859,
"sealed": 859
},
"by_class": {
"c": 220,
"c": 221,
"go": 362,
"gui": 40,
"kernel": 6,
@@ -15,7 +15,7 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
"sealed": 779
"sealed": 780
},
"incoming-gnome": {
"sealed": 79
@@ -933,7 +933,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 42
"dependientes_total": 43
},
"biome": {
"iname": "biome",
@@ -4601,7 +4601,7 @@
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 98
"dependientes_total": 99
},
"gh": {
"iname": "gh",
@@ -8793,7 +8793,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 97
"dependientes_total": 98
},
"libffi-shared": {
"iname": "libffi-shared",
@@ -9664,9 +9664,10 @@
"unblocks": 0,
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome"
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 10
"dependientes_total": 11
},
"libxml2-shared": {
"iname": "libxml2-shared",
@@ -10458,7 +10459,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 115
"dependientes_total": 116
},
"micro": {
"iname": "micro",
@@ -11905,7 +11906,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 73
"dependientes_total": 74
},
"peco": {
"iname": "peco",
@@ -12130,7 +12131,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 372
"dependientes_total": 373
},
"plow": {
"iname": "plow",
@@ -12569,7 +12570,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 281
"dependientes_total": 282
},
"qrcp": {
"iname": "qrcp",
@@ -13124,7 +13125,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 247
"dependientes_total": 248
},
"sassc": {
"iname": "sassc",
@@ -13364,6 +13365,35 @@
],
"dependientes_total": 0
},
"shared-mime-info": {
"iname": "shared-mime-info",
"version": "2.5.1",
"link": "static",
"compiler": "zig-cc",
"deps": [
"binutils",
"meson",
"samurai",
"python3",
"pkgconf",
"gettext-tiny",
"glib",
"libxml2",
"pcre2",
"libffi",
"zlib"
],
"cls": "c",
"queue": "corpus",
"hash": "b3:c6513399906bc433b6a9523749ed74b15e78ad3fb88cae9fa4085d6d4cddb109",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 0
},
"shellharden": {
"iname": "shellharden",
"version": "4.3.1",
@@ -16109,7 +16139,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 96
"dependientes_total": 97
},
"zlib-ng": {
"iname": "zlib-ng",
+44 -29
View File
@@ -1,27 +1,27 @@
{
"schema": "hammer-build-state/1",
"totals": {
"recipes": 974,
"recipes": 975,
"nodes": 978,
"sealed": 974,
"wanted": 4
"sealed": 975,
"wanted": 3
},
"by_class": {
"c": 341,
"c": 342,
"go": 362,
"gui": 36,
"kernel": 6,
"rust": 229,
"wanted": 4
"wanted": 3
},
"debt_by_class": {},
"by_queue": {
"corpus": {
"sealed": 769
"sealed": 770
},
"incoming-kde": {
"sealed": 205,
"wanted": 4
"wanted": 3
}
},
"by_profile": {
@@ -37,8 +37,8 @@
},
"escritorio-kde": {
"raices": 11,
"clausura": 163,
"sealed": 163
"clausura": 165,
"sealed": 165
},
"escritorio-mirada": {
"raices": 14,
@@ -46,7 +46,7 @@
"sealed": 29
}
},
"sin_perfil": 726,
"sin_perfil": 725,
"orphan_deps": [],
"topo_ok": true,
"nodes": {
@@ -961,7 +961,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 42
"dependientes_total": 43
},
"biome": {
"iname": "biome",
@@ -4781,7 +4781,7 @@
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 98
"dependientes_total": 99
},
"gh": {
"iname": "gh",
@@ -5219,9 +5219,10 @@
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 24
"dependientes_total": 25
},
"glib-shared": {
"iname": "glib-shared",
@@ -12209,7 +12210,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 97
"dependientes_total": 98
},
"libffi-shared": {
"iname": "libffi-shared",
@@ -13927,7 +13928,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 115
"dependientes_total": 116
},
"micro": {
"iname": "micro",
@@ -15466,7 +15467,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 73
"dependientes_total": 74
},
"pcre2-shared": {
"iname": "pcre2-shared",
@@ -15770,7 +15771,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 372
"dependientes_total": 373
},
"plasma-activities": {
"iname": "plasma-activities",
@@ -17076,7 +17077,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 281
"dependientes_total": 282
},
"qcoro": {
"iname": "qcoro",
@@ -18192,7 +18193,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 247
"dependientes_total": 248
},
"sassc": {
"iname": "sassc",
@@ -18434,17 +18435,31 @@
},
"shared-mime-info": {
"iname": "shared-mime-info",
"version": null,
"link": null,
"compiler": null,
"deps": [],
"cls": "wanted",
"queue": "incoming-kde",
"hash": null,
"state": "wanted",
"version": "2.5.1",
"link": "static",
"compiler": "zig-cc",
"deps": [
"binutils",
"meson",
"samurai",
"python3",
"pkgconf",
"gettext-tiny",
"glib",
"libxml2",
"pcre2",
"libffi",
"zlib"
],
"cls": "c",
"queue": "corpus",
"hash": "b3:c6513399906bc433b6a9523749ed74b15e78ad3fb88cae9fa4085d6d4cddb109",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [],
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 0
},
"shellharden": {
@@ -21626,7 +21641,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 96
"dependientes_total": 97
},
"zlib-ng": {
"iname": "zlib-ng",
+48 -17
View File
@@ -1,12 +1,12 @@
{
"schema": "hammer-build-state/1",
"totals": {
"recipes": 801,
"nodes": 801,
"sealed": 801
"recipes": 802,
"nodes": 802,
"sealed": 802
},
"by_class": {
"c": 172,
"c": 173,
"go": 362,
"gui": 32,
"kernel": 6,
@@ -15,7 +15,7 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
"sealed": 786
"sealed": 787
},
"incoming-wlr": {
"sealed": 15
@@ -827,7 +827,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 42
"dependientes_total": 43
},
"biome": {
"iname": "biome",
@@ -4277,7 +4277,7 @@
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 98
"dependientes_total": 99
},
"gh": {
"iname": "gh",
@@ -4715,9 +4715,10 @@
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 24
"dependientes_total": 25
},
"glow": {
"iname": "glow",
@@ -7928,7 +7929,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 97
"dependientes_total": 98
},
"libffi-shared": {
"iname": "libffi-shared",
@@ -8390,9 +8391,10 @@
"unblocks": 0,
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome"
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 10
"dependientes_total": 11
},
"libxml2-shared": {
"iname": "libxml2-shared",
@@ -9166,7 +9168,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 115
"dependientes_total": 116
},
"micro": {
"iname": "micro",
@@ -10431,7 +10433,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 73
"dependientes_total": 74
},
"peco": {
"iname": "peco",
@@ -10623,7 +10625,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 372
"dependientes_total": 373
},
"plow": {
"iname": "plow",
@@ -10922,7 +10924,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 281
"dependientes_total": 282
},
"qrcp": {
"iname": "qrcp",
@@ -11477,7 +11479,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 247
"dependientes_total": 248
},
"sassc": {
"iname": "sassc",
@@ -11717,6 +11719,35 @@
],
"dependientes_total": 0
},
"shared-mime-info": {
"iname": "shared-mime-info",
"version": "2.5.1",
"link": "static",
"compiler": "zig-cc",
"deps": [
"binutils",
"meson",
"samurai",
"python3",
"pkgconf",
"gettext-tiny",
"glib",
"libxml2",
"pcre2",
"libffi",
"zlib"
],
"cls": "c",
"queue": "corpus",
"hash": "b3:c6513399906bc433b6a9523749ed74b15e78ad3fb88cae9fa4085d6d4cddb109",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 0
},
"shellharden": {
"iname": "shellharden",
"version": "4.3.1",
@@ -14525,7 +14556,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 96
"dependientes_total": 97
},
"zlib-ng": {
"iname": "zlib-ng",
+48 -17
View File
@@ -1,12 +1,12 @@
{
"schema": "hammer-build-state/1",
"totals": {
"recipes": 787,
"nodes": 787,
"sealed": 787
"recipes": 788,
"nodes": 788,
"sealed": 788
},
"by_class": {
"c": 158,
"c": 159,
"go": 362,
"gui": 32,
"kernel": 6,
@@ -15,7 +15,7 @@
"debt_by_class": {},
"by_queue": {
"corpus": {
"sealed": 787
"sealed": 788
}
},
"by_profile": {
@@ -819,7 +819,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 42
"dependientes_total": 43
},
"biome": {
"iname": "biome",
@@ -4211,7 +4211,7 @@
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 98
"dependientes_total": 99
},
"gh": {
"iname": "gh",
@@ -4649,9 +4649,10 @@
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 24
"dependientes_total": 25
},
"glow": {
"iname": "glow",
@@ -7790,7 +7791,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 97
"dependientes_total": 98
},
"libffi-shared": {
"iname": "libffi-shared",
@@ -8252,9 +8253,10 @@
"unblocks": 0,
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome"
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 10
"dependientes_total": 11
},
"libxml2-shared": {
"iname": "libxml2-shared",
@@ -9028,7 +9030,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 115
"dependientes_total": 116
},
"micro": {
"iname": "micro",
@@ -10293,7 +10295,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 73
"dependientes_total": 74
},
"peco": {
"iname": "peco",
@@ -10485,7 +10487,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 372
"dependientes_total": 373
},
"plow": {
"iname": "plow",
@@ -10784,7 +10786,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 281
"dependientes_total": 282
},
"qrcp": {
"iname": "qrcp",
@@ -11339,7 +11341,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 247
"dependientes_total": 248
},
"sassc": {
"iname": "sassc",
@@ -11579,6 +11581,35 @@
],
"dependientes_total": 0
},
"shared-mime-info": {
"iname": "shared-mime-info",
"version": "2.5.1",
"link": "static",
"compiler": "zig-cc",
"deps": [
"binutils",
"meson",
"samurai",
"python3",
"pkgconf",
"gettext-tiny",
"glib",
"libxml2",
"pcre2",
"libffi",
"zlib"
],
"cls": "c",
"queue": "corpus",
"hash": "b3:c6513399906bc433b6a9523749ed74b15e78ad3fb88cae9fa4085d6d4cddb109",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 0
},
"shellharden": {
"iname": "shellharden",
"version": "4.3.1",
@@ -14059,7 +14090,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 96
"dependientes_total": 97
},
"zlib-ng": {
"iname": "zlib-ng",
+86
View File
@@ -0,0 +1,86 @@
# 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"]