From bd3d85928a10c5b66b02e632e1d8acfdf1d7af2c Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Mon, 7 Jul 2025 20:30:20 +0200 Subject: [PATCH 1/2] pkgs/impure-overlays.nix: Factor out from impure.nix No change in behavior. By factoring this out, we can pass an extra overlay in addition to the impure ones in callers. --- pkgs/top-level/impure-overlays.nix | 61 ++++++++++++++++++++++++++++++ pkgs/top-level/impure.nix | 58 +--------------------------- 2 files changed, 62 insertions(+), 57 deletions(-) create mode 100644 pkgs/top-level/impure-overlays.nix 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 ? [ ], From b78a8c9109b481e559c7b350695e671b3fbc37db Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Mon, 7 Jul 2025 20:36:26 +0200 Subject: [PATCH 2/2] flake.nix: Construct legacyPackages in one go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This saves the construction of an unused `pkgs` attrset and all that is required to reach that, which is not a lot, but still significant. Benchmark 1: nix eval .?ref=42608bc8e65c5bf596d6155ad2f0ded6253b1e69#hello.outPath --no-eval-cache Time (mean ± σ): 1.062 s ± 0.011 s [User: 0.674 s, System: 0.226 s] Range (min … max): 1.040 s … 1.080 s 10 runs Benchmark 2: nix eval .?ref=8a7e18b270cb2256a0526b9cda1d9e410aacd440#hello.outPath --no-eval-cache Time (mean ± σ): 1.317 s ± 0.033 s [User: 0.835 s, System: 0.270 s] Range (min … max): 1.282 s … 1.371 s 10 runs Summary nix eval .?ref=42608bc8e65c5bf596d6155ad2f0ded6253b1e69#hello.outPath --no-eval-cache ran 1.24 ± 0.03 times faster than nix eval .?ref=8a7e18b270cb2256a0526b9cda1d9e410aacd440#hello.outPath --no-eval-cache (where 42608bc had the same tree as this commit) --- flake.nix | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) 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; + }) + ]; + }) ); /**