diff options
Diffstat (limited to 'pkgs/top-level/impure.nix')
-rw-r--r-- | pkgs/top-level/impure.nix | 59 |
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; +}) |