Files
illogical-impulse/sdist/nix

Install scripts using Nix to achieve cross-distros

NOTE: The sdist/nix is not for NixOS but every distro, using Nix and home-manager.

plan

TODO: Write a proper flake.nix and optionally home.nix and other files under ./sdist/nix/iiqs-hm/ to install all dependencies that ./sdist/arch/install-deps.sh does. (excluding the screenlock)

TODO: In this script, implement the process below:

  1. Warning user about "this script is only experimental and must only use it at your own risks.", and prompt y/N (default N) before proceeding.
  2. If nix not installed:
    1. install nix via NixOS/experimental-nix-installer
    2. Enable nix for shell
      • Update: Skip this step cuz the nix-installer will handle it automatically e.g. in /etc/zsh/zshrc.
    3. Ensure the experimental feature, Nix Flake, is enabled.
  3. cd to iiqs-hm and use something like home-manager switch --flake .#iiqs to install the dependencies.
  4. Install screen lock using system package manager of the current distro.

Note that this script must be idempotent.

TODO: Write guide for people already use nix, so they can manually grab things from this repo to their own Nix/home-manager configurations to install the dependencies.

Attentions

PAM

On non-NixOS distros, programs using PAM (typically screen locker) will not work if installed via Nix, so user has to use their own distro's package for the screen lock.

  • One problem is that Debian(-based) distros use modified version of PAM which supports @include directive in /etc/pam.d config files but the PAM from Nix does not support it, see this comment.
  • Another problem is the location of a suid helper binary that is necessary, see this comment.

The problem could be solved by using the system-provided libpam instead.

See also https://github.com/caelestia-dots/shell/issues/668

NixGL

On non-NixOS distros, packages installed via home-manager have problem accessing GPU, especially Hyprland because it requires GPU acceleration to launch. nixGL should be used to address the problem. Example code in home.nix:

{ config, lib, pkgs, nixgl, ... }:
{
  nixGL.packages = nixgl.packages;
  nixGL.defaultWrapper = "mesa";
  
  # other lines not showed here ...

  home = {
    packages = with pkgs; [
      cowsay           # normal packages that does not need nixGL
      lolcat
      # other lines not showed here ...
    ]
    ++ [
    (config.lib.nixGL.wrap pkgs.firefox-bin)
    (config.lib.nixGL.wrap pkgs.hyprland)
    # other lines not showed here ...
    ];
    # other lines not showed here ...
  };
}

And in flake.nix:

{
  inputs = {
    nixpkgs.url = "nixpkgs/nixos-25.05";
    home-manager = {
      url = "github:nix-community/home-manager/release-25.05";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    hyprland = {
      url = "github:hyprwm/Hyprland";
    };
    nixgl.url = "github:nix-community/nixGL";
  };
  outputs = { nixpkgs, home-manager, nixgl, ... }:
    let
      lib = nixpkgs.lib;
      system = "x86_64-linux";
      pkgs = import nixpkgs {
        inherit system;
        overlays = [ nixgl.overlay ];
      };
    in {
      homeConfigurations = {
        mydot = home-manager.lib.homeManagerConfiguration {
          inherit pkgs;
          extraSpecialArgs = { inherit nixgl; };
          modules = [ ./home.nix ];
          };
        };
      };
}