From fbd038eca24703d8c5cc3ce28adda3e71c5fabf4 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Sun, 2 Jan 2022 14:11:21 +0100 Subject: [PATCH] nixos/lib: init (experimental) --- flake.nix | 3 +++ nixos/lib/default.nix | 47 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 nixos/lib/default.nix diff --git a/flake.nix b/flake.nix index 1e20fcd40eb..3275370017d 100644 --- a/flake.nix +++ b/flake.nix @@ -18,6 +18,9 @@ in { lib = lib.extend (final: prev: { + + nixos = import ./nixos/lib { lib = final; }; + nixosSystem = { modules, ... } @ args: import ./nixos/lib/eval-config.nix (args // { modules = diff --git a/nixos/lib/default.nix b/nixos/lib/default.nix new file mode 100644 index 00000000000..6479b714490 --- /dev/null +++ b/nixos/lib/default.nix @@ -0,0 +1,47 @@ +let + # The warning is in a top-level let binding so it is only printed once. + experimentalWarning = warn "lib.nixos.evalModules is experimental and subject to change. See nixos/lib/default.nix" null; + inherit (nonExtendedLib) warn; + nonExtendedLib = import ../../lib; +in +{ lib ? nonExtendedLib, ... }: +let + + /* + Invoke NixOS. Unlike traditional NixOS, this does not include all modules. + Any such modules have to be explicitly added via the `modules` parameter, + or imported using `imports` in a module. + + A minimal module list improves NixOS evaluation performance and allows + modules to be independently usable, supporting new use cases. + + Parameters: + + modules: A list of modules that constitute the configuration. + + specialArgs: An attribute set of module arguments. Unlike + `config._module.args`, these are available for use in + `imports`. + `config._module.args` should be preferred when possible. + + Return: + + An attribute set containing `config.system.build.toplevel` among other + attributes. See `lib.evalModules` in the Nixpkgs library. + + */ + evalModules = { + prefix ? [], + modules ? [], + specialArgs ? {}, + }: lib.evalModules { + inherit prefix modules; + specialArgs = { + modulesPath = builtins.toString ../modules; + } // specialArgs; + }; + +in +{ + evalModules = builtins.seq experimentalWarning evalModules; +}