nixpkgs/pkgs/top-level/impure.nix
Tom Hunger 4a524cf662 Allow directories with a default.nix to be imported as an overlay. Closes #23016.
Note that ${} substitution doesn't work because of the "cannot refer
to other paths" constraint. The paranthesis are needed to enforce
right-first evaluation.
2017-02-25 02:32:04 +01:00

68 lines
2.6 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Impure default args for `pkgs/top-level/default.nix`. See that file
for the meaning of each argument. */
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/.config/nixpkgs/config.nix.
config ? let
configFile = getEnv "NIXPKGS_CONFIG";
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
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)))
(builtins.filter (n: builtins.match ".*\.nix" n != null || pathExists (dir + ("/" + n + "/default.nix")))
(attrNames content));
in
if dirPath != "" then
overlays dirPath
else if dirCheck dirHome then overlays dirHome
else []
, ...
} @ args:
# 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;
})