From 4ef0c2ded41c446cd8cd2611554487363e28ee15 Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Mon, 5 Jan 2026 15:33:29 +0800 Subject: [PATCH 1/3] buildPython*: overrideStdenvCompat: abstract warning Co-authored-by: Matt Sturgeon --- .../python/python-packages-base.nix | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/pkgs/development/interpreters/python/python-packages-base.nix b/pkgs/development/interpreters/python/python-packages-base.nix index 91d733a33c3e..74ae67e1b563 100644 --- a/pkgs/development/interpreters/python/python-packages-base.nix +++ b/pkgs/development/interpreters/python/python-packages-base.nix @@ -53,13 +53,19 @@ let f': lib.mirrorFunctionArgs f ( args: + let + getName = x: x.pname or (lib.getName (x.name or "")); + applyMsgStdenvArg = + name: + lib.warnIf (lib.oldestSupportedReleaseIsAtLeast 2511) '' + ${name}: Passing `stdenv` directly to `buildPythonPackage` or `buildPythonApplication` is deprecated. You should use their `.override` function instead, e.g: + buildPythonPackage.override { stdenv = customStdenv; } { } + ''; + in if !(lib.isFunction args) && (args ? stdenv) then - lib.warnIf (lib.oldestSupportedReleaseIsAtLeast 2511) '' - ${ - args.name or args.pname or "" - }: 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" ])) + applyMsgStdenvArg (getName args) ( + f'.override { inherit (args) stdenv; } (removeAttrs args [ "stdenv" ]) + ) else f args ) From 5b114f0534d820d60186d402e8964b64d67e810e Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Mon, 5 Jan 2026 15:37:43 +0800 Subject: [PATCH 2/3] buildPython*: overrideStdenvCompat: lower warnings down to the stdenv override value If Nix supports lazy attribute names in the future, this change will make `.override` warning-free and make such warning (or future throw) remediateable via another override. --- pkgs/development/interpreters/python/python-packages-base.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/interpreters/python/python-packages-base.nix b/pkgs/development/interpreters/python/python-packages-base.nix index 74ae67e1b563..1fe5fcbaf60e 100644 --- a/pkgs/development/interpreters/python/python-packages-base.nix +++ b/pkgs/development/interpreters/python/python-packages-base.nix @@ -63,8 +63,8 @@ let ''; in if !(lib.isFunction args) && (args ? stdenv) then - applyMsgStdenvArg (getName args) ( - f'.override { inherit (args) stdenv; } (removeAttrs args [ "stdenv" ]) + f'.override { stdenv = applyMsgStdenvArg (getName args) args.stdenv; } ( + removeAttrs args [ "stdenv" ] ) else f args From de48b6a845e7f206d8c11075a507814b6b5d13c7 Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Mon, 5 Jan 2026 16:06:56 +0800 Subject: [PATCH 3/3] buildPython*: extend overrideStdenvCompat to fixed-point arguments with `passthru.__stdenvPythonCompat` Co-authored-by: Matt Sturgeon --- .../interpreters/python/mk-python-derivation.nix | 1 + .../interpreters/python/python-packages-base.nix | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pkgs/development/interpreters/python/mk-python-derivation.nix b/pkgs/development/interpreters/python/mk-python-derivation.nix index f3e5249c189e..0fb0a1326025 100644 --- a/pkgs/development/interpreters/python/mk-python-derivation.nix +++ b/pkgs/development/interpreters/python/mk-python-derivation.nix @@ -418,6 +418,7 @@ lib.extendMkDerivation { optional-dependencies ; updateScript = nix-update-script { }; + ${if attrs ? stdenv then "__stdenvPythonCompat" else null} = attrs.stdenv; } // attrs.passthru or { }; diff --git a/pkgs/development/interpreters/python/python-packages-base.nix b/pkgs/development/interpreters/python/python-packages-base.nix index 1fe5fcbaf60e..77ac26630161 100644 --- a/pkgs/development/interpreters/python/python-packages-base.nix +++ b/pkgs/development/interpreters/python/python-packages-base.nix @@ -54,6 +54,7 @@ let lib.mirrorFunctionArgs f ( args: let + result = f args; getName = x: x.pname or (lib.getName (x.name or "")); applyMsgStdenvArg = name: @@ -62,12 +63,18 @@ let buildPythonPackage.override { stdenv = customStdenv; } { } ''; in - if !(lib.isFunction args) && (args ? stdenv) then + if lib.isFunction args && result ? __stdenvPythonCompat then + # Less reliable, as constructing with the wrong `stdenv` might lead to evaluation errors in the package definition. + f'.override { stdenv = applyMsgStdenvArg (getName result) result.__stdenvPythonCompat; } ( + finalAttrs: removeAttrs (args finalAttrs) [ "stdenv" ] + ) + else if (!lib.isFunction args) && (args ? stdenv) then + # More reliable, but only works when args is not `(finalAttrs: { })` f'.override { stdenv = applyMsgStdenvArg (getName args) args.stdenv; } ( removeAttrs args [ "stdenv" ] ) else - f args + result ) // { # Preserve the effect of overrideStdenvCompat when calling `buildPython*.override`.