BefatorNix/python26/passthrufun.nix
2025-08-14 11:19:20 +02:00

153 lines
4.5 KiB
Nix

{
lib,
stdenv,
callPackage,
pythonPackagesExtensions,
config,
makeScopeWithSplicing',
pythonBase,
...
}:
{
implementation,
libPrefix,
executable,
sourceVersion,
pythonVersion,
packageOverrides,
sitePackages,
hasDistutilsCxxPatch,
pythonOnBuildForBuild,
pythonOnBuildForHost,
pythonOnBuildForTarget,
pythonOnHostForHost,
pythonOnTargetForTarget,
pythonAttr ? null,
self, # is pythonOnHostForTarget
}:
let
pythonPackages =
let
ensurePythonModules =
items:
let
exceptions = [
stdenv
];
providesSetupHook = lib.attrByPath [ "provides" "setupHook" ] false;
valid =
value: pythonPackages.hasPythonModule value || providesSetupHook value || lib.elem value exceptions;
func =
name: value:
if lib.isDerivation value then
lib.extendDerivation (
valid value
|| throw "${name} should use `buildPythonPackage` or `toPythonModule` if it is to be part of the Python packages set."
) { } value
else
value;
in
lib.mapAttrs func items;
in
ensurePythonModules (
callPackage
# Function that when called
# - imports python-packages.nix
# - adds spliced package sets to the package set
# - applies overrides from `packageOverrides` and `pythonPackagesOverlays`.
(
{
pkgs,
stdenv,
python,
overrides,
}:
let
pythonPackagesFun = import "${pythonBase}/python-packages-base.nix" {
inherit stdenv pkgs lib;
python = self;
};
otherSplices = {
selfBuildBuild = pythonOnBuildForBuild.pkgs;
selfBuildHost = pythonOnBuildForHost.pkgs;
selfBuildTarget = pythonOnBuildForTarget.pkgs;
selfHostHost = pythonOnHostForHost.pkgs;
selfTargetTarget = pythonOnTargetForTarget.pkgs or { }; # There is no Python TargetTarget.
};
hooks = self: dontUse: (import "${pythonBase}/hooks/default.nix" self dontUse) // (overrides self dontUse).hookOverrides;
keep = self: hooks self { };
optionalExtensions = cond: as: lib.optionals cond as;
pythonExtension = import "${pythonBase}/../../../top-level/python-packages.nix";
python2Extension = import "${pythonBase}/../../../top-level/python2-packages.nix";
extensions = lib.composeManyExtensions (
[
hooks
pythonExtension
]
++ (optionalExtensions (!self.isPy3k) [
python2Extension
])
++ pythonPackagesExtensions
++ [
overrides
]
);
aliases =
self: super:
lib.optionalAttrs config.allowAliases (import "${pythonBase}/../../../top-level/python-aliases.nix" lib self super);
in
makeScopeWithSplicing' {
inherit otherSplices keep;
f = lib.extends (lib.composeExtensions aliases extensions) pythonPackagesFun;
}
)
{
overrides = packageOverrides;
python = self;
}
);
in
rec {
isPy26 = pythonVersion == "2.6";
isPy27 = pythonVersion == "2.7";
isPy37 = pythonVersion == "3.7";
isPy38 = pythonVersion == "3.8";
isPy39 = pythonVersion == "3.9";
isPy310 = pythonVersion == "3.10";
isPy311 = pythonVersion == "3.11";
isPy312 = pythonVersion == "3.12";
isPy313 = pythonVersion == "3.13";
isPy314 = pythonVersion == "3.14";
isPy2 = lib.strings.substring 0 1 pythonVersion == "2";
isPy3 = lib.strings.substring 0 1 pythonVersion == "3";
isPy3k = isPy3;
isPyPy = lib.hasInfix "pypy" interpreter;
buildEnv = callPackage "${pythonBase}/wrapper.nix" {
python = self;
inherit (pythonPackages) requiredPythonModules;
};
withPackages = import "${pythonBase}/with-packages.nix" { inherit buildEnv pythonPackages; };
pkgs = pythonPackages;
interpreter = "${self}/bin/${executable}";
inherit
executable
implementation
libPrefix
pythonVersion
sitePackages
;
inherit sourceVersion;
pythonAtLeast = lib.versionAtLeast pythonVersion;
pythonOlder = lib.versionOlder pythonVersion;
inherit hasDistutilsCxxPatch;
inherit pythonOnBuildForHost;
tests = callPackage "${pythonBase}/tests.nix" {
python = self;
};
inherit pythonAttr;
}