2025-07-24 13:55:40 +02:00

195 lines
4.8 KiB
Nix

{
lib,
fetchFromGitHub,
flatpak,
fuse3,
bubblewrap,
docutils,
systemdMinimal,
geoclue2,
glib,
gsettings-desktop-schemas,
json-glib,
meson,
ninja,
nixosTests,
pipewire,
gdk-pixbuf,
librsvg,
gobject-introspection,
python3,
pkg-config,
stdenv,
runCommand,
wrapGAppsNoGuiHook,
bash,
dbus,
gst_all_1,
libgudev,
umockdev,
replaceVars,
enableGeoLocation ? true,
enableSystemd ? true,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "xdg-desktop-portal";
version = "1.20.3";
outputs = [
"out"
"installedTests"
];
src = fetchFromGitHub {
owner = "flatpak";
repo = "xdg-desktop-portal";
tag = finalAttrs.version;
hash = "sha256-ntTGEsk8GlXkp3i9RtF+T7jqnNdL2GVbu05d68WVTYc=";
};
patches = [
# The icon validator copied from Flatpak needs to access the gdk-pixbuf loaders
# in the Nix store and cannot bind FHS paths since those are not available on NixOS.
(replaceVars ./fix-icon-validation.patch {
inherit (builtins) storeDir;
})
# Same for the sound validator, except the gdk-pixbuf part.
(replaceVars ./fix-sound-validation.patch {
inherit (builtins) storeDir;
})
# Allow installing installed tests to a separate output.
./installed-tests-path.patch
# Look for portal definitions under path from `NIX_XDG_DESKTOP_PORTAL_DIR` environment variable.
# While upstream has `XDG_DESKTOP_PORTAL_DIR`, it is meant for tests and actually blocks
# any configs from being loaded from anywhere else.
./nix-pkgdatadir-env.patch
# test tries to read /proc/cmdline, which is not intended to be accessible in the sandbox
./trash-test.patch
];
nativeBuildInputs = [
docutils # for rst2man
glib
meson
ninja
pkg-config
wrapGAppsNoGuiHook
];
buildInputs = [
flatpak
fuse3
bubblewrap
glib
gsettings-desktop-schemas
json-glib
pipewire
gst_all_1.gst-plugins-base
libgudev
# For icon validator
gdk-pixbuf
librsvg
bash
]
++ lib.optionals enableGeoLocation [
geoclue2
]
++ lib.optionals enableSystemd [
systemdMinimal # libsystemd
];
nativeCheckInputs = [
dbus
gdk-pixbuf
gst_all_1.gstreamer
gst_all_1.gst-plugins-good
gobject-introspection
# NB: this Python is used both for build-time tests
# and for installed (VM) tests, so it includes dependencies
# for both
(python3.withPackages (ps: [
ps.pytest
ps.python-dbusmock
ps.pygobject3
ps.dbus-python
]))
umockdev
];
checkInputs = [ umockdev ];
mesonFlags = [
"--sysconfdir=/etc"
"-Dinstalled-tests=true"
"-Dinstalled_test_prefix=${placeholder "installedTests"}"
"-Ddocumentation=disabled" # pulls in a whole lot of extra stuff
(lib.mesonEnable "systemd" enableSystemd)
]
++ lib.optionals (!enableGeoLocation) [
"-Dgeoclue=disabled"
]
++ lib.optionals (!finalAttrs.finalPackage.doCheck) [
"-Dtests=disabled"
];
strictDeps = true;
doCheck = true;
postPatch = ''
# until/unless bubblewrap ships a pkg-config file, meson has no way to find it when cross-compiling.
substituteInPlace meson.build \
--replace-fail "find_program('bwrap'" "find_program('${lib.getExe bubblewrap}'"
patchShebangs src/generate-method-info.py
patchShebangs tests/run-test.sh
'';
preCheck = lib.optionalString finalAttrs.finalPackage.doCheck ''
# For test_trash_file
export HOME=$(mktemp -d)
# Upstream disables a few tests in CI upstream as they are known to
# be flaky. Let's disable those downstream as hydra exhibits similar
# flakes:
# https://github.com/NixOS/nixpkgs/pull/270085#issuecomment-1840053951
export XDP_TEST_IN_CI=1
# need to set this ourselves, because the tests will set LD_PRELOAD=libumockdev-preload.so,
# which can't be found because it's not in default rpath
export LD_PRELOAD=${lib.getLib umockdev}/lib/libumockdev-preload.so
'';
# We can't disable the installedTests output when doCheck is disabled,
# because that produces an infinite recursion.
preFixup = lib.optionalString (!finalAttrs.finalPackage.doCheck) ''
mkdir $installedTests
'';
passthru = {
tests = {
installedTests = nixosTests.installed-tests.xdg-desktop-portal;
validate-icon = runCommand "test-icon-validation" { } ''
${finalAttrs.finalPackage}/libexec/xdg-desktop-portal-validate-icon --ruleset=desktop --sandbox --path=${../../../applications/audio/zynaddsubfx/ZynLogo.svg} > "$out"
grep format=svg "$out"
'';
};
};
meta = {
description = "Desktop integration portals for sandboxed apps";
homepage = "https://flatpak.github.io/xdg-desktop-portal";
license = lib.licenses.lgpl2Plus;
maintainers = with lib.maintainers; [ jtojnar ];
platforms = lib.platforms.linux;
};
})