From 159a6daf6b6eafd1bb0179a9ee88fca3c3318f75 Mon Sep 17 00:00:00 2001 From: Eman Resu <78693624+quatquatt@users.noreply.github.com> Date: Thu, 28 May 2026 13:24:29 -0400 Subject: [PATCH] stdenv/generic: memoise passing config to mkDerivation unless overriden --- pkgs/stdenv/darwin/default.nix | 9 +++------ pkgs/stdenv/freebsd/default.nix | 8 ++++---- pkgs/stdenv/generic/default.nix | 21 ++++++++++++++++++--- pkgs/stdenv/linux/default.nix | 9 +++++---- pkgs/stdenv/native/default.nix | 5 +++-- pkgs/stdenv/nix/default.nix | 8 ++++---- 6 files changed, 37 insertions(+), 23 deletions(-) diff --git a/pkgs/stdenv/darwin/default.nix b/pkgs/stdenv/darwin/default.nix index 3cf47e5a7334..48c2db483e4a 100644 --- a/pkgs/stdenv/darwin/default.nix +++ b/pkgs/stdenv/darwin/default.nix @@ -27,6 +27,7 @@ assert crossSystem == localSystem; let inherit (localSystem) system; + genericStdenv = import ../generic { defaultConfig = config; }; llvmVersion = "21"; # This needs to be updated when the default LLVM version is changed. sdkMajorVersion = lib.versions.major localSystem.darwinSdkVersion; @@ -104,15 +105,13 @@ let bashNonInteractive = prevStage.bashNonInteractive or bootstrapTools; - thisStdenv = import ../generic { + thisStdenv = genericStdenv { name = "${name}-stdenv-darwin"; buildPlatform = localSystem; hostPlatform = localSystem; targetPlatform = localSystem; - inherit config; - extraBuildInputs = [ prevStage.apple-sdk ]; inherit extraNativeBuildInputs; @@ -975,15 +974,13 @@ assert bootstrapTools.passthru.isFromBootstrapFiles or false; # sanity check in { inherit config overlays; - stdenv = import ../generic { + stdenv = genericStdenv { name = "stdenv-darwin"; buildPlatform = localSystem; hostPlatform = localSystem; targetPlatform = localSystem; - inherit config; - preHook = '' ${commonPreHook} stripDebugFlags="-S" # llvm-strip does not support "-p" for Mach-O diff --git a/pkgs/stdenv/freebsd/default.nix b/pkgs/stdenv/freebsd/default.nix index 046039d1ffbe..7ede014f80f1 100644 --- a/pkgs/stdenv/freebsd/default.nix +++ b/pkgs/stdenv/freebsd/default.nix @@ -21,6 +21,8 @@ assert crossSystem == localSystem; let + genericStdenv = import ../generic { defaultConfig = config; }; + inherit (localSystem) system; mkExtraBuildCommands0 = cc: '' rsrc="$out/resource-root" @@ -383,9 +385,8 @@ let bsdcp ]; shell = "${prevStage.bashNonInteractive}/bin/bash"; - stdenvNoCC = import ../generic { + stdenvNoCC = genericStdenv { inherit - config initialPath shell fetchurlBoot @@ -401,9 +402,8 @@ let inherit (prevStage) curl; inherit (config) hashedMirrors rewriteURL; }; - stdenv = import ../generic { + stdenv = genericStdenv { inherit - config initialPath shell fetchurlBoot diff --git a/pkgs/stdenv/generic/default.nix b/pkgs/stdenv/generic/default.nix index 6fa172b9a0fd..95d9228d7da2 100644 --- a/pkgs/stdenv/generic/default.nix +++ b/pkgs/stdenv/generic/default.nix @@ -1,6 +1,20 @@ +{ + defaultConfig ? null, +}@args: let lib = import ../../../lib; + + # By taking defaultConfig early, we can cache the result of calling + # make-derivation.nix with config, which leads to more memoisation between + # bootstrapping stages. We only have to re-call the file with another config + # if stdenv-overridable is actually called with config, otherwise we stick to + # defaultConfig. No stdenvs currently specify a non-default config, but we + # leave it open as a possibility. makeDerivationFile = import ./make-derivation.nix lib; + makeDerivationFileWithConfig = + assert args ? defaultConfig; + makeDerivationFile args.defaultConfig; + defaultNativeBuildInputs0 = [ ../../build-support/setup-hooks/no-broken-symlinks.sh ../../build-support/setup-hooks/audit-tmpdir.sh @@ -39,7 +53,7 @@ let allowedRequisites ? null, extraAttrs ? { }, overrides ? (self: super: { }), - config, + config ? args.defaultConfig, disallowedRequisites ? [ ], # The `fetchurl' to use for downloading curl and its dependencies @@ -83,9 +97,10 @@ let # This is convenient to have as a parameter so the stdenv "adapters" work better mkDerivationFromStdenv ? let - makeDerivationWithConfig = makeDerivationFile config; + makeDerivationWithConfig' = + if argsStdenv ? config then makeDerivationFile config else makeDerivationFileWithConfig; in - stdenv: (makeDerivationWithConfig stdenv).mkDerivation, + stdenv: (makeDerivationWithConfig' stdenv).mkDerivation, }: let diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix index d8c9470e5dfa..feb7f90a147f 100644 --- a/pkgs/stdenv/linux/default.nix +++ b/pkgs/stdenv/linux/default.nix @@ -121,6 +121,8 @@ assert crossSystem == localSystem; let + genericStdenv = import ../generic { defaultConfig = config; }; + inherit (localSystem) system; isFromNixpkgs = pkg: !(isFromBootstrapFiles pkg); @@ -174,12 +176,12 @@ let }: let - thisStdenv = import ../generic { + thisStdenv = genericStdenv { name = "${name}-stdenv-linux"; buildPlatform = localSystem; hostPlatform = localSystem; targetPlatform = localSystem; - inherit config extraNativeBuildInputs; + inherit extraNativeBuildInputs; inherit (stage0) initialPath; preHook = '' # Don't patch #!/interpreter because it leads to retained @@ -696,13 +698,12 @@ in assert isBuiltByNixpkgsCompiler prevStage.patchelf; { inherit config overlays; - stdenv = import ../generic rec { + stdenv = genericStdenv rec { name = "stdenv-linux"; buildPlatform = localSystem; hostPlatform = localSystem; targetPlatform = localSystem; - inherit config; preHook = commonPreHook; diff --git a/pkgs/stdenv/native/default.nix b/pkgs/stdenv/native/default.nix index a4b2ca42b780..697e593e205a 100644 --- a/pkgs/stdenv/native/default.nix +++ b/pkgs/stdenv/native/default.nix @@ -10,6 +10,8 @@ assert crossSystem == localSystem; let + genericStdenv = import ../generic { defaultConfig = config; }; + inherit (localSystem) system; shell = @@ -105,7 +107,7 @@ let extraNativeBuildInputs ? [ ], }: - import ../generic { + genericStdenv { buildPlatform = localSystem; hostPlatform = localSystem; targetPlatform = localSystem; @@ -145,7 +147,6 @@ let shell cc overrides - config ; }; diff --git a/pkgs/stdenv/nix/default.nix b/pkgs/stdenv/nix/default.nix index 59e67960aef1..84998fa52581 100644 --- a/pkgs/stdenv/nix/default.nix +++ b/pkgs/stdenv/nix/default.nix @@ -9,15 +9,15 @@ }: assert crossSystem == localSystem; - +let + genericStdenv = import ../generic { defaultConfig = config; }; +in bootStages ++ [ (prevStage: { inherit config overlays; - stdenv = import ../generic rec { - inherit config; - + stdenv = genericStdenv rec { inherit (prevStage.stdenv) buildPlatform hostPlatform targetPlatform; preHook = ''