diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2013-10-28 00:56:22 +0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2013-10-28 22:45:55 +0100 |
commit | 0e333688cea468a28516bf6935648c03ed62a7bb (patch) | |
tree | 06657556c1e80363a51010d546cac68b98fde90a /nixos | |
parent | f4dadc5df8561405df9aabf4fa2c2dcd13234b22 (diff) | |
download | nixlib-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.nix | 13 | ||||
-rw-r--r-- | nixos/modules/config/shells-environment.nix | 9 | ||||
-rw-r--r-- | nixos/modules/system/activation/activation-script.nix | 2 |
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 = |