diff options
Diffstat (limited to 'pkgs/os-specific/linux/upower/default.nix')
-rw-r--r-- | pkgs/os-specific/linux/upower/default.nix | 195 |
1 files changed, 169 insertions, 26 deletions
diff --git a/pkgs/os-specific/linux/upower/default.nix b/pkgs/os-specific/linux/upower/default.nix index 08bebefed13..36d8a3b9c45 100644 --- a/pkgs/os-specific/linux/upower/default.nix +++ b/pkgs/os-specific/linux/upower/default.nix @@ -1,36 +1,82 @@ -{ lib, stdenv -, fetchurl +{ lib +, stdenv +, fetchFromGitLab +, makeWrapper , pkg-config +, rsync , libxslt -, docbook_xsl +, meson +, ninja +, python3 +, dbus +, umockdev +, libeatmydata +, gtk-doc +, docbook-xsl-nons , udev , libgudev , libusb1 , glib -, gobject-introspection , gettext , systemd +, nixosTests , useIMobileDevice ? true , libimobiledevice +, withDocs ? withIntrospection +, mesonEmulatorHook +, withIntrospection ? lib.meta.availableOn stdenv.hostPlatform gobject-introspection && stdenv.hostPlatform.emulatorAvailable buildPackages +, buildPackages +, gobject-introspection }: -stdenv.mkDerivation { +assert withDocs -> withIntrospection; + +stdenv.mkDerivation (finalAttrs: { pname = "upower"; - version = "0.99.11"; + version = "1.90.2"; - outputs = [ "out" "dev" ]; + outputs = [ "out" "dev" "installedTests" ] + ++ lib.optionals withDocs [ "devdoc" ]; - src = fetchurl { - url = "https://gitlab.freedesktop.org/upower/upower/uploads/93cfe7c8d66ed486001c4f3f55399b7a/upower-0.99.11.tar.xz"; - sha256 = "1vxxvmz2cxb1qy6ibszaz5bskqdy9nd9fxspj9fv3gfmrjzzzdb4"; + src = fetchFromGitLab { + domain = "gitlab.freedesktop.org"; + owner = "upower"; + repo = "upower"; + rev = "v${finalAttrs.version}"; + hash = "sha256-7WzMAJuf1czU8ZalsEU/NwCXYqTGvcqEqxFt5ocgt48="; }; + patches = lib.optionals (stdenv.hostPlatform.system == "i686-linux") [ + # Remove when this is fixed upstream: + # https://gitlab.freedesktop.org/upower/upower/-/issues/214 + ./i686-test-remove-battery-check.patch + ] ++ [ + ./installed-tests-path.patch + ]; + + strictDeps = true; + + depsBuildBuild = [ + pkg-config + ]; + nativeBuildInputs = [ - docbook_xsl + meson + ninja + python3 + docbook-xsl-nons gettext - gobject-introspection libxslt + makeWrapper pkg-config + rsync + glib + ] ++ lib.optionals withIntrospection [ + gobject-introspection + ] ++ lib.optionals withDocs [ + gtk-doc + ] ++ lib.optionals (withDocs && !stdenv.buildPlatform.canExecute stdenv.hostPlatform) [ + mesonEmulatorHook ]; buildInputs = [ @@ -38,34 +84,131 @@ stdenv.mkDerivation { libusb1 udev systemd - ] - ++ lib.optional useIMobileDevice libimobiledevice - ; + # Duplicate from nativeCheckInputs until https://github.com/NixOS/nixpkgs/issues/161570 is solved + umockdev + + # For installed tests. + (python3.withPackages (pp: [ + pp.dbus-python + pp.python-dbusmock + pp.pygobject3 + pp.packaging + ])) + ] ++ lib.optionals useIMobileDevice [ + libimobiledevice + ]; + + nativeCheckInputs = [ + python3.pkgs.dbus-python + python3.pkgs.python-dbusmock + python3.pkgs.pygobject3 + dbus + umockdev + libeatmydata + python3.pkgs.packaging + ]; propagatedBuildInputs = [ glib ]; - configureFlags = [ + mesonFlags = [ "--localstatedir=/var" - "--with-backend=linux" - "--with-systemdsystemunitdir=${placeholder "out"}/etc/systemd/system" - "--with-systemdutildir=${placeholder "out"}/lib/systemd" - "--with-udevrulesdir=${placeholder "out"}/lib/udev/rules.d" "--sysconfdir=/etc" + "-Dos_backend=linux" + "-Dsystemdsystemunitdir=${placeholder "out"}/etc/systemd/system" + "-Dudevrulesdir=${placeholder "out"}/lib/udev/rules.d" + "-Dudevhwdbdir=${placeholder "out"}/lib/udev/hwdb.d" + (lib.mesonEnable "introspection" withIntrospection) + (lib.mesonBool "gtk-doc" withDocs) + "-Dinstalled_test_prefix=${placeholder "installedTests"}" ]; - doCheck = false; # fails with "env: './linux/integration-test': No such file or directory" + doCheck = true; - installFlags = [ - "historydir=$(TMPDIR)/foo" - "sysconfdir=${placeholder "out"}/etc" - ]; + postPatch = '' + patchShebangs src/linux/integration-test.py + patchShebangs src/linux/unittest_inspector.py + + substituteInPlace src/linux/integration-test.py \ + --replace "/usr/share/dbus-1" "$out/share/dbus-1" + ''; + + preCheck = '' + # Our gobject-introspection patches make the shared library paths absolute + # in the GIR files. When running tests, the library is not yet installed, + # though, so we need to replace the absolute path with a local one during build. + # We are using a symlink that will be overwitten during installation. + mkdir -p "$out/lib" + ln -s "$PWD/libupower-glib/libupower-glib.so" "$out/lib/libupower-glib.so.3" + ''; + + checkPhase = '' + runHook preCheck + + # Slow fsync calls can make self-test fail: + # https://gitlab.freedesktop.org/upower/upower/-/issues/195 + eatmydata meson test --print-errorlogs + + runHook postCheck + ''; + + postCheck = '' + # Undo patchShebangs from postPatch so that it can be replaced with runtime shebang + # unittest_inspector.py intentionally not reverted because it would trigger + # meson rebuild during install and it is not used at runtime anyway. + sed -Ei 's~#!.+/bin/python3~#!/usr/bin/python3~' \ + ../src/linux/integration-test.py + ''; + + postInstall = '' + # Move stuff from DESTDIR to proper location. + # We use rsync to merge the directories. + for dir in etc var; do + rsync --archive "$DESTDIR/$dir" "$out" + rm --recursive "$DESTDIR/$dir" + done + for o in out dev installedTests; do + rsync --archive "$DESTDIR/''${!o}" "$(dirname "''${!o}")" + rm --recursive "$DESTDIR/''${!o}" + done + # Ensure the DESTDIR is removed. + rmdir "$DESTDIR/nix/store" "$DESTDIR/nix" "$DESTDIR" + ''; + + postFixup = '' + wrapProgram "$installedTests/libexec/upower/integration-test.py" \ + --prefix GI_TYPELIB_PATH : "${lib.makeSearchPath "lib/girepository-1.0" [ + "$out" + umockdev.out + ]}" \ + --prefix PATH : "${lib.makeBinPath [ + umockdev + ]}" + ''; + + env = { + # HACK: We want to install configuration files to $out/etc + # but upower should read them from /etc on a NixOS system. + # With autotools, it was possible to override Make variables + # at install time but Meson does not support this + # so we need to convince it to install all files to a temporary + # location using DESTDIR and then move it to proper one in postInstall. + DESTDIR = "${placeholder "out"}/dest"; + }; + + passthru = { + tests = { + installedTests = nixosTests.installed-tests.upower; + }; + }; meta = with lib; { homepage = "https://upower.freedesktop.org/"; + changelog = "https://gitlab.freedesktop.org/upower/upower/-/blob/v${finalAttrs.version}/NEWS"; description = "A D-Bus service for power management"; + maintainers = teams.freedesktop.members; platforms = platforms.linux; license = licenses.gpl2Plus; }; -} +}) |