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…
⎇ 84e3737e10e17927380ed3e232e50cebfdd39123
recipes/incoming-kde/xdg-desktop-portal-kde.toml
History
raw
kde: los portales — segundo hueco cerrado, y OBS ya tiene con quién hablar
1# xdg-desktop-portal-kde 6.7.2 — el BACKEND de portales de Plasma, y el segundo de los dos huecos
2# que dejaban a KDE por debajo de una instalación estándar.
3#
4# ══ QUÉ FALTABA, MEDIDO ════════════════════════════════════════════════════════════════════════
5# El 2026-09-09 se recorrieron los `.service` de D-Bus de TODO el store: los únicos backends de
6# portal sellados eran `org.freedesktop.impl.portal.desktop.cosmic` y `.desktop.gnome`. **Ninguno de
7# KDE**, y la cola `incoming-kde` no tenía ni siquiera el frontend `xdg-desktop-portal`.
8# Consecuencia concreta y no hipotética: la imagen KDE trae `obs-studio` con su plugin
9# `linux-pipewire`, que captura pantalla **por el portal** — o sea que en Plasma no tenía con quién
10# hablar, mientras que en GNOME y COSMIC ese frente está cerrado. Sin portal tampoco hay diálogo de
11# fichero ni compartir pantalla para nada que los use.
12#
13# ══ LA CADENA ES DE TRES, Y ESTE PAQUETE ES EL TERCERO ═════════════════════════════════════════
14# La cabecera de `xdg-desktop-portal.toml` ya lo explica y vale igual acá:
15# cliente → org.freedesktop.portal.Desktop → [frontend] → org.freedesktop.impl.portal.* → [este]
16# El frontend registra el nombre que los clientes buscan y enruta; **este paquete es el que
17# implementa los diálogos con Qt/KF6 y habla con kwin**. Hacen falta LOS DOS: por eso en la misma
18# tanda se copió `xdg-desktop-portal` a esta cola (comparte artefacto con el de COSMIC, hash
19# idéntico ⇒ cero builds).
20#
21# ══ VERSIÓN PEGADA A PLASMA, NO LA ÚLTIMA ══════════════════════════════════════════════════════
22# 6.7.2 es la MISMA que `plasma-workspace`, `kwin` y `kscreenlocker` de esta cola. El backend habla
23# interfaces privadas de kwin para el ScreenCast, así que desalinear versiones acá no es una
24# preferencia: es pedir que dos mitades del mismo release se entiendan por casualidad.
25#
26# ══ CERO FRONTERA NUEVA ════════════════════════════════════════════════════════════════════════
27# Su `CMakeLists.txt` pide Qt6 (Core, Concurrent, DBus, PrintSupport, QuickWidgets, Widgets,
28# WaylandClient, Quick, QuickControls2, Qml), KF6 (CoreAddons, Config, I18n, GlobalAccel, KIO,
29# Kirigami, Notifications, Service, WidgetsAddons, WindowSystem, IconThemes, StatusNotifierItem,
30# Crash), KWayland, Wayland, PlasmaWaylandProtocols, WaylandProtocols y xkbcommon.
31# **Las 22 ya estaban en el catálogo** (verificado una por una antes de escribir esto): no hay una
32# sola receta nueva debajo.
33#
34# ⚠ `kpipewire` va en [deps] aunque el CMakeLists NO la pida: sus QML (`PipeWireDelegate.qml`,
35# `PipeWireLayout.qml`) importan el módulo `org.kde.pipewire` para la PREVISUALIZACIÓN del selector
36# de pantalla. Es una dep de RUNTIME que ningún `find_package` delata — el patrón de `libnotify` en
37# atuq y de `xkbcomp` en xwayland. Sin ella el backend compila, arranca, y el diálogo de compartir
38# pantalla sale sin miniatura.
39#
40# `KIOFuse` se deja fuera: su propio `set_package_properties` la declara `TYPE RUNTIME` y sirve para
41# montar URLs remotas, que esta distro no hace.
42name = "xdg-desktop-portal-kde"
43version = "6.7.2"
44# licencia: CONTADAS las etiquetas SPDX de todos los .cpp/.h/.qml del tarball, no leída una y
45# generalizada —que es lo que hice primero y salía mal—: 88 ficheros `LGPL-2.0-or-later`, 23
46# `LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL` (la fórmula de KDE e.V. para
47# aceptar futuras LGPL) y 1 `GPL-2.0-or-later`. El binario los enlaza a todos, así que la expresión
48# es la CONJUNCIÓN. `LicenseRef-KDE-Accepted-LGPL` no tiene texto canónico en licenses/: el guardián
49# avisará y no vetará, que es lo correcto.
50license = "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"
51
52[source]
53tarball = "https://download.kde.org/stable/plasma/6.7.2/xdg-desktop-portal-kde-6.7.2.tar.xz"
54sha256 = "d09974dda417dfa519dd64d9cd19061c7c091308aa22a7ad8ad32601584ddad0"
55
56[build]
57compiler = "zig-cc"
58target = "x86_64-linux-musl"
59link = "dynamic"
60flags = []
61
62[build.phases]
63configure = '''
64rm -rf po
65
66# ⚠ SE QUITA EL PORTAL DE IMPRESIÓN, y no es un atajo: **la distro no tiene stack de impresión**.
67# El build muere en `src/print.cpp:27` con `'QtPrintSupport/private/qcups_p.h' file not found`, y la
68# cadena causal está medida entera:
69# no hay NINGUNA receta de cups en el catálogo ⇒ qtbase 6.11.1 se construyó sin CUPS ⇒ su
70# `QtPrintSupport/private/` existe pero sólo trae qpaintengine_alpha_p.h y qprintengine_pdf_p.h,
71# NO qcups_p.h ⇒ el backend de impresión no puede compilar.
72# O sea que no falta una cabecera: falta el subsistema, y un portal de impresión sin con qué imprimir
73# no es una funcionalidad que se pierde, es código muerto que no enlaza.
74# Upstream no expone `option()` para portales —se compilan todos—, así que se corta en tres sitios y
75# NO en uno solo: la fuente, la instanciación y la lista de interfaces que el backend ANUNCIA. Dejar
76# el anuncio sin la implementación sería peor que no tenerlo: el frontend enrutaría a un portal que
77# no responde. Cada `sed` lleva su verificación al lado, que es lo que delata un cambio de upstream.
78sed -i '/^ *print\.cpp$/d;/^ *print\.h$/d' src/CMakeLists.txt
79grep -q 'print\.cpp' src/CMakeLists.txt && { echo '!! print.cpp sigue en las fuentes'; exit 1; }
80sed -i '/#include "print\.h"/d;/m_print(new PrintPortal(this))/d' src/desktopportal.cpp
81sed -i '/class PrintPortal;/d;/PrintPortal \*const m_print;/d' src/desktopportal.h
82grep -q 'PrintPortal' src/desktopportal.cpp src/desktopportal.h && { echo '!! queda PrintPortal'; exit 1; }
83# La lista de `Interfaces=` es una sola línea con `;` — se saca sólo el token de Print.
84sed -i 's/org\.freedesktop\.impl\.portal\.Print;//' data/kde.portal
85grep -q 'impl\.portal\.Print' data/kde.portal && { echo '!! kde.portal sigue anunciando Print'; exit 1; }
86
87ZW="$PWD/.zwrap"; mkdir -p "$ZW"
88cat > "$ZW/cc" <<'W'
89#!/bin/sh
90a=""; for x in "$@"; do [ "$x" = "-Wl,--fatal-warnings" ] && continue; a="$a $x"; done
91exec /opt/zig/zig cc -mcpu=baseline $a
92W
93cat > "$ZW/cxx" <<'W'
94#!/bin/sh
95a=""; for x in "$@"; do [ "$x" = "-Wl,--fatal-warnings" ] && continue; a="$a $x"; done
96exec /opt/zig/zig c++ -mcpu=baseline $a
97W
98chmod +x "$ZW/cc" "$ZW/cxx"
99cmake -B build -G Ninja -Wno-dev \
100 -DCMAKE_C_COMPILER="$ZW/cc" -DCMAKE_CXX_COMPILER="$ZW/cxx" -DCMAKE_ASM_COMPILER="$ZW/cc" \
101 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_PREFIX_PATH=/usr \
102 -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF -DBUILD_TESTING=OFF
103'''
104compile = "cmake --build build"
105install = '''
106set -e
107DESTDIR=/out cmake --install build
108
109# Guardián: lo que hace que este paquete SIRVA es el `.service` de D-Bus con el nombre de backend.
110# Sin él el artefacto sella, el binario está en la imagen y el frontend nunca lo encuentra — el
111# mismo «instalado ≠ activo» que ya se pagó con las extensiones de GNOME.
112test -s /out/usr/share/dbus-1/services/org.freedesktop.impl.portal.desktop.kde.service
113# Y el fichero que le dice al frontend QUÉ interfaces implementa este backend.
114test -s /out/usr/share/xdg-desktop-portal/portals/kde.portal
115'''
116
117[deps]
118# ⚠ RUNTIME: `kpipewire` la importan sus QML por `org.kde.pipewire` para la previsualización del
119# selector de pantalla, y ningún find_package la delata.
120runtime = ["kpipewire"]
121# La clausura ENTERA (las deps de hammer no son transitivas). Base tomada de `spectacle`, que es el
122# otro consumidor de Qt6+KF6+wayland de esta cola, menos lo suyo (tesseract/opencv/zxing) y más lo
123# que este CMakeLists pide y aquélla no.
124build = ["cmake", "samurai", "python3", "pkgconf", "extra-cmake-modules", "qttools", "gettext-tiny",
125 "qtbase", "qtsvg", "qtdeclarative", "qtwayland", "qt5compat", "dbus",
126 "wayland", "wayland-protocols", "plasma-wayland-protocols", "kwayland", "layer-shell-qt",
127 "kcoreaddons", "kconfig", "ki18n", "kglobalaccel", "kio", "kirigami", "kirigami-addons",
128 "knotifications", "kservice", "kwidgetsaddons", "kwindowsystem", "kiconthemes",
129 "kstatusnotifieritem", "kcrash", "kdbusaddons", "kxmlgui", "kguiaddons", "kpackage",
130 "kcolorscheme", "kcompletion", "kjobwidgets", "kconfigwidgets", "kitemviews", "kcodecs",
131 "karchive", "kbookmarks", "sonnet", "attica", "icu4c", "solid", "kauth", "kitemmodels",
132 "mesa", "libdrm", "libxkbcommon", "libepoxy", "libpng-shared", "libjpeg-turbo-shared",
133 "zlib-shared", "libX11", "xorgproto", "libXau", "libXdmcp", "libXext", "libXrender", "libXfixes",
134 "libXi", "libxcb", "xcb-util", "xcb-util-keysyms", "xcb-util-wm", "xcb-util-image",
135 "xcb-util-cursor", "xcb-util-renderutil"]