From 3166157e406eeaa3e4a6e4db586b04122b411fe9 Mon Sep 17 00:00:00 2001 From: q0w <43147888+q0w@users.noreply.github.com> Date: Thu, 12 May 2022 21:23:19 +0300 Subject: [PATCH] Opt to check build dependencies --- news/11116.bugfix.rst | 1 + src/pip/_internal/cli/cmdoptions.py | 9 ++++++++ src/pip/_internal/cli/req_command.py | 1 + src/pip/_internal/commands/download.py | 1 + src/pip/_internal/commands/install.py | 1 + src/pip/_internal/commands/wheel.py | 1 + src/pip/_internal/distributions/base.py | 5 ++++- src/pip/_internal/distributions/installed.py | 5 ++++- src/pip/_internal/distributions/sdist.py | 9 ++++++-- src/pip/_internal/distributions/wheel.py | 5 ++++- src/pip/_internal/operations/prepare.py | 11 +++++++++- tests/functional/test_pep517.py | 22 ++++++++++++++++++++ tests/unit/test_req.py | 1 + 13 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 news/11116.bugfix.rst diff --git a/news/11116.bugfix.rst b/news/11116.bugfix.rst new file mode 100644 index 000000000..c0cdbd4ee --- /dev/null +++ b/news/11116.bugfix.rst @@ -0,0 +1 @@ +Change the build environment dependency checking to be opt-in. diff --git a/src/pip/_internal/cli/cmdoptions.py b/src/pip/_internal/cli/cmdoptions.py index c84ecabd3..e96b8e5e3 100644 --- a/src/pip/_internal/cli/cmdoptions.py +++ b/src/pip/_internal/cli/cmdoptions.py @@ -749,6 +749,15 @@ no_build_isolation: Callable[..., Option] = partial( "if this option is used.", ) +check_build_deps: Callable[..., Option] = partial( + Option, + "--check-build-dependencies", + dest="check_build_deps", + action="store_true", + default=False, + help="Check the build dependencies when PEP517 is used.", +) + def _handle_no_use_pep517( option: Option, opt: str, value: str, parser: OptionParser diff --git a/src/pip/_internal/cli/req_command.py b/src/pip/_internal/cli/req_command.py index aab177002..539d21dff 100644 --- a/src/pip/_internal/cli/req_command.py +++ b/src/pip/_internal/cli/req_command.py @@ -293,6 +293,7 @@ class RequirementCommand(IndexGroupCommand): src_dir=options.src_dir, download_dir=download_dir, build_isolation=options.build_isolation, + check_build_deps=options.check_build_deps, build_tracker=build_tracker, session=session, progress_bar=options.progress_bar, diff --git a/src/pip/_internal/commands/download.py b/src/pip/_internal/commands/download.py index a6d7e628f..d70ce4f1f 100644 --- a/src/pip/_internal/commands/download.py +++ b/src/pip/_internal/commands/download.py @@ -49,6 +49,7 @@ class DownloadCommand(RequirementCommand): self.cmd_opts.add_option(cmdoptions.no_build_isolation()) self.cmd_opts.add_option(cmdoptions.use_pep517()) self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) self.cmd_opts.add_option( diff --git a/src/pip/_internal/commands/install.py b/src/pip/_internal/commands/install.py index 55edb280c..3634ea04c 100644 --- a/src/pip/_internal/commands/install.py +++ b/src/pip/_internal/commands/install.py @@ -189,6 +189,7 @@ class InstallCommand(RequirementCommand): self.cmd_opts.add_option(cmdoptions.no_build_isolation()) self.cmd_opts.add_option(cmdoptions.use_pep517()) self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) self.cmd_opts.add_option(cmdoptions.config_settings()) self.cmd_opts.add_option(cmdoptions.install_options()) diff --git a/src/pip/_internal/commands/wheel.py b/src/pip/_internal/commands/wheel.py index 05b91d473..9dd6c82f2 100644 --- a/src/pip/_internal/commands/wheel.py +++ b/src/pip/_internal/commands/wheel.py @@ -57,6 +57,7 @@ class WheelCommand(RequirementCommand): self.cmd_opts.add_option(cmdoptions.no_build_isolation()) self.cmd_opts.add_option(cmdoptions.use_pep517()) self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.check_build_deps()) self.cmd_opts.add_option(cmdoptions.constraints()) self.cmd_opts.add_option(cmdoptions.editable()) self.cmd_opts.add_option(cmdoptions.requirements()) 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 be5962f98..edb38aa1a 100644 --- a/src/pip/_internal/distributions/installed.py +++ b/src/pip/_internal/distributions/installed.py @@ -15,6 +15,9 @@ class InstalledDistribution(AbstractDistribution): 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 463c409d4..4c2564793 100644 --- a/src/pip/_internal/distributions/sdist.py +++ b/src/pip/_internal/distributions/sdist.py @@ -22,7 +22,10 @@ class SourceDistribution(AbstractDistribution): 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() @@ -43,7 +46,9 @@ class SourceDistribution(AbstractDistribution): self.req.isolated_editable_sanity_check() # Install the dynamic build requirements. self._install_build_reqs(finder) - elif self.req.use_pep517: + # 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( 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 diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 7550d3a90..df1016ebb 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -50,11 +50,14 @@ def _get_prepared_distribution( build_tracker: BuildTracker, finder: PackageFinder, build_isolation: bool, + check_build_deps: bool, ) -> BaseDistribution: """Prepare a distribution for installation.""" abstract_dist = make_distribution_for_install_requirement(req) with build_tracker.track(req): - abstract_dist.prepare_distribution_metadata(finder, build_isolation) + abstract_dist.prepare_distribution_metadata( + finder, build_isolation, check_build_deps + ) return abstract_dist.get_metadata_distribution() @@ -199,6 +202,7 @@ class RequirementPreparer: download_dir: Optional[str], src_dir: str, build_isolation: bool, + check_build_deps: bool, build_tracker: BuildTracker, session: PipSession, progress_bar: str, @@ -225,6 +229,9 @@ class RequirementPreparer: # Is build isolation allowed? self.build_isolation = build_isolation + # Should check build dependencies? + self.check_build_deps = check_build_deps + # Should hash-checking be required? self.require_hashes = require_hashes @@ -492,6 +499,7 @@ class RequirementPreparer: self.build_tracker, self.finder, self.build_isolation, + self.check_build_deps, ) return dist @@ -545,6 +553,7 @@ class RequirementPreparer: self.build_tracker, self.finder, self.build_isolation, + self.check_build_deps, ) req.check_if_exists(self.use_user_site) diff --git a/tests/functional/test_pep517.py b/tests/functional/test_pep517.py index cae3040ab..335cd8408 100644 --- a/tests/functional/test_pep517.py +++ b/tests/functional/test_pep517.py @@ -160,6 +160,26 @@ def test_conflicting_pep517_backend_requirements( assert result.returncode != 0 and msg in result.stderr, str(result) +def test_no_check_build_deps( + script: PipTestEnvironment, tmpdir: Path, data: TestData +) -> None: + project_dir = make_project( + tmpdir, requires=["simplewheel==2.0"], backend="test_backend" + ) + script.pip( + "install", + "simplewheel==1.0", + "test_backend", + "--no-index", + "-f", + data.packages, + "-f", + data.backends, + ) + result = script.pip("install", "--no-build-isolation", project_dir) + result.assert_installed("project", editable=False) + + def test_validate_missing_pep517_backend_requirements( script: PipTestEnvironment, tmpdir: Path, data: TestData ) -> None: @@ -174,6 +194,7 @@ def test_validate_missing_pep517_backend_requirements( "-f", data.packages, "--no-build-isolation", + "--check-build-dependencies", project_dir, expect_error=True, ) @@ -199,6 +220,7 @@ def test_validate_conflicting_pep517_backend_requirements( "-f", data.packages, "--no-build-isolation", + "--check-build-dependencies", project_dir, expect_error=True, ) diff --git a/tests/unit/test_req.py b/tests/unit/test_req.py index 74f4a8bab..90155cd9c 100644 --- a/tests/unit/test_req.py +++ b/tests/unit/test_req.py @@ -91,6 +91,7 @@ class TestRequirementSet: src_dir=os.path.join(self.tempdir, "src"), download_dir=None, build_isolation=True, + check_build_deps=False, build_tracker=tracker, session=session, progress_bar="on",