about summary refs log tree commit diff
path: root/pkgs/top-level/impure.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/top-level/impure.nix')
-rw-r--r--pkgs/top-level/impure.nix59
1 files changed, 42 insertions, 17 deletions
diff --git a/pkgs/top-level/impure.nix b/pkgs/top-level/impure.nix
index 60a55c657c0c..61ef729fa104 100644
--- a/pkgs/top-level/impure.nix
+++ b/pkgs/top-level/impure.nix
@@ -1,43 +1,68 @@
 /* Impure default args for `pkgs/top-level/default.nix`. See that file
    for the meaning of each argument. */
 
-{ # Fallback: Assume we are building packages for the current (host, in GNU
-  # Autotools parlance) system.
-  system ? builtins.currentSystem
+with builtins;
+
+let
+
+  homeDir = builtins.getEnv "HOME";
+
+  # Return ‘x’ if it evaluates, or ‘def’ if it throws an exception.
+  try = x: def: let res = tryEval x; in if res.success then res.value else def;
+
+in
+
+{ # We combine legacy `system` and `platform` into `localSystem`, if
+  # `localSystem` was not passed. Strictly speaking, this is pure desugar, but
+  # it is most convient to do so before the impure `localSystem.system` default,
+  # so we do it now.
+  localSystem ? builtins.intersectAttrs { system = null; platform = null; } args
+
+, # These are needed only because nix's `--arg` command-line logic doesn't work
+  # with unnamed parameters allowed by ...
+  system ? localSystem.system
+, platform ? localSystem.platform
 
 , # Fallback: The contents of the configuration file found at $NIXPKGS_CONFIG or
-  # $HOME/.nixpkgs/config.nix.
+  # $HOME/.config/nixpkgs/config.nix.
   config ? let
-      inherit (builtins) getEnv pathExists;
-
       configFile = getEnv "NIXPKGS_CONFIG";
-      homeDir = getEnv "HOME";
-      configFile2 = homeDir + "/.nixpkgs/config.nix";
+      configFile2 = homeDir + "/.config/nixpkgs/config.nix";
+      configFile3 = homeDir + "/.nixpkgs/config.nix"; # obsolete
     in
       if configFile != "" && pathExists configFile then import configFile
       else if homeDir != "" && pathExists configFile2 then import configFile2
+      else if homeDir != "" && pathExists configFile3 then import configFile3
       else {}
 
 , # Overlays are used to extend Nixpkgs collection with additional
   # collections of packages.  These collection of packages are part of the
   # fix-point made by Nixpkgs.
   overlays ? let
-      inherit (builtins) getEnv pathExists readDir attrNames map sort
-        lessThan;
-      dirEnv = getEnv "NIXPKGS_OVERLAYS";
-      dirHome = (getEnv "HOME") + "/.nixpkgs/overlays";
+      dirPath = try (if pathExists <nixpkgs-overlays> then <nixpkgs-overlays> else "") "";
+      dirHome = homeDir + "/.config/nixpkgs/overlays";
       dirCheck = dir: dir != "" && pathExists (dir + "/.");
       overlays = dir:
         let content = readDir dir; in
-        map (n: import "${dir}/${n}") (sort lessThan (attrNames content));
+        map (n: import (dir + ("/" + n)))
+          (builtins.filter (n: builtins.match ".*\.nix" n != null)
+            (attrNames content));
     in
-      if dirEnv != "" then
-        if dirCheck dirEnv then overlays dirEnv
-        else throw "The environment variable NIXPKGS_OVERLAYS does not name a valid directory."
+      if dirPath != "" then
+        overlays dirPath
       else if dirCheck dirHome then overlays dirHome
       else []
 
 , ...
 } @ args:
 
-import ./. (args // { inherit system config overlays; })
+# If `localSystem` was explicitly passed, legacy `system` and `platform` should
+# not be passed.
+assert args ? localSystem -> !(args ? system || args ? platform);
+
+import ./. (builtins.removeAttrs args [ "system" "platform" ] // {
+  inherit config overlays;
+  # Fallback: Assume we are building packages on the current (build, in GNU
+  # Autotools parlance) system.
+  localSystem = { system = builtins.currentSystem; } // localSystem;
+})