{ config, inputs, lib, pkgs, this, ... }: with lib; let cfg = config.nixfiles.modules.common.nix; in { options.nixfiles.modules.common.nix.allowedUnfreePackages = mkOption { description = "A list of allowed unfree packages."; type = with types; listOf str; default = [ ]; }; config = { _module.args = let importNixpkgs = nixpkgs: import nixpkgs { inherit (config.nixpkgs) config; inherit (this) system; }; in rec { pkgsLocal = importNixpkgs "${config.my.home}/src/nixpkgs"; # Impure! pkgsMaster = importNixpkgs inputs.nixpkgs-master; pkgsStable = importNixpkgs inputs.nixpkgs-stable; pkgsRev = rev: hash: importNixpkgs ( pkgs.fetchFromGitHub { owner = "NixOS"; repo = "nixpkgs"; inherit rev hash; } ); pkgsPr = pr: pkgsRev "refs/pull/${toString pr}/head"; }; hm = { # Used primarily in conjunction with the "nixfiles" script. home.file.".nix-defexpr/default.nix".text = let hostname = strings.escapeNixIdentifier this.hostname; in optionalString this.isHeadful '' let self = builtins.getFlake "nixfiles"; configurations = self.nixosConfigurations; local = configurations.${hostname}; in rec { inherit self; inherit (self) inputs lib; inherit (lib) my; this = my.configurations.${hostname}; inherit (local) config; inherit (local.config.system.build) toplevel vm vmWithBootLoader manual; pretty = expr: lib.trace (lib.generators.toPretty {} expr) {}; } // configurations // local._module.args ''; programs.bash.shellAliases.nix = "nix --verbose --print-build-logs"; }; nix = let notSelfInputs = filterAttrs (n: _: n != "self") inputs; in { daemonCPUSchedPolicy = "idle"; daemonIOSchedClass = "idle"; daemonIOSchedPriority = 7; settings = { # https://nixos.org/manual/nix/unstable/contributing/experimental-features.html#currently-available-experimental-features # https://github.com/NixOS/nix/blob/master/src/libutil/experimental-features.cc experimental-features = concatStringsSep " " [ "flakes" "nix-command" "recursive-nix" "repl-flake" ]; keep-derivations = if this.isHeadful then "true" else "false"; keep-outputs = if this.isHeadful then "true" else "false"; flake-registry = "${inputs.flake-registry}/flake-registry.json"; warn-dirty = false; keep-going = true; substituters = [ "https://azahi.cachix.org" "https://nix-community.cachix.org" ]; trusted-public-keys = [ "azahi.cachix.org-1:2bayb+iWYMAVw3ZdEpVg+NPOHCXncw7WMQ0ElX1GO3s=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" ]; trusted-users = [ "root" my.username ]; }; nixPath = mapAttrsToList (n: v: "${n}=${v}") notSelfInputs ++ [ "nixfiles=${config.my.home}/src/nixfiles" ]; registry = mapAttrs (_: flake: { inherit flake; }) notSelfInputs // { nixfiles.flake = inputs.self; }; }; nixpkgs = { config.allowUnfreePredicate = p: elem (getName p) cfg.allowedUnfreePackages; overlays = with inputs; [ self.overlays.default (_: _super: { }) ]; }; environment = { localBinInPath = true; defaultPackages = mkForce [ ]; systemPackages = with pkgs; optionals this.isHeadful [ nix-top nix-tree nixfiles ]; sessionVariables = { NIXFILES = "${config.my.home}/src/nixfiles"; NIX_SHELL_PRESERVE_PROMPT = "1"; }; }; system.stateVersion = with builtins; head (split "\n" (readFile "${inputs.nixpkgs}/.version")); }; }