summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Hensing <roberth@users.noreply.github.com>2022-01-20 14:42:46 +0100
committerGitHub <noreply@github.com>2022-01-20 14:42:46 +0100
commit98ae5a9298d8a8372b626f72b34388e7848b437a (patch)
tree9c52abb86b83fad21e310bcd398b6d3950087ff9
parentpython310Packages.python-telegram-bot: 13.9 -> 13.10 (diff)
parentnixos/lib: Clarify that nixos.evalModules impl is NOT experimental (diff)
downloadnixpkgs-98ae5a9298d8a8372b626f72b34388e7848b437a.tar.gz
Merge pull request #153211 from hercules-ci/minimal-nixos
Add minimal NixOS entrypoint
-rw-r--r--flake.nix3
-rw-r--r--nixos/lib/default.nix33
-rw-r--r--nixos/lib/eval-config-minimal.nix49
-rw-r--r--nixos/lib/eval-config.nix12
-rw-r--r--nixos/modules/misc/nixpkgs.nix5
-rw-r--r--nixos/modules/misc/nixpkgs/test.nix8
-rw-r--r--nixos/tests/all-tests.nix8
7 files changed, 114 insertions, 4 deletions
diff --git a/flake.nix b/flake.nix
index bb76fae486d5..29dffa9fa4e4 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 000000000000..2b3056e01457
--- /dev/null
+++ b/nixos/lib/default.nix
@@ -0,0 +1,33 @@
+let
+ # The warning is in a top-level let binding so it is only printed once.
+ minimalModulesWarning = warn "lib.nixos.evalModules is experimental and subject to change. See nixos/lib/default.nix" null;
+ inherit (nonExtendedLib) warn;
+ nonExtendedLib = import ../../lib;
+in
+{ # Optional. Allows an extended `lib` to be used instead of the regular Nixpkgs lib.
+ lib ? nonExtendedLib,
+
+ # Feature flags allow you to opt in to unfinished code. These may change some
+ # behavior or disable warnings.
+ featureFlags ? {},
+
+ # This file itself is rather new, so we accept unknown parameters to be forward
+ # compatible. This is generally not recommended, because typos go undetected.
+ ...
+}:
+let
+ seqIf = cond: if cond then builtins.seq else a: b: b;
+ # If cond, force `a` before returning any attr
+ seqAttrsIf = cond: a: lib.mapAttrs (_: v: seqIf cond a v);
+
+ eval-config-minimal = import ./eval-config-minimal.nix { inherit lib; };
+in
+/*
+ This attribute set appears as lib.nixos in the flake, or can be imported
+ using a binding like `nixosLib = import (nixpkgs + "/nixos/lib") { }`.
+*/
+{
+ inherit (seqAttrsIf (!featureFlags?minimalModules) minimalModulesWarning eval-config-minimal)
+ evalModules
+ ;
+}
diff --git a/nixos/lib/eval-config-minimal.nix b/nixos/lib/eval-config-minimal.nix
new file mode 100644
index 000000000000..d45b9ffd4261
--- /dev/null
+++ b/nixos/lib/eval-config-minimal.nix
@@ -0,0 +1,49 @@
+
+# DO NOT IMPORT. Use nixpkgsFlake.lib.nixos, or import (nixpkgs + "/nixos/lib")
+{ lib }: # read -^
+
+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 ? {},
+ }:
+ # NOTE: Regular NixOS currently does use this function! Don't break it!
+ # Ideally we don't diverge, unless we learn that we should.
+ # In other words, only the public interface of nixos.evalModules
+ # is experimental.
+ lib.evalModules {
+ inherit prefix modules;
+ specialArgs = {
+ modulesPath = builtins.toString ../modules;
+ } // specialArgs;
+ };
+
+in
+{
+ inherit evalModules;
+}
diff --git a/nixos/lib/eval-config.nix b/nixos/lib/eval-config.nix
index 00e58e24e926..e3eb88a60eba 100644
--- a/nixos/lib/eval-config.nix
+++ b/nixos/lib/eval-config.nix
@@ -33,6 +33,12 @@ let pkgs_ = pkgs;
in
let
+ evalModulesMinimal = (import ./default.nix {
+ inherit lib;
+ # Implicit use of feature is noted in implementation.
+ featureFlags.minimalModules = { };
+ }).evalModules;
+
pkgsModule = rec {
_file = ./eval-config.nix;
key = _file;
@@ -70,11 +76,9 @@ let
};
allUserModules = modules ++ legacyModules;
- noUserModules = lib.evalModules ({
- inherit prefix;
+ noUserModules = evalModulesMinimal ({
+ inherit prefix specialArgs;
modules = baseModules ++ extraModules ++ [ pkgsModule modulesModule ];
- specialArgs =
- { modulesPath = builtins.toString ../modules; } // specialArgs;
});
# Extra arguments that are useful for constructing a similar configuration.
diff --git a/nixos/modules/misc/nixpkgs.nix b/nixos/modules/misc/nixpkgs.nix
index 2e0c8e4cf2c4..69967c8a7601 100644
--- a/nixos/modules/misc/nixpkgs.nix
+++ b/nixos/modules/misc/nixpkgs.nix
@@ -64,6 +64,11 @@ let
in
{
+ imports = [
+ ./assertions.nix
+ ./meta.nix
+ ];
+
options.nixpkgs = {
pkgs = mkOption {
diff --git a/nixos/modules/misc/nixpkgs/test.nix b/nixos/modules/misc/nixpkgs/test.nix
new file mode 100644
index 000000000000..ec5fab9fb4a5
--- /dev/null
+++ b/nixos/modules/misc/nixpkgs/test.nix
@@ -0,0 +1,8 @@
+{ evalMinimalConfig, pkgs, lib, stdenv }:
+lib.recurseIntoAttrs {
+ invokeNixpkgsSimple =
+ (evalMinimalConfig ({ config, modulesPath, ... }: {
+ imports = [ (modulesPath + "/misc/nixpkgs.nix") ];
+ nixpkgs.system = stdenv.hostPlatform.system;
+ }))._module.args.pkgs.hello;
+}
diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
index b2f223e7ccdc..6e66e9cbe96d 100644
--- a/nixos/tests/all-tests.nix
+++ b/nixos/tests/all-tests.nix
@@ -19,6 +19,13 @@ let
handleTestOn = systems: path: args:
if elem system systems then handleTest path args
else {};
+
+ nixosLib = import ../lib {
+ # Experimental features need testing too, but there's no point in warning
+ # about it, so we enable the feature flag.
+ featureFlags.minimalModules = {};
+ };
+ evalMinimalConfig = module: nixosLib.evalModules { modules = [ module ]; };
in
{
_3proxy = handleTest ./3proxy.nix {};
@@ -331,6 +338,7 @@ in
nix-serve-ssh = handleTest ./nix-serve-ssh.nix {};
nixops = handleTest ./nixops/default.nix {};
nixos-generate-config = handleTest ./nixos-generate-config.nix {};
+ nixpkgs = pkgs.callPackage ../modules/misc/nixpkgs/test.nix { inherit evalMinimalConfig; };
node-red = handleTest ./node-red.nix {};
nomad = handleTest ./nomad.nix {};
novacomd = handleTestOn ["x86_64-linux"] ./novacomd.nix {};