From 553a6c3d3a181a57dc87b250643bac59317ae9fc Mon Sep 17 00:00:00 2001 From: Matt Sturgeon Date: Sun, 26 Oct 2025 08:48:30 +0000 Subject: [PATCH] buildPython*: preserve overrideStdenvCompat on subsequent overrides This is needed to support the deprecated method of overriding `stdenv` via `overridePythonAttrs`. --- .../python/python-packages-base.nix | 31 ++++++++++--------- pkgs/test/overriding.nix | 7 +++++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/pkgs/development/interpreters/python/python-packages-base.nix b/pkgs/development/interpreters/python/python-packages-base.nix index b6203ae0a0b0..c513561ce6fb 100644 --- a/pkgs/development/interpreters/python/python-packages-base.nix +++ b/pkgs/development/interpreters/python/python-packages-base.nix @@ -45,20 +45,23 @@ let overrideStdenvCompat = f: - lib.mirrorFunctionArgs f ( - args: - if !(lib.isFunction args) && (args ? stdenv) then - lib.warnIf (lib.oldestSupportedReleaseIsAtLeast 2511) '' - Passing `stdenv` directly to `buildPythonPackage` or `buildPythonApplication` is deprecated. You should use their `.override` function instead, e.g: - buildPythonPackage.override { stdenv = customStdenv; } { } - '' (f.override { inherit (args) stdenv; } (removeAttrs args [ "stdenv" ])) - else - f args - ) - // { - # Intentionally drop the effect of overrideStdenvCompat when calling `buildPython*.override`. - inherit (f) override; - }; + lib.fix ( + f': + lib.mirrorFunctionArgs f ( + args: + if !(lib.isFunction args) && (args ? stdenv) then + lib.warnIf (lib.oldestSupportedReleaseIsAtLeast 2511) '' + Passing `stdenv` directly to `buildPythonPackage` or `buildPythonApplication` is deprecated. You should use their `.override` function instead, e.g: + buildPythonPackage.override { stdenv = customStdenv; } { } + '' (f'.override { inherit (args) stdenv; } (removeAttrs args [ "stdenv" ])) + else + f args + ) + // { + # Preserve the effect of overrideStdenvCompat when calling `buildPython*.override`. + override = lib.mirrorFunctionArgs f.override (newArgs: overrideStdenvCompat (f.override newArgs)); + } + ); mkPythonDerivation = if python.isPy3k then ./mk-python-derivation.nix else ./python2/mk-python-derivation.nix; diff --git a/pkgs/test/overriding.nix b/pkgs/test/overriding.nix index 21baca35e927..9ee13e3778d2 100644 --- a/pkgs/test/overriding.nix +++ b/pkgs/test/overriding.nix @@ -453,6 +453,13 @@ let })).stdenv; expected = pkgs.clangStdenv; }; + overridePythonAttrs-override-clangStdenv-deprecated-nested = { + expr = + (package-stub-gcc.overridePythonAttrs { + stdenv = pkgs.clangStdenv; + }).stdenv; + expected = pkgs.clangStdenv; + }; overridePythonAttrs = { expr = (applyOverridePythonAttrs package-stub).overridePythonAttrsFlag;