kde: los portales — segundo hueco cerrado, y OBS ya tiene con quién hablar

Medido recorriendo los `.service` de D-Bus de TODO el store: los únicos backends de portal sellados
eran los de COSMIC y GNOME. Ninguno de KDE, y la cola `incoming-kde` no tenía ni el frontend.
Consecuencia concreta: la imagen KDE trae `obs-studio` con su plugin linux-pipewire, que captura
pantalla POR EL PORTAL — o sea que en Plasma no tenía con quién hablar mientras en los otros dos
escritorios ese frente estaba cerrado. Sin portal tampoco hay diálogo de fichero ni compartir
pantalla para nada que los use.

Van los DOS paquetes porque la cadena es de tres:
  cliente → org.freedesktop.portal.Desktop [frontend] → org.freedesktop.impl.portal.* [backend]
El frontend se copia de la cola de COSMIC y **comparte artefacto**: hash idéntico (ecbe13f68eca6)
desde las dos colas ⇒ un solo directorio en el store, cero builds.

El backend es receta NUEVA, 6.7.2 — la MISMA versión que plasma-workspace, kwin y kscreenlocker de
esta cola, porque habla interfaces privadas de kwin para el ScreenCast y desalinear ahí es pedir que
dos mitades del mismo release se entiendan por casualidad. **Cero frontera nueva**: sus 22
dependencias (Qt6, KF6, KWayland, protocolos de Wayland, xkbcommon) ya estaban todas, verificadas
una por una antes de escribir la receta.

⚠ SIN EL PORTAL DE IMPRESIÓN, y la causa es más honda que el error. El build moría en
`src/print.cpp:27` con `'QtPrintSupport/private/qcups_p.h' file not found`, y la cadena está medida
entera: no hay NINGUNA receta de cups en el catálogo ⇒ qtbase 6.11.1 se construyó sin CUPS ⇒ su
`QtPrintSupport/private/` trae qpaintengine_alpha_p.h y qprintengine_pdf_p.h pero NO qcups_p.h.
No falta una cabecera: falta el subsistema. Un portal de impresión sin con qué imprimir no es
funcionalidad que se pierde, es código muerto que no enlaza.

Upstream no expone `option()` para portales —se compilan todos—, así que el parche va en TRES
sitios y no en uno: la fuente, la instanciación (desktopportal.cpp/.h) y **la lista de interfaces
que el backend ANUNCIA**. El tercero es el que se olvidaría y el que importa: anunciar
`impl.portal.Print` sin implementarlo hace que el frontend enrute a un portal que no contesta, que
es peor que no tenerlo. Cada `sed` lleva su `grep` de verificación al lado, para que el día que
upstream mueva esas líneas el parche falle RUIDOSO en vez de volverse inerte.

VERIFICADO sobre el artefacto sellado: publica `org.freedesktop.impl.portal.desktop.kde.service`,
y su `kde.portal` anuncia 17 interfaces con **0 apariciones de Print** e incluyendo ScreenCast,
Screenshot y RemoteDesktop, que es exactamente lo que OBS necesita. Y sobre el rootfs hidratado:
están el frontend (`org.freedesktop.portal.Desktop.service`), el backend y el `kde.portal`.

⚠ Y la licencia casi la firmo mal: leí la cabecera de UN fichero y generalicé. Contadas las
etiquetas SPDX del árbol entero: 88 `LGPL-2.0-or-later`, 23 de la fórmula de KDE e.V. y 1
`GPL-2.0-or-later`. El binario las enlaza a todas ⇒ la expresión es la CONJUNCIÓN.

