diff --git a/flake.nix b/flake.nix index 3bd0a48a5cce..3d01030806fb 100644 --- a/flake.nix +++ b/flake.nix @@ -209,11 +209,14 @@ */ legacyPackages = forAllSystems ( system: - (import ./. { inherit system; }).extend ( - final: prev: { - lib = prev.lib.extend libVersionInfoOverlay; - } - ) + (import ./. { + inherit system; + overlays = import ./pkgs/top-level/impure-overlays.nix ++ [ + (final: prev: { + lib = prev.lib.extend libVersionInfoOverlay; + }) + ]; + }) ); /** diff --git a/pkgs/top-level/impure-overlays.nix b/pkgs/top-level/impure-overlays.nix new file mode 100644 index 000000000000..522bb3267429 --- /dev/null +++ b/pkgs/top-level/impure-overlays.nix @@ -0,0 +1,61 @@ +/** + This file has as its value the list of overlays, as determined from the environment. + If Nix evaluation is [pure](https://nix.dev/manual/nix/latest/command-ref/conf-file.html?highlight=pure-eval#conf-pure-eval), then the list is empty. +*/ +let + # Return ‘x’ if it evaluates, or ‘def’ if it throws an exception. + try = + x: def: + let + res = builtins.tryEval x; + in + if res.success then res.value else def; + homeDir = builtins.getEnv "HOME"; + + isDir = path: builtins.pathExists (path + "/."); + pathOverlays = try (toString ) ""; + homeOverlaysFile = homeDir + "/.config/nixpkgs/overlays.nix"; + homeOverlaysDir = homeDir + "/.config/nixpkgs/overlays"; + overlays = + path: + # check if the path is a directory or a file + if isDir path then + # it's a directory, so the set of overlays from the directory, ordered lexicographically + let + content = builtins.readDir path; + in + map (n: import (path + ("/" + n))) ( + builtins.filter ( + n: + ( + builtins.match ".*\\.nix" n != null + && + # ignore Emacs lock files (.#foo.nix) + builtins.match "\\.#.*" n == null + ) + || builtins.pathExists (path + ("/" + n + "/default.nix")) + ) (builtins.attrNames content) + ) + else + # it's a file, so the result is the contents of the file itself + import path; +in +if pathOverlays != "" && builtins.pathExists pathOverlays then + overlays pathOverlays +else if builtins.pathExists homeOverlaysFile && builtins.pathExists homeOverlaysDir then + throw '' + Nixpkgs overlays can be specified with ${homeOverlaysFile} or ${homeOverlaysDir}, but not both. + Please remove one of them and try again. + '' +else if builtins.pathExists homeOverlaysFile then + if isDir homeOverlaysFile then + throw (homeOverlaysFile + " should be a file") + else + overlays homeOverlaysFile +else if builtins.pathExists homeOverlaysDir then + if !(isDir homeOverlaysDir) then + throw (homeOverlaysDir + " should be a directory") + else + overlays homeOverlaysDir +else + [ ] diff --git a/pkgs/top-level/impure.nix b/pkgs/top-level/impure.nix index 88a92d7755e5..db79a1588a7c 100644 --- a/pkgs/top-level/impure.nix +++ b/pkgs/top-level/impure.nix @@ -7,14 +7,6 @@ let homeDir = builtins.getEnv "HOME"; - # Return ‘x’ if it evaluates, or ‘def’ if it throws an exception. - try = - x: def: - let - res = builtins.tryEval x; - in - if res.success then res.value else def; - in { @@ -50,55 +42,7 @@ in # 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 - isDir = path: builtins.pathExists (path + "/."); - pathOverlays = try (toString ) ""; - homeOverlaysFile = homeDir + "/.config/nixpkgs/overlays.nix"; - homeOverlaysDir = homeDir + "/.config/nixpkgs/overlays"; - overlays = - path: - # check if the path is a directory or a file - if isDir path then - # it's a directory, so the set of overlays from the directory, ordered lexicographically - let - content = builtins.readDir path; - in - map (n: import (path + ("/" + n))) ( - builtins.filter ( - n: - ( - builtins.match ".*\\.nix" n != null - && - # ignore Emacs lock files (.#foo.nix) - builtins.match "\\.#.*" n == null - ) - || builtins.pathExists (path + ("/" + n + "/default.nix")) - ) (builtins.attrNames content) - ) - else - # it's a file, so the result is the contents of the file itself - import path; - in - if pathOverlays != "" && builtins.pathExists pathOverlays then - overlays pathOverlays - else if builtins.pathExists homeOverlaysFile && builtins.pathExists homeOverlaysDir then - throw '' - Nixpkgs overlays can be specified with ${homeOverlaysFile} or ${homeOverlaysDir}, but not both. - Please remove one of them and try again. - '' - else if builtins.pathExists homeOverlaysFile then - if isDir homeOverlaysFile then - throw (homeOverlaysFile + " should be a file") - else - overlays homeOverlaysFile - else if builtins.pathExists homeOverlaysDir then - if !(isDir homeOverlaysDir) then - throw (homeOverlaysDir + " should be a directory") - else - overlays homeOverlaysDir - else - [ ], + overlays ? import ./impure-overlays.nix, crossOverlays ? [ ],