Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add Nix flake and better Nix support #553

Merged
merged 1 commit into from
Sep 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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];
}