core/pkgs/by-name/py/python/passthrufun.nix
2024-05-13 22:24:10 +01:00

103 lines
4 KiB
Nix

{ lib, stdenv, callPackage, pythonPackagesExtensions, config
, makeScopeWithSplicing', ... }:
{ 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 ./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 = import ./hooks/default.nix;
keep = self: hooks self { };
optionalExtensions = cond: as: lib.optionals cond as;
pythonExtension = import ./python-packages.nix;
python2Extension = import ./python2-packages.nix;
extensions = lib.composeManyExtensions ([ hooks pythonExtension ]
++ (optionalExtensions (!self.isPy3k) [ python2Extension ])
++ pythonPackagesExtensions ++ [ overrides ]);
aliases = self: super:
{ }; # lib.optionalAttrs config.allowAliases (import ../../../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;
});
pythonOnBuildForHost_overridden = pythonOnBuildForHost.override {
inherit packageOverrides;
self = pythonOnBuildForHost_overridden;
};
in rec {
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";
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 ./wrapper.nix {
python = self;
inherit (pythonPackages) requiredPythonModules;
};
withPackages =
import ./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;
# Remove after 24.11 is released.
pythonForBuild = lib.warnIf (lib.isInOldestRelease 2311)
"`pythonForBuild` (from `python*`) has been renamed to `pythonOnBuildForHost`"
pythonOnBuildForHost_overridden;
pythonOnBuildForHost = pythonOnBuildForHost_overridden;
tests = callPackage ./tests.nix { python = self; };
inherit pythonAttr;
}