Eruption: How do you "install" config files and systemd services of a package?

Hello nix community,

I am very new to nixos, so please apologize if I ask basic questions. I am currently writing a package for eruption, which is an RGB LED driver for ROCCAT devices (keyboards, mice etc.). Below you can find the default.nix and eruption.nix:

default.nix

let
    # rustc version 1.78.0
    nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/archive/05bbf675397d5366259409139039af8077d695ce.tar.gz";
    # nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-24.11.tar.gz";
    pkgs = import nixpkgs { config = {}; overlays = []; };
in
{
    eruption = pkgs.callPackage ./eruption.nix {};
}

eruption.nix

{ lib, rustPlatform, fetchFromGitHub, libevdev, hidapi, systemd, dbus, lua54Packages, gtksourceview4, gtk3, protobuf, xorg, libpulseaudio, pkg-config, libusb1, libxkbcommon, tree }:
rustPlatform.buildRustPackage rec {
    pname = "eruption";
    version = "v0.3.6";

    src = fetchFromGitHub {
        owner = "eruption-project";
        repo = "eruption";
        rev = "4884ace33ed560ba058e5fa2824b4f3852f0ca90";
        sha256 = "sha256-Ty5TWW+o2hQiAko20sqZEYKS2LOqkFmyOxqWVbRP7Kc=";
    };

    useFetchCargoVendor = true;
    cargoLock = {
        lockFile = "${src}/Cargo.lock";
        outputHashes = {
            "hidapi-2.5.0" = "sha256-3hivDzxdZ2w4++QkyTS1DMXTkUHi9BfK9vc2oeZslVE=";
            "rust-pulsectl-0.2.7" = "sha256-jkZJiTbCkPCe20d08ExY/VmdFOaV3GxMxMVOnXl2HlM=";
        };
    };

    nativeBuildInputs = [ pkg-config protobuf tree ];
    buildInputs = [ libevdev hidapi systemd dbus lua54Packages.lua lua54Packages.luasocket gtksourceview4 gtk3 xorg.libX11 xorg.libXrandr libpulseaudio libusb1 libxkbcommon];

    postInstall = ''
	mkdir -p "$out/etc/eruption"
	mkdir -p "$out/etc/profile.d"
	mkdir -p "$out/usr/share/doc/eruption"
	mkdir -p "$out/usr/share/eruption/scripts/lib/macros"
	mkdir -p "$out/usr/share/eruption/scripts/lib/keymaps"
	mkdir -p "$out/usr/share/eruption/scripts/lib/themes"
	mkdir -p "$out/usr/share/eruption/scripts/lib/hwdevices/keyboards"
	mkdir -p "$out/usr/share/eruption/scripts/lib/hwdevices/mice"
	mkdir -p "$out/usr/share/eruption/scripts/examples"
	mkdir -p "$out/usr/share/applications"
	mkdir -p "$out/usr/share/icons/hicolor/64x64/apps"
	mkdir -p "$out/usr/share/eruption-gui-gtk3/schemas"
	mkdir -p "$out/var/lib/eruption/profiles"
	mkdir -p "$out/lib/systemd/system"
	mkdir -p "$out/lib/systemd/system-preset"
	mkdir -p "$out/lib/systemd/user"
	mkdir -p "$out/lib/systemd/user-preset"
	mkdir -p "$out/lib/systemd/system-sleep"
	mkdir -p "$out/lib/udev/rules.d/"
	mkdir -p "$out/usr/share/dbus-1/system.d"
	mkdir -p "$out/usr/share/dbus-1/session.d"
	mkdir -p "$out/usr/share/polkit-1/actions"
	mkdir -p "$out/usr/share/man/man8"
	mkdir -p "$out/usr/share/man/man5"
	mkdir -p "$out/usr/share/man/man1"
	mkdir -p "$out/usr/share/bash-completion/completions"
	mkdir -p "$out/usr/share/fish/completions"
	mkdir -p "$out/usr/share/zsh/site-functions"
	mkdir -p "$out/usr/share/eruption/i18n"
	mkdir -p "$out/usr/share/eruption/sfx"
        mkdir -p "$out/usr/bin"

	cp "support/assets/eruption-gui-gtk3/eruption-gui-gtk3.desktop" "$out/usr/share/applications/"
	cp "support/assets/eruption-gui-gtk3/eruption-gui.png" "$out/usr/share/icons/hicolor/64x64/apps/"
	cp "eruption-gui-gtk3/schemas/gschemas.compiled" "$out/usr/share/eruption-gui-gtk3/schemas/"
	cp "support/systemd/eruption-suspend.sh" "$out/lib/systemd/system-sleep/eruption"
	cp "support/config/eruption.conf" "$out/etc/eruption/"
	cp "support/config/fx-proxy.conf" "$out/etc/eruption/"
	cp "support/config/audio-proxy.conf" "$out/etc/eruption/"
	cp "support/config/process-monitor.conf" "$out/etc/eruption/"
	cp "support/profile.d/eruption.sh" "$out/etc/profile.d/eruption.sh"
	cp "support/systemd/eruption.service" "$out/lib/systemd/system/"
	cp "support/systemd/eruption.preset" "$out/lib/systemd/system-preset/50-eruption.preset"
	cp "support/systemd/eruption-fx-proxy.service" "$out/lib/systemd/user/"
	cp "support/systemd/eruption-fx-proxy.preset" "$out/lib/systemd/user-preset/50-eruption-fx-proxy.preset"
	cp "support/systemd/eruption-audio-proxy.service" "$out/lib/systemd/user/"
	cp "support/systemd/eruption-audio-proxy.preset" "$out/lib/systemd/user-preset/50-eruption-audio-proxy.preset"
	cp "support/systemd/eruption-process-monitor.service" "$out/lib/systemd/user/"
	cp "support/systemd/eruption-process-monitor.preset" "$out/lib/systemd/user-preset/50-eruption-process-monitor.preset"
	cp "support/systemd/eruption-hotplug-helper.service" "$out/lib/systemd/system/"
	cp "support/systemd/eruption-hotplug-helper.preset" "$out/lib/systemd/system-preset/50-eruption-hotplug-helper.preset"
	cp "support/udev/99-eruption.rules" "$out/lib/udev/rules.d/"
	cp "support/dbus/org.eruption.control.conf" "$out/usr/share/dbus-1/system.d/"
	cp "support/dbus/org.eruption.process_monitor.conf" "$out/usr/share/dbus-1/session.d/"
	cp "support/dbus/org.eruption.fx_proxy.conf" "$out/usr/share/dbus-1/session.d/"
	cp "support/policykit/org.eruption.policy" "$out/usr/share/polkit-1/actions/"
	cp "support/man/eruption.8" "$out/usr/share/man/man8/"
	cp "support/man/eruption-cmd.8" "$out/usr/share/man/man8/"
	cp "support/man/eruption.conf.5" "$out/usr/share/man/man5/"
	cp "support/man/process-monitor.conf.5" "$out/usr/share/man/man5/"
	cp "support/man/eruptionctl.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-hwutil.8" "$out/usr/share/man/man8/"
	cp "support/man/eruption-macro.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-keymap.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-netfx.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-fx-proxy.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-audio-proxy.1" "$out/usr/share/man/man1/"
	cp "support/man/eruption-process-monitor.1" "$out/usr/share/man/man1/"
	cp "support/shell/completions/en_US/eruption-cmd.bash-completion" "$out/usr/share/bash-completion/completions/eruption-cmd"
	cp "support/shell/completions/en_US/eruption-hwutil.bash-completion" "$out/usr/share/bash-completion/completions/eruption-hwutil"
	cp "support/shell/completions/en_US/eruption-debug-tool.bash-completion" "$out/usr/share/bash-completion/completions/eruption-debug-tool"
	cp "support/shell/completions/en_US/eruption-macro.bash-completion" "$out/usr/share/bash-completion/completions/eruption-macro"
	cp "support/shell/completions/en_US/eruption-keymap.bash-completion" "$out/usr/share/bash-completion/completions/eruption-keymap"
	cp "support/shell/completions/en_US/eruption-netfx.bash-completion" "$out/usr/share/bash-completion/completions/eruption-netfx"
	cp "support/shell/completions/en_US/eruption-fx-proxy.bash-completion" "$out/usr/share/bash-completion/completions/eruption-fx-proxy"
	cp "support/shell/completions/en_US/eruption-audio-proxy.bash-completion" "$out/usr/share/bash-completion/completions/eruption-audio-proxy"
	cp "support/shell/completions/en_US/eruption-process-monitor.bash-completion" "$out/usr/share/bash-completion/completions/eruption-process-monitor"
	cp "support/shell/completions/en_US/eruptionctl.bash-completion" "$out/usr/share/bash-completion/completions/eruptionctl"
	cp "support/shell/completions/en_US/eruption-cmd.fish-completion" "$out/usr/share/fish/completions/eruption-cmd.fish"
	cp "support/shell/completions/en_US/eruption-hwutil.fish-completion" "$out/usr/share/fish/completions/eruption-hwutil.fish"
	cp "support/shell/completions/en_US/eruption-debug-tool.fish-completion" "$out/usr/share/fish/completions/eruption-debug-tool.fish"
	cp "support/shell/completions/en_US/eruption-macro.fish-completion" "$out/usr/share/fish/completions/eruption-macro.fish"
	cp "support/shell/completions/en_US/eruption-keymap.fish-completion" "$out/usr/share/fish/completions/eruption-keymap.fish"
	cp "support/shell/completions/en_US/eruption-netfx.fish-completion" "$out/usr/share/fish/completions/eruption-netfx.fish"
	cp "support/shell/completions/en_US/eruption-fx-proxy.fish-completion" "$out/usr/share/fish/completions/eruption-fx-proxy.fish"
	cp "support/shell/completions/en_US/eruption-audio-proxy.fish-completion" "$out/usr/share/fish/completions/eruption-audio-proxy.fish"
	cp "support/shell/completions/en_US/eruption-process-monitor.fish-completion" "$out/usr/share/fish/completions/eruption-process-monitor.fish"
	cp "support/shell/completions/en_US/eruptionctl.fish-completion" "$out/usr/share/fish/completions/eruptionctl.fish"
	cp "support/shell/completions/en_US/eruption-cmd.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-cmd"
	cp "support/shell/completions/en_US/eruption-hwutil.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-hwutil"
	cp "support/shell/completions/en_US/eruption-debug-tool.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-debug-tool"
	cp "support/shell/completions/en_US/eruption-macro.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-macro"
	cp "support/shell/completions/en_US/eruption-keymap.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-keymap"
	cp "support/shell/completions/en_US/eruption-netfx.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-netfx"
	cp "support/shell/completions/en_US/eruption-fx-proxy.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-fx-proxy"
	cp "support/shell/completions/en_US/eruption-audio-proxy.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-audio-proxy"
	cp "support/shell/completions/en_US/eruption-process-monitor.zsh-completion" "$out/usr/share/zsh/site-functions/_eruption-process-monitor"
	cp "support/shell/completions/en_US/eruptionctl.zsh-completion" "$out/usr/share/zsh/site-functions/_eruptionctl"
	cp "support/sfx/typewriter1.wav" "$out/usr/share/eruption/sfx/"
	cp "support/sfx/phaser1.wav" "$out/usr/share/eruption/sfx/"
	cp "support/sfx/phaser2.wav" "$out/usr/share/eruption/sfx/"

	chmod 0755 $out/lib/systemd/system-sleep/eruption

	ln -fs "phaser1.wav" "$out/usr/share/eruption/sfx/key-down.wav"
	ln -fs "phaser2.wav" "$out/usr/share/eruption/sfx/key-up.wav"

	cp -r eruption/src/scripts/* $out/usr/share/eruption/scripts/
	cp -r support/profiles/* $out/var/lib/eruption/profiles/

        ln -fs "../../bin/eruption" "$out/usr/bin/eruption"
        ln -fs "../../bin/eruption-fx-proxy" "$out/usr/bin/eruption-fx-proxy"
        ln -fs "../../bin/eruption-audio-proxy" "$out/usr/bin/eruption-audio-proxy"
        ln -fs "../../bin/eruption-process-monitor" "$out/usr/bin/eruption-process-monitor"
	'';
}

I then build it using nix-build -A eruption while in the directory of default.nix.

As you can see eruption contains a lot of additional files and systemd services. But if I “install” the package into my configuration.nix like this:

environment.systemPackages = with pkgs;
let eruption_pkg = import /path/to/default.nix in [
...
eruption_pkg.eruption
...
]

This works and the eruption binary is available and can be executed (also the systemd services are accessable via systemctl). It even has access to my keyboard and turns of the default rainbow wave. But none of the config files have been “installed”. eruption also needs to write into /var/lib/eruption which seems to fail.

What is the correct way to “install” these config files? I had a look at the openrgb service. Do I need to define these systemd services differently like there? Do I maybe need to patch eruption to make it compatible with nixos?

I am currently stuck. Any help would be appreciated.

I found systemd.services and systemd.user.services. I will have a look at these.