{ 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 ../../../top-level/python-packages.nix; python2Extension = import ../../../top-level/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; }); 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 packageOverrides; pythonAtLeast = lib.versionAtLeast pythonVersion; pythonOlder = lib.versionOlder pythonVersion; inherit hasDistutilsCxxPatch; # TODO: rename to pythonOnBuild # Not done immediately because its likely used outside Nixpkgs. pythonForBuild = pythonOnBuildForHost.override { inherit packageOverrides; self = pythonForBuild; }; tests = callPackage ./tests.nix { python = self; }; inherit pythonAttr; }