summary refs log tree commit diff
path: root/pkgs/os-specific/linux/power-profiles-daemon/default.nix
blob: 9f96eb2576dc2cfbe0a52d4b90ef49383b8a445e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
{ stdenv
, lib
, pkg-config
, meson
, ninja
, fetchFromGitLab
, fetchpatch
, libgudev
, glib
, polkit
, gobject-introspection
, gettext
, gtk-doc
, docbook-xsl-nons
, docbook_xml_dtd_412
, libxml2
, libxslt
, upower
, umockdev
, systemd
, python3
, wrapGAppsNoGuiHook
, nixosTests
}:

let
  testPythonPkgs = ps: with ps; [
    pygobject3
    dbus-python
    python-dbusmock
  ];
  testTypelibPath = lib.makeSearchPathOutput "lib" "lib/girepository-1.0" [ umockdev ];
in
stdenv.mkDerivation rec {
  pname = "power-profiles-daemon";
  version = "0.10.1";

  outputs = [ "out" "devdoc" "installedTests" ];

  src = fetchFromGitLab {
    domain = "gitlab.freedesktop.org";
    owner = "hadess";
    repo = "power-profiles-daemon";
    rev = version;
    sha256 = "sha256-sQWiCHc0kEELdmPq9Qdk7OKDUgbM5R44639feC7gjJc=";
  };

  patches = [
    # Enable installed tests.
    # https://gitlab.freedesktop.org/hadess/power-profiles-daemon/-/merge_requests/92
    (fetchpatch {
      url = "https://gitlab.freedesktop.org/hadess/power-profiles-daemon/-/commit/3c64d9e1732eb6425e33013c452f1c4aa7a26f7e.patch";
      sha256 = "din5VuZZwARNDInHtl44yJK8pLmlxr5eoD4iMT4a8HA=";
    })

    # Install installed tests to separate output.
    ./installed-tests-path.patch
  ];

  nativeBuildInputs = [
    pkg-config
    meson
    ninja
    gettext
    gtk-doc
    docbook-xsl-nons
    docbook_xml_dtd_412
    libxml2 # for xmllint for stripping GResources
    libxslt # for xsltproc for building docs
    gobject-introspection
    wrapGAppsNoGuiHook
    python3.pkgs.wrapPython

    # For finding tests.
    (python3.withPackages testPythonPkgs)
  ];

  buildInputs = [
    libgudev
    systemd
    upower
    glib
    polkit
    python3 # for cli tool
  ];

  strictDeps = true;

  # for cli tool
  pythonPath = [
    python3.pkgs.pygobject3
  ];

  mesonFlags = [
    "-Dinstalled_test_prefix=${placeholder "installedTests"}"
    "-Dsystemdsystemunitdir=${placeholder "out"}/lib/systemd/system"
    "-Dgtk_doc=true"
  ];

  PKG_CONFIG_POLKIT_GOBJECT_1_POLICYDIR = "${placeholder "out"}/share/polkit-1/actions";

  # Avoid double wrapping
  dontWrapGApps = true;

  postPatch = ''
    patchShebangs tests/unittest_inspector.py
  '';

  preConfigure = ''
    # For finding tests.
    GI_TYPELIB_PATH_original=$GI_TYPELIB_PATH
    addToSearchPath GI_TYPELIB_PATH "${testTypelibPath}"
  '';

  postConfigure = ''
    # Restore the original value to prevent the program from depending on umockdev.
    export GI_TYPELIB_PATH=$GI_TYPELIB_PATH_original
    unset GI_TYPELIB_PATH_original
  '';

  preInstall = ''
    # We have pkexec on PATH so Meson will try to use it when installation fails
    # due to being unable to write to e.g. /etc.
    # Let’s pretend we already ran pkexec –
    # the pkexec on PATH would complain it lacks setuid bit,
    # obscuring the underlying error.
    # https://github.com/mesonbuild/meson/blob/492cc9bf95d573e037155b588dc5110ded4d9a35/mesonbuild/minstall.py#L558
    export PKEXEC_UID=-1
  '';

  postFixup = ''
    # Avoid double wrapping
    makeWrapperArgs+=("''${gappsWrapperArgs[@]}")
    # Make Python libraries available
    wrapPythonProgramsIn "$out/bin" "$pythonPath"

    # Make Python libraries available for installed tests
    makeWrapperArgs+=(
      --prefix GI_TYPELIB_PATH : "${testTypelibPath}"
      --prefix PATH : "${lib.makeBinPath [ umockdev ]}"
      # Vala does not use absolute paths in typelibs
      # https://github.com/NixOS/nixpkgs/issues/47226
      # Also umockdev binaries use relative paths for LD_PRELOAD.
      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ umockdev ]}"
      # dbusmock calls its templates using exec so our regular patching of Python scripts
      # to add package directories to site will not carry over.
      # https://github.com/martinpitt/python-dbusmock/blob/2254e69279a02fb3027b500ed7288b77c7a80f2a/dbusmock/mockobject.py#L51
      # https://github.com/martinpitt/python-dbusmock/blob/2254e69279a02fb3027b500ed7288b77c7a80f2a/dbusmock/__main__.py#L60-L62
      --prefix PYTHONPATH : "${lib.makeSearchPath python3.sitePackages (testPythonPkgs python3.pkgs)}"
    )
    wrapPythonProgramsIn "$installedTests/libexec/installed-tests" "$pythonPath ${lib.concatStringsSep " " (testPythonPkgs python3.pkgs)}"
  '';

  passthru = {
    tests = {
      nixos = nixosTests.power-profiles-daemon;
      installed-tests = nixosTests.installed-tests.power-profiles-daemon;
    };
  };

  meta = with lib; {
    homepage = "https://gitlab.freedesktop.org/hadess/power-profiles-daemon";
    description = "Makes user-selected power profiles handling available over D-Bus";
    platforms = platforms.linux;
    license = licenses.gpl3Plus;
    maintainers = with maintainers; [ jtojnar mvnetbiz ];
  };
}