summaryrefslogtreecommitdiff
path: root/src/pip/_internal/distributions
diff options
context:
space:
mode:
Diffstat (limited to 'src/pip/_internal/distributions')
-rw-r--r--src/pip/_internal/distributions/base.py5
-rw-r--r--src/pip/_internal/distributions/installed.py9
-rw-r--r--src/pip/_internal/distributions/sdist.py35
-rw-r--r--src/pip/_internal/distributions/wheel.py5
4 files changed, 41 insertions, 13 deletions
diff --git a/src/pip/_internal/distributions/base.py b/src/pip/_internal/distributions/base.py
index 149fff55d..75ce2dc90 100644
--- a/src/pip/_internal/distributions/base.py
+++ b/src/pip/_internal/distributions/base.py
@@ -31,6 +31,9 @@ class AbstractDistribution(metaclass=abc.ABCMeta):
@abc.abstractmethod
def prepare_distribution_metadata(
- self, finder: PackageFinder, build_isolation: bool
+ self,
+ finder: PackageFinder,
+ build_isolation: bool,
+ check_build_deps: bool,
) -> None:
raise NotImplementedError()
diff --git a/src/pip/_internal/distributions/installed.py b/src/pip/_internal/distributions/installed.py
index 6c8c17929..edb38aa1a 100644
--- a/src/pip/_internal/distributions/installed.py
+++ b/src/pip/_internal/distributions/installed.py
@@ -11,12 +11,13 @@ class InstalledDistribution(AbstractDistribution):
"""
def get_metadata_distribution(self) -> BaseDistribution:
- from pip._internal.metadata.pkg_resources import Distribution as _Dist
-
assert self.req.satisfied_by is not None, "not actually installed"
- return _Dist(self.req.satisfied_by)
+ return self.req.satisfied_by
def prepare_distribution_metadata(
- self, finder: PackageFinder, build_isolation: bool
+ self,
+ finder: PackageFinder,
+ build_isolation: bool,
+ check_build_deps: bool,
) -> None:
pass
diff --git a/src/pip/_internal/distributions/sdist.py b/src/pip/_internal/distributions/sdist.py
index cd85ac5c4..4c2564793 100644
--- a/src/pip/_internal/distributions/sdist.py
+++ b/src/pip/_internal/distributions/sdist.py
@@ -19,12 +19,13 @@ class SourceDistribution(AbstractDistribution):
"""
def get_metadata_distribution(self) -> BaseDistribution:
- from pip._internal.metadata.pkg_resources import Distribution as _Dist
-
- return _Dist(self.req.get_dist())
+ return self.req.get_dist()
def prepare_distribution_metadata(
- self, finder: PackageFinder, build_isolation: bool
+ self,
+ finder: PackageFinder,
+ build_isolation: bool,
+ check_build_deps: bool,
) -> None:
# Load pyproject.toml, to determine whether PEP 517 is to be used
self.req.load_pyproject_toml()
@@ -45,7 +46,18 @@ class SourceDistribution(AbstractDistribution):
self.req.isolated_editable_sanity_check()
# Install the dynamic build requirements.
self._install_build_reqs(finder)
-
+ # Check if the current environment provides build dependencies
+ should_check_deps = self.req.use_pep517 and check_build_deps
+ if should_check_deps:
+ pyproject_requires = self.req.pyproject_requires
+ assert pyproject_requires is not None
+ conflicting, missing = self.req.build_env.check_requirements(
+ pyproject_requires
+ )
+ if conflicting:
+ self._raise_conflicts("the backend dependencies", conflicting)
+ if missing:
+ self._raise_missing_reqs(missing)
self.req.prepare_metadata()
def _prepare_build_backend(self, finder: PackageFinder) -> None:
@@ -56,7 +68,7 @@ class SourceDistribution(AbstractDistribution):
self.req.build_env = BuildEnvironment()
self.req.build_env.install_requirements(
- finder, pyproject_requires, "overlay", "Installing build dependencies"
+ finder, pyproject_requires, "overlay", kind="build dependencies"
)
conflicting, missing = self.req.build_env.check_requirements(
self.req.requirements_to_check
@@ -108,7 +120,7 @@ class SourceDistribution(AbstractDistribution):
if conflicting:
self._raise_conflicts("the backend dependencies", conflicting)
self.req.build_env.install_requirements(
- finder, missing, "normal", "Installing backend dependencies"
+ finder, missing, "normal", kind="backend dependencies"
)
def _raise_conflicts(
@@ -127,3 +139,12 @@ class SourceDistribution(AbstractDistribution):
),
)
raise InstallationError(error_message)
+
+ def _raise_missing_reqs(self, missing: Set[str]) -> None:
+ format_string = (
+ "Some build dependencies for {requirement} are missing: {missing}."
+ )
+ error_message = format_string.format(
+ requirement=self.req, missing=", ".join(map(repr, sorted(missing)))
+ )
+ raise InstallationError(error_message)
diff --git a/src/pip/_internal/distributions/wheel.py b/src/pip/_internal/distributions/wheel.py
index 340b0f3c5..03aac775b 100644
--- a/src/pip/_internal/distributions/wheel.py
+++ b/src/pip/_internal/distributions/wheel.py
@@ -26,6 +26,9 @@ class WheelDistribution(AbstractDistribution):
return get_wheel_distribution(wheel, canonicalize_name(self.req.name))
def prepare_distribution_metadata(
- self, finder: PackageFinder, build_isolation: bool
+ self,
+ finder: PackageFinder,
+ build_isolation: bool,
+ check_build_deps: bool,
) -> None:
pass