nixos-framework-laptop-config/nixos/common/flake-support.nix
2024-12-28 19:33:49 -05:00

52 lines
2.7 KiB
Nix

# Configuration for any flake-based NixOS system
# Try our darndest to get nixpkgs into path & registry properly
#
# Maybe write a blog post about it?
#
# In theory NixOS 24.05 does this for us?
# > On flake-based NixOS configurations using nixpkgs.lib.nixosSystem, NixOS will automatically set NIX_PATH and the system-wide flake registry (/etc/nix/registry.json) to point <nixpkgs> and the unqualified flake path nixpkgs to the version of nixpkgs used to build the system.
# > This makes nix run nixpkgs#hello and nix-build '<nixpkgs>' -A hello work out of the box with no added configuration, reusing dependencies already on the system.
# > This may be undesirable if nix commands are not going to be run on the built system since it adds nixpkgs to the system closure. For such closure-size-constrained non-interactive systems, this setting should be disabled.
# > To disable this, set nixpkgs.flake.setNixPath and nixpkgs.flake.setFlakeRegistry to false.
# https://nixos.org/manual/nixos/unstable/release-notes#sec-release-24.05-highlights
#
# Some reading:
# https://nixos-and-flakes.thiscute.world/best-practices/nix-path-and-flake-registry#custom-nix-path-and-flake-registry-1
# https://github.com/NixOS/nix/issues/9574
#
# https://discourse.nixos.org/t/questions-on-using-nixos-desktop-with-flakes/16285/5
#
# I think there are two separate problems.
#
# # Getting lookup paths (like <nixpkgs>) to resolve
#
# This comment mentions how they work:
# https://discourse.nixos.org/t/nix-path-is-not-recognized/38404/6
#
# # Getting `indirect` flake refs (like "nixpkgs") to resolve
# · indirect: Indirections through the flake registry. These have the form
#
# | [flake:]<flake-id>(/<rev-or-ref>(/rev)?)?
#
# These perform a lookup of <flake-id> in the flake registry. For example, nixpkgs and nixpkgs/release-20.09 are indirect flake references. The specified rev and/or ref are merged with the entry in
# the registry; see nix registry for details.
{
inputs,
lib,
...
}: let
inherit (inputs) nixpkgs;
in {
# Enable flake features
nix.settings.experimental-features = ["nix-command" "flakes"];
nix.channel.enable = false; # remove nix-channel related tools & configs, we use flakes instead.
programs.command-not-found.enable = false; # Doesn't work well past channels
nix.registry.nixpkgs.flake = nixpkgs;
# but NIX_PATH is still used by many useful tools, so we set it to the same value as the one used by this flake.
# Make `nix repl '<nixpkgs>'` use the same nixpkgs as the one used by this flake.
environment.etc."nix/inputs/nixpkgs".source = "${nixpkgs}";
# https://github.com/NixOS/nix/issues/9574
nix.settings.nix-path = lib.mkForce "nixpkgs=/etc/nix/inputs/nixpkgs";
}