about summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2013-10-28 00:56:22 +0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-10-28 22:45:55 +0100
commit0e333688cea468a28516bf6935648c03ed62a7bb (patch)
tree06657556c1e80363a51010d546cac68b98fde90a /nixos
parentf4dadc5df8561405df9aabf4fa2c2dcd13234b22 (diff)
downloadnixlib-0e333688cea468a28516bf6935648c03ed62a7bb.tar
nixlib-0e333688cea468a28516bf6935648c03ed62a7bb.tar.gz
nixlib-0e333688cea468a28516bf6935648c03ed62a7bb.tar.bz2
nixlib-0e333688cea468a28516bf6935648c03ed62a7bb.tar.lz
nixlib-0e333688cea468a28516bf6935648c03ed62a7bb.tar.xz
nixlib-0e333688cea468a28516bf6935648c03ed62a7bb.tar.zst
nixlib-0e333688cea468a28516bf6935648c03ed62a7bb.zip
Big cleanup of the NixOS module system
The major changes are:

* The evaluation is now driven by the declared options.  In
  particular, this fixes the long-standing problem with lack of
  laziness of disabled option definitions.  Thus, a configuration like

    config = mkIf false {
      environment.systemPackages = throw "bla";
    };

  will now evaluate without throwing an error.  This also improves
  performance since we're not evaluating unused option definitions.

* The implementation of properties is greatly simplified.

* There is a new type constructor "submodule" that replaces
  "optionSet".  Unlike "optionSet", "submodule" gets its option
  declarations as an argument, making it more like "listOf" and other
  type constructors.  A typical use is:

    foo = mkOption {
      type = type.attrsOf (type.submodule (
        { config, ... }:
        { bar = mkOption { ... };
          xyzzy = mkOption { ... };
        }));
    };

  Existing uses of "optionSet" are automatically mapped to
  "submodule".

* Modules are now checked for unsupported attributes: you get an error
  if a module contains an attribute other than "config", "options" or
  "imports".

* The new implementation is faster and uses much less memory.
Diffstat (limited to 'nixos')
-rw-r--r--nixos/lib/eval-config.nix13
-rw-r--r--nixos/modules/config/shells-environment.nix9
-rw-r--r--nixos/modules/system/activation/activation-script.nix2
3 files changed, 8 insertions, 16 deletions
diff --git a/nixos/lib/eval-config.nix b/nixos/lib/eval-config.nix
index cd543c958ff6..119bba78ff13 100644
--- a/nixos/lib/eval-config.nix
+++ b/nixos/lib/eval-config.nix
@@ -19,11 +19,9 @@ rec {
   # Merge the option definitions in all modules, forming the full
   # system configuration.  It's not checked for undeclared options.
   systemModule =
-    pkgs.lib.fixMergeModules configComponents extraArgs;
+    pkgs.lib.evalModules configComponents extraArgs;
 
-  optionDefinitions = systemModule.config;
-  optionDeclarations = systemModule.options;
-  inherit (systemModule) options;
+  config = systemModule.config;
 
   # These are the extra arguments passed to every module.  In
   # particular, Nixpkgs is passed through the "pkgs" argument.
@@ -56,16 +54,11 @@ rec {
           # define nixpkgs.config, so it's pointless to evaluate them.
           baseModules = [ ../modules/misc/nixpkgs.nix ];
           pkgs = import ./nixpkgs.nix { system = system_; config = {}; };
-        }).optionDefinitions.nixpkgs;
+        }).config.nixpkgs;
       in
       {
         inherit system;
         inherit (nixpkgsOptions) config;
       });
 
-  # Optionally check wether all config values have corresponding
-  # option declarations.
-  config =
-    assert optionDefinitions.environment.checkConfigurationOptions -> pkgs.lib.checkModule "" systemModule;
-    systemModule.config;
 }
diff --git a/nixos/modules/config/shells-environment.nix b/nixos/modules/config/shells-environment.nix
index 4f7447f435bc..5b8b6bc600ca 100644
--- a/nixos/modules/config/shells-environment.nix
+++ b/nixos/modules/config/shells-environment.nix
@@ -26,11 +26,10 @@ in
       type = types.attrsOf (mkOptionType {
         name = "a string or a list of strings";
         merge = xs:
-          let xs' = evalProperties xs; in
-          if isList (head xs') then concatLists xs'
-          else if builtins.lessThan 1 (length xs') then abort "variable in ‘environment.variables’ has multiple values"
-          else if !builtins.isString (head xs') then abort "variable in ‘environment.variables’ does not have a string value"
-          else head xs';
+          if isList (head xs) then concatLists xs
+          else if builtins.lessThan 1 (length xs) then abort "variable in ‘environment.variables’ has multiple values"
+          else if !builtins.isString (head xs) then abort "variable in ‘environment.variables’ does not have a string value"
+          else head xs;
       });
       apply = mapAttrs (n: v: if isList v then concatStringsSep ":" v else v);
     };
diff --git a/nixos/modules/system/activation/activation-script.nix b/nixos/modules/system/activation/activation-script.nix
index ff3c844030b6..b502484a5203 100644
--- a/nixos/modules/system/activation/activation-script.nix
+++ b/nixos/modules/system/activation/activation-script.nix
@@ -52,7 +52,7 @@ in
         idempotent and fast.
       '';
 
-      merge = mergeTypedOption "script" builtins.isAttrs (fold mergeAttrs {});
+      type = types.attrsOf types.unspecified; # FIXME
 
       apply = set: {
         script =