1
0
Fork 1
mirror of https://github.com/NixOS/nixpkgs.git synced 2024-09-11 15:08:33 +01:00

Merge pull request #32544 from FRidh/pythonmodule

Python: rewrite requiredPythonModules to prevent stack overflows
This commit is contained in:
Frederik Rietdijk 2017-12-11 09:46:15 +01:00 committed by GitHub
commit 35ccdb8632
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 20 deletions

View file

@ -7,7 +7,7 @@
, setuptools
, unzip
, ensureNewerSourcesHook
, pythonModule
, toPythonModule
, namePrefix
, bootstrapped-pip
, flit
@ -19,7 +19,7 @@ let
wheel-specific = import ./build-python-package-wheel.nix { };
common = import ./build-python-package-common.nix { inherit python bootstrapped-pip; };
mkPythonDerivation = import ./mk-python-derivation.nix {
inherit lib python wrapPython setuptools unzip ensureNewerSourcesHook pythonModule namePrefix;
inherit lib python wrapPython setuptools unzip ensureNewerSourcesHook toPythonModule namePrefix;
};
in

View file

@ -7,7 +7,7 @@
, unzip
, ensureNewerSourcesHook
# Whether the derivation provides a Python module or not.
, pythonModule
, toPythonModule
, namePrefix
}:
@ -60,7 +60,7 @@ if disabled
then throw "${name} not supported for interpreter ${python.executable}"
else
python.stdenv.mkDerivation (builtins.removeAttrs attrs [
toPythonModule (python.stdenv.mkDerivation (builtins.removeAttrs attrs [
"disabled" "checkInputs" "doCheck" "doInstallCheck" "dontWrapPythonPrograms" "catchConflicts"
] // {
@ -95,14 +95,9 @@ python.stdenv.mkDerivation (builtins.removeAttrs attrs [
${python.interpreter} ${./catch_conflicts}/catch_conflicts.py
'' + attrs.postFixup or '''';
passthru = {
inherit python; # The python interpreter
inherit pythonModule;
} // passthru;
meta = {
# default to python's platforms
platforms = python.meta.platforms;
isBuildPythonPackage = python.meta.platforms;
} // meta;
})
}))

View file

@ -56,14 +56,14 @@ let
flit = self.flit;
# We want Python libraries to be named like e.g. "python3.6-${name}"
inherit namePrefix;
pythonModule = python;
inherit toPythonModule;
}));
buildPythonApplication = makeOverridablePythonPackage ( makeOverridable (callPackage ../development/interpreters/python/build-python-package.nix {
inherit bootstrapped-pip;
flit = self.flit;
namePrefix = "";
pythonModule = false;
toPythonModule = x: x; # Application does not provide modules.
}));
graphiteVersion = "1.0.2";
@ -87,15 +87,12 @@ let
in fetcher (builtins.removeAttrs attrs ["format"]) );
# Check whether a derivation provides a Python module.
hasPythonModule = drv: (hasAttr "pythonModule" drv) && ( (getAttr "pythonModule" drv) == python);
hasPythonModule = drv: drv?pythonModule && drv.pythonModule == python;
# Get list of required Python modules given a list of derivations.
requiredPythonModules = drvs: let
filterNull = list: filter (x: !isNull x) list;
conditionalGetRecurse = attr: condition: drv: let f = conditionalGetRecurse attr condition; in
(if (condition drv) then unique [drv]++(concatMap f (filterNull(getAttr attr drv))) else []);
_required = drv: conditionalGetRecurse "propagatedBuildInputs" hasPythonModule drv;
in [python] ++ (unique (concatMap _required (filterNull drvs)));
modules = filter hasPythonModule drvs;
in unique ([python] ++ modules ++ concatLists (catAttrs "requiredPythonModules" modules));
# Create a PYTHONPATH from a list of derivations. This function recurses into the items to find derivations
# providing Python modules.
@ -106,9 +103,9 @@ let
drv.overrideAttrs( oldAttrs: {
# Use passthru in order to prevent rebuilds when possible.
passthru = (oldAttrs.passthru or {})// {
name = namePrefix + oldAttrs.name;
pythonModule = python;
pythonPath = [ ]; # Deprecated, for compatibility.
requiredPythonModules = requiredPythonModules drv.propagatedBuildInputs;
};
});
@ -129,7 +126,7 @@ in {
recursivePthLoader = callPackage ../development/python-modules/recursive-pth-loader { };
setuptools = callPackage ../development/python-modules/setuptools { };
setuptools = toPythonModule (callPackage ../development/python-modules/setuptools { });
vowpalwabbit = callPackage ../development/python-modules/vowpalwabbit {
pythonPackages = self;