guix_mirror_bot pushed a commit to branch master
in repository guix.
commit 8ecab809db0584eb27fcde7c66bea5e8beb9fbc3
Author: Giacomo Leidi <[email protected]>
AuthorDate: Fri Jan 2 21:08:14 2026 +0100
gnu: Add tuned.
* gnu/packages/power.scm: (tuned-minimal): New variable.
(tuned): New variable.
Change-Id: I1445972cce6edbb6c256874cc45dae92c9a84595
Co-authored-by: Nguyễn Gia Phong <[email protected]>
---
gnu/packages/power.scm | 139 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 139 insertions(+)
diff --git a/gnu/packages/power.scm b/gnu/packages/power.scm
index 7be8485449..f4e5ffd307 100644
--- a/gnu/packages/power.scm
+++ b/gnu/packages/power.scm
@@ -1,6 +1,8 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2025 Tomas Volf <[email protected]>
;;; Copyright © 2023 Raven Hallsby <[email protected]>
+;;; Copyright © 2026 Giacomo Leidi <[email protected]>
+;;; Copyright © 2026 Nguyễn Gia Phong <[email protected]>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -24,13 +26,29 @@
;;;; Code:
(define-module (gnu packages power)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages admin)
+ #:use-module (gnu packages base)
+ #:use-module (gnu packages bash)
+ #:use-module (gnu packages check)
+ #:use-module (gnu packages disk)
+ #:use-module (gnu packages file-systems)
+ #:use-module (gnu packages freedesktop)
+ #:use-module (gnu packages gawk)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages instrumentation)
#:use-module (gnu packages libusb)
#:use-module (gnu packages linux)
#:use-module (gnu packages man)
+ #:use-module (gnu packages networking)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages python-xyz)
+ #:use-module (gnu packages ruby-xyz)
+ #:use-module (gnu packages virtualization)
#:use-module (guix build-system gnu)
+ #:use-module (guix build-system pyproject)
#:use-module (guix download)
+ #:use-module (guix git-download)
#:use-module (guix gexp)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix packages))
@@ -136,3 +154,124 @@ Uninterruptible Power Supply} models. @command{apcupsd}
works with most of
APC’s Smart-UPS models as well as most simple signalling models such a
Back-UPS, and BackUPS-Office.")
(license license:gpl2)))
+
+(define-public tuned-minimal
+ (package
+ (name "tuned-minimal")
+ (version "2.26.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/redhat-performance/tuned")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0r4a42s2hk9hcrp835164yzddmvr8n4b17bhhpwxx16iiaizramn"))))
+ (build-system pyproject-build-system)
+ (arguments
+ (list
+ ;; tests: 105 passed, 4 deselected
+ #:test-flags #~'("-k" "not udev and not get_device")
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'patch-paths
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (substitute* "Makefile"
+ (("^PYTHON_SITELIB = .*")
+ (simple-format #f "PYTHON_SITELIB = ~a\n"
+ (site-packages inputs outputs)))
+ ;; These directories do not make sense on Guix.
+ (("mkdir -p \\$\\(DESTDIR\\)/var/lib/tuned") "")
+ (("mkdir -p \\$\\(DESTDIR\\)/var/log/tuned") "")
+ (("mkdir -p \\$\\(DESTDIR\\)/run/tuned") "")
+ ;; Drop systemD services.
+ ((".*\\$\\(DESTDIR\\)\\$\\(UNITDIR\\).*\\.service.*") "")
+ ;; tuned-gui depends on systemctl being available. Drop it
+ ;; until it'll be compatible with other init systems.
+ ((".*\\$\\(DESTDIR\\).*tuned-gui.*") ""))
+ ;; Substitute FHS paths with Guix ones.
+ (substitute* (cons*
+ "experiments/powertop2tuned.py"
+ "tuned-adm.bash"
+ "tuned/consts.py"
+ (find-files "profiles"
+ (lambda (name stat)
+ (and (string-suffix? ".sh" name)
+ (eq? 'regular (stat:type
stat))
+ (access? name X_OK)))))
+ (("/etc/tuned")
+ (string-append #$output "/etc/tuned"))
+ (("/usr/lib/tuned")
+ (string-append #$output "/lib/tuned")))
+ (substitute* "experiments/powertop2tuned.py"
+ (("/usr/sbin/powertop")
+ (search-input-file inputs "sbin/powertop")))
+ ;; TuneD really wants to write to
+ ;; /etc/modprobe.d/tuned.conf . Guix manages this file
+ ;; declaratively, so the default location for TuneD is
+ ;; is changed to a file where it can actually write.
+ (substitute* "tuned/consts.py"
+ (("/etc/modprobe\\.d/tuned\\.conf")
+ "/etc/tuned/modprobe.d/tuned.conf"))))
+ ;; There is nothing to build except documentation.
+ ;;
https://github.com/redhat-performance/tuned/blob/v2.26.0/INSTALL#L4
+ ;;
https://github.com/redhat-performance/tuned/blob/v2.26.0/tuned.spec
+ (replace 'build
+ (lambda* (#:key inputs #:allow-other-keys)
+ (invoke "make" "html"
+ (string-append
+ "PYTHON=" (search-input-file inputs "bin/python3")))))
+ (replace 'install
+ (lambda _
+ (invoke "make" "install" "install-ppd" "install-html"
+ (string-append "PREFIX=" #$output)
+ (string-append "SYSCONFDIR=" #$output "/etc")
+ (string-append "TMPFILESDIR=" #$output "/run/tuned"))))
+ (add-before 'check 'set-check-pythonpath
+ (lambda _
+ (setenv "PYTHONPATH" "tests/unit")))
+ (add-before 'wrap 'wrap-gi-and-path
+ (lambda* (#:key inputs #:allow-other-keys)
+ (for-each
+ (lambda (binary)
+ (wrap-program binary
+ `("GI_TYPELIB_PATH" =
+ (,(string-append #$(this-package-input "glib")
+ "/lib/girepository-1.0")))))
+ (find-files (string-append #$output "/sbin"))))))))
+ (native-inputs (list python-pytest
+ ruby-asciidoctor))
+ (inputs
+ (list bash-minimal
+ ethtool
+ gawk
+ glib
+ hdparm
+ kmod
+ iproute
+ powertop
+ python-dbus
+ python-pyinotify
+ python-linux-procfs
+ python-pygobject
+ python-pyudev
+ systemtap
+ util-linux
+ virt-what))
+ (synopsis "Dynamic adaptive system tuning daemon")
+ (description
+ "The TuneD package contains a daemon that tunes system settings
+dynamically. It does so by monitoring the usage of several system components
+periodically. Based on that information components will then be put into lower
+or higher power saving modes to adapt to the current usage.")
+ (home-page "https://tuned-project.org")
+ (license (list license:gpl2+ license:cc-by-sa3.0))))
+
+(define-public tuned
+ (package
+ (inherit tuned-minimal)
+ (name "tuned")
+ (inputs
+ (modify-inputs (package-inputs tuned-minimal)
+ (prepend dmidecode perf wireless-tools)))))