Skip to content

Commit

Permalink
add Nix flake and documentation (#553)
Browse files Browse the repository at this point in the history
  • Loading branch information
shadeyg56 committed Sep 16, 2023
1 parent 4628b5d commit 3e2b779
Show file tree
Hide file tree
Showing 8 changed files with 360 additions and 0 deletions.
76 changes: 76 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ auto-cpufreq is looking for [co-maintainers & open source developers to help sha
* [Snap store](#snap-store)
* [auto-cpufreq-installer](#auto-cpufreq-installer)
* [AUR package (Arch/Manjaro Linux)](#aur-package-archmanjaro-linux)
* [NixOS](#nixos)
* [Update using installer](#update-using-auto-cpufreq-installer)
* [Post Installation](#post-installation)
* [Configuring auto-cpufreq](#configuring-auto-cpufreq)
Expand Down Expand Up @@ -116,6 +117,81 @@ In case you encounter any problems with `auto-cpufreq-installer`, please [submit
* [Git Package](https://aur.archlinux.org/packages/auto-cpufreq-git)
(For the latest commits/changes)

### NixOS

<details>
<summary>Flakes</summary>
<br>

This repo contains a flake that exposes a NixOS Module that manages and offers options for auto-cpufreq. To use it, add the flake as an input to your `flake.nix` file, and enable the module

```nix
# flake.nix
{
inputs = {
# ---Snip---
auto-cpufreq = {
url = "github:adnanhodzic/auto-cpufreq/nix";
inputs.nixpkgs.follows = "nixpkgs";
};
# ---Snip---
}
outputs = {nixpkgs, auto-cpufreq, ...} @ inputs: {
nixosConfigurations.HOSTNAME = nixpkgs.lib.nixosSystem {
specialArgs = { inherit inputs; };
modules = [
./configuration.nix
auto-cpufreq.nixosModules.default
];
};
}
}
```
Then you can enable the program in your `configuration.nix` file
```nix
# configuration.nix
{inputs, pkgs, ...}: {
# ---Snip---
programs.auto-cpufreq.enable = true;
# optionally, you can configure your auto-cpufreq settings, if you have any
programs.auto-cpufreq.settings = {
charger = {
governor = "performance";
turbo = "auto";
};
battery = {
governor = "powersave";
turbo = "auto";
};
};
# ---Snip---
}
```
</details>

<details>
<summary>Nixpkgs</summary>
<br>

There is a nixpkg available but it is more prone to being outdated whereas the flake pulls from the latest commit. You can install it in your `configuration.nix` and enable the system service
```nix
# configuration.nix
# ---Snip---
environment.systemPackages = with pkgs; [
auto-cpufreq
];
services.auto-cpufreq.enable = true;
# ---Snip---
```
</details>

## Post Installation
After installation `auto-cpufreq` will be available as a binary and you can refer to [auto-cpufreq modes and options](https://github.com/AdnanHodzic/auto-cpufreq#auto-cpufreq-modes-and-options) for more information on how to run and configure `auto-cpufreq`.

Expand Down
5 changes: 5 additions & 0 deletions auto-cpufreq-installer
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,11 @@ elif [ -f /etc/os-release ];then
xbps-install -Sy python3 python3-pip python3-devel python3-setuptools base-devel dmidecode cairo-devel gobject-introspection gcc gtk+3
completed
;;
nixos)
echo -e "NixOS detected\n"
echo -e "This installer is not supported on NixOS.\nPlease refer to the install instructions for NixOS at https://github.com/AdnanHodzic/auto-cpufreq#nixos"
exit 1
;;
*) #Any other distro
manual_install
completed
Expand Down
27 changes: 27 additions & 0 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
};

outputs = {self, nixpkgs}@inputs :
let
system = "x86_64-linux"; # replace this as needed
pkgs = nixpkgs.legacyPackages.${system};
auto-cpufreq = pkgs.python3Packages.callPackage ./nix/default.nix {};
in {
packages.${system}.default = auto-cpufreq;

devShells.${system}.default = pkgs.mkShell {
inputsFrom = [ auto-cpufreq ];
packages = [ pkgs.python310Packages.pip ];
};

nixosModules.default = import ./nix/module.nix inputs;
};
}
64 changes: 64 additions & 0 deletions nix/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
{ lib, python310Packages, fetchFromGitHub, callPackage, pkgs, version ? "git"}:

python310Packages.buildPythonPackage rec {
pname = "auto-cpufreq";
inherit version;

# src = fetchFromGitHub {
# owner = "AdnanHodzic";
# repo = pname;
# rev = "v${version}";
# sha256 = "sha256-ElYzVteBnoz7BevA6j/730BMG0RsmhBQ4PNl9+0Kw4k=";
# };
src = ../.;

nativeBuildInputs = with pkgs; [ wrapGAppsHook gobject-introspection ];

buildInputs = with pkgs; [ gtk3 ];

propagatedBuildInputs = with python310Packages; [ requests pygobject3 click distro psutil setuptools (callPackage ./pkgs/setuptools-git-versioning.nix {})];

doCheck = false;
pythonImportsCheck = [ "auto_cpufreq" ];

patches = [

# patch to prevent script copying and to disable install
./patches/prevent-install-and-copy.patch

];

postPatch = ''
substituteInPlace auto_cpufreq/core.py --replace '/opt/auto-cpufreq/override.pickle' /var/run/override.pickle
substituteInPlace scripts/org.auto-cpufreq.pkexec.policy --replace "/opt/auto-cpufreq/venv/bin/auto-cpufreq" $out/bin/auto-cpufreq
'';

postInstall = ''
# copy script manually
cp scripts/cpufreqctl.sh $out/bin/cpufreqctl.auto-cpufreq
# systemd service
mkdir -p $out/lib/systemd/system
cp scripts/auto-cpufreq.service $out/lib/systemd/system
substituteInPlace $out/lib/systemd/system/auto-cpufreq.service --replace "/usr/local" $out
# desktop icon
mkdir -p $out/share/applications
mkdir $out/share/pixmaps
cp scripts/auto-cpufreq-gtk.desktop $out/share/applications
cp images/icon.png $out/share/pixmaps/auto-cpufreq.png
# polkit policy
mkdir -p $out/share/polkit-1/actions
cp scripts/org.auto-cpufreq.pkexec.policy $out/share/polkit-1/actions
'';

meta = with lib; {
homepage = "https://github.com/AdnanHodzic/auto-cpufreq";
description = "Automatic CPU speed & power optimizer for Linux";
license = licenses.lgpl3Plus;
platforms = platforms.linux;
maintainers = [ maintainers.Technical27 ];
mainProgram = "auto-cpufreq";
};
}
43 changes: 43 additions & 0 deletions nix/module.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
inputs: { config, lib, pkgs, options, ... }:

with lib; let

cfg = config.programs.auto-cpufreq;
system = "x86_64-linux";
defaultPackage = inputs.self.packages.${system}.default;
cfgFilename = "auto-cpufreq.conf";
cfgFile = format.generate cfgFilename cfg.settings;

format = pkgs.formats.ini {};

in {

options.programs.auto-cpufreq = {
enable = mkEnableOption "Automatic CPU speed & power optimizer for Linux";

settings = mkOption {
description = lib.mdDoc ''
Configuration for `auto-cpufreq`.
See its [example configuration file] for supported settings.
[example configuration file]: https://github.com/AdnanHodzic/auto-cpufreq/blob/master/auto-cpufreq.conf-example
'';

default = {};
type = types.submodule { freeformType = format.type; };
};
};

config = mkIf cfg.enable {
environment.systemPackages = [ defaultPackage ];

services.auto-cpufreq.enable = true;
systemd.services.auto-cpufreq = {
overrideStrategy = "asDropin";
serviceConfig.ExecStart = lib.mkForce [
""
"${defaultPackage}/bin/auto-cpufreq --daemon --config ${cfgFile}"
];
};
};
}
113 changes: 113 additions & 0 deletions nix/patches/prevent-install-and-copy.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
diff --git a/auto_cpufreq/core.py b/auto_cpufreq/core.py
index 99397a9..16869ab 100755
--- a/auto_cpufreq/core.py
+++ b/auto_cpufreq/core.py
@@ -350,29 +350,12 @@ def get_current_gov():


def cpufreqctl():
- """
- deploy cpufreqctl script
- """
-
- # detect if running on a SNAP
- if os.getenv("PKG_MARKER") == "SNAP":
- pass
- else:
- # deploy cpufreqctl.auto-cpufreq script
- if not os.path.isfile("/usr/local/bin/cpufreqctl.auto-cpufreq"):
- shutil.copy(SCRIPTS_DIR / "cpufreqctl.sh", "/usr/local/bin/cpufreqctl.auto-cpufreq")
-
+ # scripts are already in the correct place
+ pass

def cpufreqctl_restore():
- """
- remove cpufreqctl.auto-cpufreq script
- """
- # detect if running on a SNAP
- if os.getenv("PKG_MARKER") == "SNAP":
- pass
- else:
- if os.path.isfile("/usr/local/bin/cpufreqctl.auto-cpufreq"):
- os.remove("/usr/local/bin/cpufreqctl.auto-cpufreq")
+ #no need to restore
+ pass


def footer(l=79):
@@ -400,30 +383,8 @@ def remove_complete_msg():


def deploy_daemon():
- print("\n" + "-" * 21 + " Deploying auto-cpufreq as a daemon " + "-" * 22 + "\n")
-
- # deploy cpufreqctl script func call
- cpufreqctl()
-
- # turn off bluetooth on boot
- bluetooth_disable()
-
- auto_cpufreq_stats_path.touch(exist_ok=True)
-
- print("\n* Deploy auto-cpufreq install script")
- shutil.copy(SCRIPTS_DIR / "auto-cpufreq-install.sh", "/usr/local/bin/auto-cpufreq-install")
-
- print("\n* Deploy auto-cpufreq remove script")
- shutil.copy(SCRIPTS_DIR / "auto-cpufreq-remove.sh", "/usr/local/bin/auto-cpufreq-remove")
-
- # output warning if gnome power profile is running
- gnome_power_detect_install()
- gnome_power_svc_disable()
-
- # output warning if TLP service is detected
- tlp_service_detect()
-
- call("/usr/local/bin/auto-cpufreq-install", shell=True)
+ # prevent needless copying and system changes
+ pass


def deploy_daemon_performance():
@@ -463,40 +424,7 @@ def deploy_daemon_performance():

# remove auto-cpufreq daemon
def remove_daemon():
-
- # check if auto-cpufreq is installed
- if not os.path.exists("/usr/local/bin/auto-cpufreq-remove"):
- print("\nauto-cpufreq daemon is not installed.\n")
- sys.exit(1)
-
- print("\n" + "-" * 21 + " Removing auto-cpufreq daemon " + "-" * 22 + "\n")
-
- # turn on bluetooth on boot
- bluetooth_enable()
-
- # output warning if gnome power profile is stopped
- gnome_power_rm_reminder()
- gnome_power_svc_enable()
-
- # run auto-cpufreq daemon remove script
- call("/usr/local/bin/auto-cpufreq-remove", shell=True)
-
- # remove auto-cpufreq-remove
- os.remove("/usr/local/bin/auto-cpufreq-remove")
-
- # delete override pickle if it exists
- if os.path.exists(governor_override_state):
- os.remove(governor_override_state)
-
- # delete stats file
- if auto_cpufreq_stats_path.exists():
- if auto_cpufreq_stats_file is not None:
- auto_cpufreq_stats_file.close()
-
- auto_cpufreq_stats_path.unlink()
-
- # restore original cpufrectl script
- cpufreqctl_restore()
+ pass


def gov_check():
11 changes: 11 additions & 0 deletions nix/pkgs/setuptools-git-versioning.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{ fetchPypi, python310Packages}:

python310Packages.buildPythonPackage rec {
pname = "setuptools-git-versioning";
version = "1.13.5";
src = fetchPypi {
inherit pname version;
sha256 = "af9ad1e8103b5abb5b128c2db4fef99407328ac9c12f65d3ff9550c4bb39ad1c";
};
propagatedBuildInputs = with python310Packages; [ toml packaging];
}

0 comments on commit 3e2b779

Please sign in to comment.