El perfil pasa a 98 raíces, 361/361 listo, deuda 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LCt3ettR4Z7b6wPCBmbvEV
This commit is contained in:
Sergio
2026-09-09 23:17:42 +00:00
co-authored by Claude Opus 5
parent 97c35d67b3
commit 7b38e2ef16
5 changed files with 472 additions and 94 deletions
+220 -93
View File
@@ -1,15 +1,15 @@
{
"schema": "hammer-build-state/1",
"totals": {
"recipes": 1048,
"nodes": 1055,
"sealed": 1048,
"recipes": 1050,
"nodes": 1057,
"sealed": 1050,
"ajeno": 2,
"wanted": 5
},
"by_class": {
"ajeno": 2,
"c": 403,
"c": 405,
"go": 362,
"gui": 44,
"kernel": 6,
@@ -24,7 +24,7 @@
"wanted": 5
},
"incoming-kde": {
"sealed": 196,
"sealed": 198,
"ajeno": 1
}
},
@@ -40,9 +40,9 @@
"sealed": 76
},
"escritorio-kde": {
"raices": 96,
"clausura": 357,
"sealed": 356,
"raices": 98,
"clausura": 362,
"sealed": 361,
"ajeno": 1
},
"escritorio-mirada": {
@@ -902,7 +902,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 31
"dependientes_total": 32
},
"atuin": {
"iname": "atuin",
@@ -933,7 +933,7 @@
"cls": "c",
"queue": "corpus",
"foreign": false,
"hash": "b3:fab2fbfb188d4656a821fb85e0f8628aab5608760d22b9a4e0dcd65fe7f010fb",
"hash": "b3:8f6d09c2d6e99a2180301b05b1d405d85ec33a4420a4a4997dd472cde33ef165",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
@@ -2829,7 +2829,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 154
"dependientes_total": 155
},
"cmctl": {
"iname": "cmctl",
@@ -3419,7 +3419,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 117
"dependientes_total": 118
},
"dbus-shared": {
"iname": "dbus-shared",
@@ -4554,7 +4554,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 108
"dependientes_total": 109
},
"eza": {
"iname": "eza",
@@ -5460,9 +5460,10 @@
"unblocks": 0,
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome"
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 2
"dependientes_total": 3
},
"fx": {
"iname": "fx",
@@ -5615,9 +5616,10 @@
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 9
"dependientes_total": 10
},
"gdk-pixbuf-shared": {
"iname": "gdk-pixbuf-shared",
@@ -5705,7 +5707,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 108
"dependientes_total": 109
},
"gh": {
"iname": "gh",
@@ -6243,7 +6245,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 35
"dependientes_total": 36
},
"glib-shared": {
"iname": "glib-shared",
@@ -8287,7 +8289,7 @@
"escritorio-gnome",
"escritorio-kde"
],
"dependientes_total": 28
"dependientes_total": 29
},
"igrep": {
"iname": "igrep",
@@ -8717,9 +8719,10 @@
"perfiles": [
"escritorio-cosmic",
"escritorio-gnome",
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 2
"dependientes_total": 3
},
"jsonnet-bundler": {
"iname": "jsonnet-bundler",
@@ -8994,7 +8997,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 45
"dependientes_total": 46
},
"katana": {
"iname": "katana",
@@ -9145,7 +9148,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 26
"dependientes_total": 27
},
"kbd": {
"iname": "kbd",
@@ -9228,7 +9231,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 38
"dependientes_total": 39
},
"kbs2": {
"iname": "kbs2",
@@ -9489,7 +9492,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 50
"dependientes_total": 51
},
"kcolorscheme": {
"iname": "kcolorscheme",
@@ -9526,7 +9529,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 47
"dependientes_total": 48
},
"kcompletion": {
"iname": "kcompletion",
@@ -9562,7 +9565,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 42
"dependientes_total": 43
},
"kconfig": {
"iname": "kconfig",
@@ -9594,7 +9597,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 64
"dependientes_total": 65
},
"kconfigwidgets": {
"iname": "kconfigwidgets",
@@ -9634,7 +9637,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 42
"dependientes_total": 43
},
"kcoreaddons": {
"iname": "kcoreaddons",
@@ -9667,7 +9670,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 71
"dependientes_total": 72
},
"kcrash": {
"iname": "kcrash",
@@ -9699,7 +9702,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 42
"dependientes_total": 43
},
"kdbusaddons": {
"iname": "kdbusaddons",
@@ -9730,7 +9733,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 36
"dependientes_total": 37
},
"kdeclarative": {
"iname": "kdeclarative",
@@ -10109,7 +10112,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 37
"dependientes_total": 38
},
"kglobalacceld": {
"iname": "kglobalacceld",
@@ -10216,7 +10219,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 49
"dependientes_total": 50
},
"kholidays": {
"iname": "kholidays",
@@ -10283,7 +10286,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 63
"dependientes_total": 64
},
"kibi": {
"iname": "kibi",
@@ -10339,7 +10342,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 41
"dependientes_total": 42
},
"kidletime": {
"iname": "kidletime",
@@ -10558,7 +10561,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 37
"dependientes_total": 38
},
"kirigami": {
"iname": "kirigami",
@@ -10592,7 +10595,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 36
"dependientes_total": 37
},
"kirigami-addons": {
"iname": "kirigami-addons",
@@ -10633,7 +10636,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 7
"dependientes_total": 8
},
"kitemmodels": {
"iname": "kitemmodels",
@@ -10665,7 +10668,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 16
"dependientes_total": 17
},
"kitemviews": {
"iname": "kitemviews",
@@ -10696,7 +10699,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 41
"dependientes_total": 42
},
"kiterunner": {
"iname": "kiterunner",
@@ -10749,7 +10752,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 39
"dependientes_total": 40
},
"kluctl": {
"iname": "kluctl",
@@ -11002,7 +11005,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 32
"dependientes_total": 33
},
"knotifyconfig": {
"iname": "knotifyconfig",
@@ -11291,7 +11294,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 31
"dependientes_total": 32
},
"kparts": {
"iname": "kparts",
@@ -11429,7 +11432,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 1
"dependientes_total": 2
},
"kplotting": {
"iname": "kplotting",
@@ -11946,7 +11949,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 41
"dependientes_total": 42
},
"kstatusnotifieritem": {
"iname": "kstatusnotifieritem",
@@ -11990,7 +11993,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 8
"dependientes_total": 9
},
"ksvg": {
"iname": "ksvg",
@@ -12683,7 +12686,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 7
"dependientes_total": 8
},
"kwidgetsaddons": {
"iname": "kwidgetsaddons",
@@ -12715,7 +12718,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 53
"dependientes_total": 54
},
"kwin": {
"iname": "kwin",
@@ -12879,7 +12882,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 48
"dependientes_total": 49
},
"kxmlgui": {
"iname": "kxmlgui",
@@ -12926,7 +12929,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 38
"dependientes_total": 39
},
"kyverno": {
"iname": "kyverno",
@@ -12996,7 +12999,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 5
"dependientes_total": 6
},
"lazydocker": {
"iname": "lazydocker",
@@ -13287,7 +13290,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 62
"dependientes_total": 63
},
"libXau": {
"iname": "libXau",
@@ -13309,7 +13312,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 69
"dependientes_total": 70
},
"libXcursor": {
"iname": "libXcursor",
@@ -13360,7 +13363,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 69
"dependientes_total": 70
},
"libXext": {
"iname": "libXext",
@@ -13387,7 +13390,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 48
"dependientes_total": 49
},
"libXfixes": {
"iname": "libXfixes",
@@ -13414,7 +13417,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 50
"dependientes_total": 51
},
"libXfont2": {
"iname": "libXfont2",
@@ -13469,7 +13472,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 47
"dependientes_total": 48
},
"libXrender": {
"iname": "libXrender",
@@ -13496,7 +13499,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 48
"dependientes_total": 49
},
"libXtst": {
"iname": "libXtst",
@@ -13770,7 +13773,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 150
"dependientes_total": 151
},
"libelogind": {
"iname": "libelogind",
@@ -13816,7 +13819,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 22
"dependientes_total": 23
},
"libevdev": {
"iname": "libevdev",
@@ -13881,7 +13884,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 115
"dependientes_total": 116
},
"libffi-shared": {
"iname": "libffi-shared",
@@ -14089,7 +14092,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 21
"dependientes_total": 22
},
"libksba": {
"iname": "libksba",
@@ -14489,7 +14492,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 31
"dependientes_total": 32
},
"libpng-pic": {
"iname": "libpng-pic",
@@ -14534,7 +14537,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 34
"dependientes_total": 35
},
"libpthread-stubs": {
"iname": "libpthread-stubs",
@@ -14935,7 +14938,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 69
"dependientes_total": 70
},
"libxcvt": {
"iname": "libxcvt",
@@ -14987,7 +14990,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 118
"dependientes_total": 119
},
"libxkbfile": {
"iname": "libxkbfile",
@@ -15972,7 +15975,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 147
"dependientes_total": 148
},
"mesa-llvmpipe": {
"iname": "mesa-llvmpipe",
@@ -16069,7 +16072,7 @@
"escritorio-sway",
"servidor"
],
"dependientes_total": 127
"dependientes_total": 128
},
"micro": {
"iname": "micro",
@@ -18019,7 +18022,7 @@
"escritorio-sway",
"servidor"
],
"dependientes_total": 87
"dependientes_total": 88
},
"pcre2-shared": {
"iname": "pcre2-shared",
@@ -18281,7 +18284,7 @@
"escritorio-kde",
"escritorio-sway"
],
"dependientes_total": 14
"dependientes_total": 15
},
"pixi": {
"iname": "pixi",
@@ -18351,7 +18354,7 @@
"escritorio-sway",
"servidor"
],
"dependientes_total": 400
"dependientes_total": 402
},
"plasma-activities": {
"iname": "plasma-activities",
@@ -18859,7 +18862,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 16
"dependientes_total": 17
},
"plasma-workspace": {
"iname": "plasma-workspace",
@@ -19919,7 +19922,7 @@
"escritorio-sway",
"servidor"
],
"dependientes_total": 318
"dependientes_total": 320
},
"qcoro": {
"iname": "qcoro",
@@ -20187,7 +20190,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 9
"dependientes_total": 10
},
"qtbase": {
"iname": "qt6-qtbase",
@@ -20234,7 +20237,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 121
"dependientes_total": 122
},
"qtdeclarative": {
"iname": "qt6-qtdeclarative",
@@ -20266,7 +20269,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 90
"dependientes_total": 91
},
"qtkeychain": {
"iname": "qtkeychain",
@@ -20495,7 +20498,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 33
"dependientes_total": 34
},
"qttools": {
"iname": "qt6-qttools",
@@ -20524,7 +20527,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 103
"dependientes_total": 104
},
"qtwayland": {
"iname": "qt6-qtwayland",
@@ -20565,7 +20568,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 14
"dependientes_total": 15
},
"rage": {
"iname": "rage",
@@ -21156,7 +21159,7 @@
"escritorio-sway",
"servidor"
],
"dependientes_total": 270
"dependientes_total": 272
},
"sassc": {
"iname": "sassc",
@@ -21691,7 +21694,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 40
"dependientes_total": 41
},
"sonnet": {
"iname": "sonnet",
@@ -21723,7 +21726,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 40
"dependientes_total": 41
},
"sonobuoy": {
"iname": "sonobuoy",
@@ -24392,7 +24395,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 161
"dependientes_total": 162
},
"wayland-protocols": {
"iname": "wayland-protocols",
@@ -24420,7 +24423,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 58
"dependientes_total": 59
},
"websocketd": {
"iname": "websocketd",
@@ -24761,7 +24764,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 33
"dependientes_total": 34
},
"xcb-util-cursor": {
"iname": "xcb-util-cursor",
@@ -24790,7 +24793,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 7
"dependientes_total": 8
},
"xcb-util-image": {
"iname": "xcb-util-image",
@@ -24818,7 +24821,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 32
"dependientes_total": 33
},
"xcb-util-keysyms": {
"iname": "xcb-util-keysyms",
@@ -24845,7 +24848,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 33
"dependientes_total": 34
},
"xcb-util-renderutil": {
"iname": "xcb-util-renderutil",
@@ -24872,7 +24875,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 32
"dependientes_total": 33
},
"xcb-util-wm": {
"iname": "xcb-util-wm",
@@ -24899,7 +24902,131 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 32
"dependientes_total": 33
},
"xdg-desktop-portal": {
"iname": "xdg-desktop-portal",
"version": "1.18.4",
"link": "dynamic",
"compiler": "zig-cc",
"deps": [
"fuse3",
"gdk-pixbuf",
"glib",
"json-glib",
"libffi",
"libpng",
"meson",
"pcre2",
"pipewire",
"pkgconf",
"python3",
"samurai",
"zlib"
],
"cls": "c",
"queue": "incoming-kde",
"foreign": false,
"hash": "b3:ecbe13f68eca66e5f20cd15ce37f05054d357b5fafb9dbb1753f4fe6e11572b8",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 0
},
"xdg-desktop-portal-kde": {
"iname": "xdg-desktop-portal-kde",
"version": "6.7.2",
"link": "dynamic",
"compiler": "zig-cc",
"deps": [
"attica",
"cmake",
"dbus",
"extra-cmake-modules",
"gettext-tiny",
"icu4c",
"karchive",
"kauth",
"kbookmarks",
"kcodecs",
"kcolorscheme",
"kcompletion",
"kconfig",
"kconfigwidgets",
"kcoreaddons",
"kcrash",
"kdbusaddons",
"kglobalaccel",
"kguiaddons",
"ki18n",
"kiconthemes",
"kio",
"kirigami",
"kirigami-addons",
"kitemmodels",
"kitemviews",
"kjobwidgets",
"knotifications",
"kpackage",
"kpipewire",
"kservice",
"kstatusnotifieritem",
"kwayland",
"kwidgetsaddons",
"kwindowsystem",
"kxmlgui",
"layer-shell-qt",
"libX11",
"libXau",
"libXdmcp",
"libXext",
"libXfixes",
"libXi",
"libXrender",
"libdrm",
"libepoxy",
"libjpeg-turbo-shared",
"libpng-shared",
"libxcb",
"libxkbcommon",
"mesa",
"pkgconf",
"plasma-wayland-protocols",
"python3",
"qt5compat",
"qtbase",
"qtdeclarative",
"qtsvg",
"qttools",
"qtwayland",
"samurai",
"solid",
"sonnet",
"wayland",
"wayland-protocols",
"xcb-util",
"xcb-util-cursor",
"xcb-util-image",
"xcb-util-keysyms",
"xcb-util-renderutil",
"xcb-util-wm",
"xorgproto",
"zlib-shared"
],
"cls": "c",
"queue": "incoming-kde",
"foreign": false,
"hash": "b3:c2f0412b2623befdc21fcf35a8881707911939cd11f96084c8d8fb2a2382658c",
"state": "sealed",
"blocked_by": [],
"unblocks": 0,
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 0
},
"xh": {
"iname": "xh",
@@ -24991,7 +25118,7 @@
"perfiles": [
"escritorio-kde"
],
"dependientes_total": 77
"dependientes_total": 78
},
"xorriso": {
"iname": "xorriso",
@@ -25453,7 +25580,7 @@
"escritorio-sway",
"servidor"
],
"dependientes_total": 116
"dependientes_total": 117
},
"zlib-ng": {
"iname": "zlib-ng",
@@ -25495,7 +25622,7 @@
"escritorio-mirada",
"escritorio-sway"
],
"dependientes_total": 87
"dependientes_total": 88
},
"zola": {
"iname": "zola",
+1 -1
View File
@@ -40,7 +40,7 @@
},
"escritorio-kde": {
"grafo": "docs/state/build-state-kde.json",
"nodos": 357,
"nodos": 362,
"en_deuda": 0,
"ondas": 0,
"profundidad": 0,
+15
View File
@@ -268,6 +268,21 @@ paquetes = [
# shell hace `imports.gi.UPowerGlib`, pero powerdevil habla D-Bus con `org.freedesktop.UPower` y
# no toca el typelib. Apagarla evita copiar cuatro recetas más de introspección a esta cola.
"upower",
# ── PORTALES: sin esto NO SE COMPARTE PANTALLA (añadido 2026-09-09) ───────────────────────────
# ⚠ Segundo hueco que dejaba a KDE por debajo de una instalación estándar. Medido recorriendo los
# `.service` de D-Bus de TODO el store: los únicos backends de portal sellados eran los de COSMIC
# y GNOME. Ninguno de KDE — y esta cola no tenía ni el frontend. Consecuencia concreta: la imagen
# trae `obs-studio` con su plugin linux-pipewire, que captura pantalla POR EL PORTAL, así que en
# Plasma no tenía con quién hablar mientras en los otros dos ese frente estaba cerrado.
# Van los DOS porque la cadena es de tres: cliente → org.freedesktop.portal.Desktop [frontend] →
# org.freedesktop.impl.portal.* [backend]. El frontend comparte artefacto con el de COSMIC (hash
# idéntico ⇒ un solo directorio en el store, cero builds).
# ⚠ El backend va SIN el portal de impresión, y no es un recorte por comodidad: no hay ninguna
# receta de cups en el catálogo ⇒ qtbase se construyó sin CUPS ⇒ no existe `qcups_p.h` y
# `src/print.cpp` no compila. Un portal de impresión sin con qué imprimir es código muerto. El
# backend tampoco lo ANUNCIA ya en su `kde.portal` (verificado: 0 apariciones de Print), que es lo
# que evita que el frontend enrute a un portal que no contesta.
"xdg-desktop-portal", "xdg-desktop-portal-kde",
]
[perfil.escritorio-gnome]
@@ -0,0 +1,135 @@
# xdg-desktop-portal-kde 6.7.2 — el BACKEND de portales de Plasma, y el segundo de los dos huecos
# que dejaban a KDE por debajo de una instalación estándar.
#
# ══ QUÉ FALTABA, MEDIDO ════════════════════════════════════════════════════════════════════════
# El 2026-09-09 se recorrieron los `.service` de D-Bus de TODO el store: los únicos backends de
# portal sellados eran `org.freedesktop.impl.portal.desktop.cosmic` y `.desktop.gnome`. **Ninguno de
# KDE**, y la cola `incoming-kde` no tenía ni siquiera el frontend `xdg-desktop-portal`.
# Consecuencia concreta y no hipotética: la imagen KDE trae `obs-studio` con su plugin
# `linux-pipewire`, que captura pantalla **por el portal** — o sea que en Plasma no tenía con quién
# hablar, mientras que en GNOME y COSMIC ese frente está cerrado. Sin portal tampoco hay diálogo de
# fichero ni compartir pantalla para nada que los use.
#
# ══ LA CADENA ES DE TRES, Y ESTE PAQUETE ES EL TERCERO ═════════════════════════════════════════
# La cabecera de `xdg-desktop-portal.toml` ya lo explica y vale igual acá:
# cliente → org.freedesktop.portal.Desktop → [frontend] → org.freedesktop.impl.portal.* → [este]
# El frontend registra el nombre que los clientes buscan y enruta; **este paquete es el que
# implementa los diálogos con Qt/KF6 y habla con kwin**. Hacen falta LOS DOS: por eso en la misma
# tanda se copió `xdg-desktop-portal` a esta cola (comparte artefacto con el de COSMIC, hash
# idéntico ⇒ cero builds).
#
# ══ VERSIÓN PEGADA A PLASMA, NO LA ÚLTIMA ══════════════════════════════════════════════════════
# 6.7.2 es la MISMA que `plasma-workspace`, `kwin` y `kscreenlocker` de esta cola. El backend habla
# interfaces privadas de kwin para el ScreenCast, así que desalinear versiones acá no es una
# preferencia: es pedir que dos mitades del mismo release se entiendan por casualidad.
#
# ══ CERO FRONTERA NUEVA ════════════════════════════════════════════════════════════════════════
# Su `CMakeLists.txt` pide Qt6 (Core, Concurrent, DBus, PrintSupport, QuickWidgets, Widgets,
# WaylandClient, Quick, QuickControls2, Qml), KF6 (CoreAddons, Config, I18n, GlobalAccel, KIO,
# Kirigami, Notifications, Service, WidgetsAddons, WindowSystem, IconThemes, StatusNotifierItem,
# Crash), KWayland, Wayland, PlasmaWaylandProtocols, WaylandProtocols y xkbcommon.
# **Las 22 ya estaban en el catálogo** (verificado una por una antes de escribir esto): no hay una
# sola receta nueva debajo.
#
# ⚠ `kpipewire` va en [deps] aunque el CMakeLists NO la pida: sus QML (`PipeWireDelegate.qml`,
# `PipeWireLayout.qml`) importan el módulo `org.kde.pipewire` para la PREVISUALIZACIÓN del selector
# de pantalla. Es una dep de RUNTIME que ningún `find_package` delata — el patrón de `libnotify` en
# atuq y de `xkbcomp` en xwayland. Sin ella el backend compila, arranca, y el diálogo de compartir
# pantalla sale sin miniatura.
#
# `KIOFuse` se deja fuera: su propio `set_package_properties` la declara `TYPE RUNTIME` y sirve para
# montar URLs remotas, que esta distro no hace.
name = "xdg-desktop-portal-kde"
version = "6.7.2"
# licencia: CONTADAS las etiquetas SPDX de todos los .cpp/.h/.qml del tarball, no leída una y
# generalizada —que es lo que hice primero y salía mal—: 88 ficheros `LGPL-2.0-or-later`, 23
# `LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL` (la fórmula de KDE e.V. para
# aceptar futuras LGPL) y 1 `GPL-2.0-or-later`. El binario los enlaza a todos, así que la expresión
# es la CONJUNCIÓN. `LicenseRef-KDE-Accepted-LGPL` no tiene texto canónico en licenses/: el guardián
# avisará y no vetará, que es lo correcto.
license = "LGPL-2.0-or-later AND (LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL) AND GPL-2.0-or-later"
[source]
tarball = "https://download.kde.org/stable/plasma/6.7.2/xdg-desktop-portal-kde-6.7.2.tar.xz"
sha256 = "d09974dda417dfa519dd64d9cd19061c7c091308aa22a7ad8ad32601584ddad0"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
flags = []
[build.phases]
configure = '''
rm -rf po
# ⚠ SE QUITA EL PORTAL DE IMPRESIÓN, y no es un atajo: **la distro no tiene stack de impresión**.
# El build muere en `src/print.cpp:27` con `'QtPrintSupport/private/qcups_p.h' file not found`, y la
# cadena causal está medida entera:
# no hay NINGUNA receta de cups en el catálogo ⇒ qtbase 6.11.1 se construyó sin CUPS ⇒ su
# `QtPrintSupport/private/` existe pero sólo trae qpaintengine_alpha_p.h y qprintengine_pdf_p.h,
# NO qcups_p.h ⇒ el backend de impresión no puede compilar.
# O sea que no falta una cabecera: falta el subsistema, y un portal de impresión sin con qué imprimir
# no es una funcionalidad que se pierde, es código muerto que no enlaza.
# Upstream no expone `option()` para portales —se compilan todos—, así que se corta en tres sitios y
# NO en uno solo: la fuente, la instanciación y la lista de interfaces que el backend ANUNCIA. Dejar
# el anuncio sin la implementación sería peor que no tenerlo: el frontend enrutaría a un portal que
# no responde. Cada `sed` lleva su verificación al lado, que es lo que delata un cambio de upstream.
sed -i '/^ *print\.cpp$/d;/^ *print\.h$/d' src/CMakeLists.txt
grep -q 'print\.cpp' src/CMakeLists.txt && { echo '!! print.cpp sigue en las fuentes'; exit 1; }
sed -i '/#include "print\.h"/d;/m_print(new PrintPortal(this))/d' src/desktopportal.cpp
sed -i '/class PrintPortal;/d;/PrintPortal \*const m_print;/d' src/desktopportal.h
grep -q 'PrintPortal' src/desktopportal.cpp src/desktopportal.h && { echo '!! queda PrintPortal'; exit 1; }
# La lista de `Interfaces=` es una sola línea con `;` — se saca sólo el token de Print.
sed -i 's/org\.freedesktop\.impl\.portal\.Print;//' data/kde.portal
grep -q 'impl\.portal\.Print' data/kde.portal && { echo '!! kde.portal sigue anunciando Print'; exit 1; }
ZW="$PWD/.zwrap"; mkdir -p "$ZW"
cat > "$ZW/cc" <<'W'
#!/bin/sh
a=""; for x in "$@"; do [ "$x" = "-Wl,--fatal-warnings" ] && continue; a="$a $x"; done
exec /opt/zig/zig cc -mcpu=baseline $a
W
cat > "$ZW/cxx" <<'W'
#!/bin/sh
a=""; for x in "$@"; do [ "$x" = "-Wl,--fatal-warnings" ] && continue; a="$a $x"; done
exec /opt/zig/zig c++ -mcpu=baseline $a
W
chmod +x "$ZW/cc" "$ZW/cxx"
cmake -B build -G Ninja -Wno-dev \
-DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" -DCMAKE_ASM_COMPILER="$ZW/cc" \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_PREFIX_PATH=/usr \
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF -DBUILD_TESTING=OFF
'''
compile = "cmake --build build"
install = '''
set -e
DESTDIR=/out cmake --install build
# Guardián: lo que hace que este paquete SIRVA es el `.service` de D-Bus con el nombre de backend.
# Sin él el artefacto sella, el binario está en la imagen y el frontend nunca lo encuentra — el
# mismo «instalado ≠ activo» que ya se pagó con las extensiones de GNOME.
test -s /out/usr/share/dbus-1/services/org.freedesktop.impl.portal.desktop.kde.service
# Y el fichero que le dice al frontend QUÉ interfaces implementa este backend.
test -s /out/usr/share/xdg-desktop-portal/portals/kde.portal
'''
[deps]
# ⚠ RUNTIME: `kpipewire` la importan sus QML por `org.kde.pipewire` para la previsualización del
# selector de pantalla, y ningún find_package la delata.
runtime = ["kpipewire"]
# La clausura ENTERA (las deps de hammer no son transitivas). Base tomada de `spectacle`, que es el
# otro consumidor de Qt6+KF6+wayland de esta cola, menos lo suyo (tesseract/opencv/zxing) y más lo
# que este CMakeLists pide y aquélla no.
build = ["cmake", "samurai", "python3", "pkgconf", "extra-cmake-modules", "qttools", "gettext-tiny",
"qtbase", "qtsvg", "qtdeclarative", "qtwayland", "qt5compat", "dbus",
"wayland", "wayland-protocols", "plasma-wayland-protocols", "kwayland", "layer-shell-qt",
"kcoreaddons", "kconfig", "ki18n", "kglobalaccel", "kio", "kirigami", "kirigami-addons",
"knotifications", "kservice", "kwidgetsaddons", "kwindowsystem", "kiconthemes",
"kstatusnotifieritem", "kcrash", "kdbusaddons", "kxmlgui", "kguiaddons", "kpackage",
"kcolorscheme", "kcompletion", "kjobwidgets", "kconfigwidgets", "kitemviews", "kcodecs",
"karchive", "kbookmarks", "sonnet", "attica", "icu4c", "solid", "kauth", "kitemmodels",
"mesa", "libdrm", "libxkbcommon", "libepoxy", "libpng-shared", "libjpeg-turbo-shared",
"zlib-shared", "libX11", "xorgproto", "libXau", "libXdmcp", "libXext", "libXrender", "libXfixes",
"libXi", "libxcb", "xcb-util", "xcb-util-keysyms", "xcb-util-wm", "xcb-util-image",
"xcb-util-cursor", "xcb-util-renderutil"]
@@ -0,0 +1,101 @@
# xdg-desktop-portal 1.18.4 — **EL FRONTEND**, y el eslabón que faltaba de verdad.
#
# ── POR QUÉ ESTE PAQUETE Y NO EL BACKEND ────────────────────────────────────────────────────────
# `cosmic-screenshot` muere con
# The name org.freedesktop.portal.Desktop was not provided by any .service files
# y la tentación es construir `xdg-desktop-portal-cosmic`. No alcanza: ese declara
# `DBUS_NAME = "org.freedesktop.impl.portal.desktop.cosmic"` (`src/main.rs:27`), o sea que es
# **backend** y NO toma el nombre que los clientes buscan. La cadena es de TRES:
# cliente → org.freedesktop.portal.Desktop → [este paquete] → org.freedesktop.impl.portal.* → backend
# Éste es el que registra el nombre, enruta a los backends y aplica la política de permisos.
#
# ── POR QUÉ 1.18.4 Y NO LA ÚLTIMA (1.22.1) ──────────────────────────────────────────────────────
# Por **gstreamer**. Desde la 1.20, `meson.build` pide
# `dependency('gstreamer-pbutils-1.0')` sin `required:` —para validar sonidos de notificación—, y eso
# arrastra gstreamer + gst-plugins-base, que no están en el corpus y son una torre de C entera para
# una función accesoria. La 1.18.4 no lo pide: sus deps duras son glib/gio/gio-unix, json-glib,
# fuse3, gdk-pixbuf y pipewire, y de ésas **la única que faltaba era fuse3**.
# Es un pin deliberado, no una casualidad de versión: el día que se quiera 1.22 el precio es
# gstreamer, y conviene que esté escrito acá.
#
# ── LO QUE SE APAGA ─────────────────────────────────────────────────────────────────────────────
# `libportal` — sólo lo usa el portal de «background»; es otra librería más y no hace falta.
# `geoclue` — no hay servicio de geolocalización en la imagen.
# `systemd` — el PID1 es arje-zero; sin unidades de usuario.
# `sandboxed-image-validation` — valida miniaturas dentro de un `bwrap`; la imagen no trae bwrap.
# Apagarlo NO apaga la validación, la corre sin sandbox (upstream avisa con un
# `warning()`), que es lo que corresponde en una imagen donde el portal ya corre como
# el mismo usuario que las aplicaciones.
# `docbook-docs`/`pytest` — documentación y tests.
name = "xdg-desktop-portal"
version = "1.18.4"
license = "LGPL-2.1-or-later"
[source]
tarball = "https://github.com/flatpak/xdg-desktop-portal/releases/download/1.18.4/xdg-desktop-portal-1.18.4.tar.xz"
sha256 = "b858aa1e74e80c862790dbb912906e6eab8b1e4db9339cd759473af62b461e65"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
zig_version = "0.13.0"
[build.phases]
# ── EL CHOQUE DE gvdb, Y POR QUÉ `--allow-multiple-definition` ACÁ ES CORRECTO Y NO UN PARCHE ───
# ld.lld: error: duplicate symbol: gvdb_table_get_table
# >>> document-portal/xdg-permission-store.p/gvdb_gvdb-reader.c.o
# >>> .._subprojects_gvdb_gvdb-reader.c.o in archive /usr/lib/libgio-2.0.a
# El portal trae su copia vendorizada de gvdb en `document-portal/gvdb/`, y **glib también la lleva
# adentro** (la usa para GSettings). Con glib DINÁMICA esos símbolos quedan escondidos dentro del
# `.so` y nadie choca; con la ESTÁTICA el `.a` los expone y el enlazador ve dos definiciones. Es el
# mismo fenómeno que hace «cara» a la glib estática.
#
# **Se resuelve RENOMBRANDO los diez símbolos del lector con `-D`**, que es lo que queda cuando se
# descartan los otros dos caminos —y los dos se descartaron por medición, no por gusto:
#
# · `-Wl,--allow-multiple-definition` (o `-z muldefs`): **zig-cc no lo acepta**. Falla con
# `error: unsupported linker arg: --allow-multiple-definition` durante el chequeo de cordura, y
# meson lo reporta como `ERROR: Compiler takana-zig-cc cannot compile programs` — un mensaje que
# manda a buscar el problema en el compilador cuando está en la bandera. (De paso: pasarla por
# `-Dc_link_args=` tampoco sirve, porque las opciones de lista de meson se parten por COMAS y
# `-Wl,--allow-multiple-definition` llega como dos elementos.)
# · Ir a `glib-shared` **no sería cambiar una dep sino abrir una cadena**: json-glib y gdk-pixbuf
# también enlazan glib, y mezclar una glib dinámica con dos estáticas en el mismo proceso es
# justo el problema de las dos glib que la campaña GNOME midió y evitó. Habría que rehacer los
# tres y meter la glib compartida en la imagen.
#
# El renombrado es total y por eso es seguro: el `-D` afecta a la vez a la DEFINICIÓN
# (`gvdb-reader.c`) y a los USOS, porque todos pasan por `gvdb-reader.h`. El binario queda con el par
# lector+constructor de la copia del portal, coherente — que importa porque glib empaqueta
# únicamente el LECTOR (para GSettings) y el CONSTRUCTOR (`gvdb-builder.c`) existe sólo acá.
#
# Va por `CFLAGS` y no por `-Dc_args=` por el mismo problema de las comas.
#
# El `sed` saca aparte `subdir('tests')`, que en 1.18.4 es INCONDICIONAL —no hay opción de meson que
# lo apague— y compila binarios de prueba que no se instalan.
#
# Ojo con el `sed`: **borrar la línea a secas no basta**. En meson `subdir()` comparte el ámbito de
# variables, y `tests/meson.build:276` define `enable_pytest`, que el `summary()` de la raíz lee en
# `meson.build:201` — al sacar el `subdir` la configuración muere con
# `ERROR: Unknown variable "enable_pytest"`. Por eso se SUSTITUYE por la asignación, en vez de
# borrar: el subdirectorio no es sólo trabajo, también es una dependencia de datos.
configure = '''
rm -rf output
sed -i "s/^subdir('tests')$/enable_pytest = false/" meson.build
GVDB=""
for s in table_free table_get_names table_get_raw_value table_get_table table_get_value \
table_has_value table_is_valid table_list table_new table_new_from_bytes; do
GVDB="$GVDB -Dgvdb_$s=xdp_gvdb_$s"
done
export CFLAGS="$GVDB"
PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig meson setup output --prefix=/usr --buildtype=release --wrap-mode=nodownload -Dlibportal=disabled -Dgeoclue=disabled -Dsystemd=disabled -Dsandboxed-image-validation=false -Ddocbook-docs=disabled -Dpytest=disabled -Dinstalled-tests=false
'''
compile = "ninja -C output"
install = "DESTDIR=/out ninja -C output install"
[deps]
# glib aporta gio/gio-unix **y `gdbus-codegen`**, que el build usa para generar los stubs de las
# ~20 interfaces de portal a partir de los XML de `data/`. libffi/pcre2/zlib son la clausura de
# pkg-config que declara el `.pc` de glib; libpng la que declara el de gdk-pixbuf.
build = ["meson", "samurai", "python3", "pkgconf", "glib", "json-glib", "fuse3", "gdk-pixbuf", "pipewire", "libffi", "pcre2", "zlib", "libpng"]