summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changelog.d/2306.change.rst3
-rw-r--r--setuptools/build_meta.py22
-rw-r--r--setuptools/tests/test_build_meta.py31
3 files changed, 53 insertions, 3 deletions
diff --git a/changelog.d/2306.change.rst b/changelog.d/2306.change.rst
new file mode 100644
index 00000000..1046eae3
--- /dev/null
+++ b/changelog.d/2306.change.rst
@@ -0,0 +1,3 @@
+When running as a PEP 517 backend, setuptools does not try to install
+``setup_requires`` itself. They are reported as build requirements for the
+frontend to install.
diff --git a/setuptools/build_meta.py b/setuptools/build_meta.py
index 46266814..37132187 100644
--- a/setuptools/build_meta.py
+++ b/setuptools/build_meta.py
@@ -75,6 +75,22 @@ class Distribution(setuptools.dist.Distribution):
distutils.core.Distribution = orig
+@contextlib.contextmanager
+def no_install_setup_requires():
+ """Temporarily disable installing setup_requires
+
+ Under PEP 517, the backend reports build dependencies to the frontend,
+ and the frontend is responsible for ensuring they're installed.
+ So setuptools (acting as a backend) should not try to install them.
+ """
+ orig = setuptools._install_setup_requires
+ setuptools._install_setup_requires = lambda attrs: None
+ try:
+ yield
+ finally:
+ setuptools._install_setup_requires = orig
+
+
def _to_str(s):
"""
Convert a filename to a string (on Python 2, explicitly
@@ -154,7 +170,8 @@ class _BuildMetaBackend(object):
config_settings=None):
sys.argv = sys.argv[:1] + ['dist_info', '--egg-base',
_to_str(metadata_directory)]
- self.run_setup()
+ with no_install_setup_requires():
+ self.run_setup()
dist_info_directory = metadata_directory
while True:
@@ -194,7 +211,8 @@ class _BuildMetaBackend(object):
sys.argv = (sys.argv[:1] + setup_command +
['--dist-dir', tmp_dist_dir] +
config_settings["--global-option"])
- self.run_setup()
+ with no_install_setup_requires():
+ self.run_setup()
result_basename = _file_with_extension(
tmp_dist_dir, result_extension)
diff --git a/setuptools/tests/test_build_meta.py b/setuptools/tests/test_build_meta.py
index 8fcf3055..fdb4b950 100644
--- a/setuptools/tests/test_build_meta.py
+++ b/setuptools/tests/test_build_meta.py
@@ -380,7 +380,7 @@ class TestBuildMetaBackend:
setup(
name="qux",
version="0.0.0",
- py_modules=["hello.py"],
+ py_modules=["hello"],
setup_requires={setup_literal},
)
""").format(setup_literal=setup_literal),
@@ -407,6 +407,35 @@ class TestBuildMetaBackend:
assert expected == sorted(actual)
+ def test_dont_install_setup_requires(self, tmpdir_cwd):
+ files = {
+ 'setup.py': DALS("""
+ from setuptools import setup
+
+ setup(
+ name="qux",
+ version="0.0.0",
+ py_modules=["hello"],
+ setup_requires=["does-not-exist >99"],
+ )
+ """),
+ 'hello.py': DALS("""
+ def run():
+ print('hello')
+ """),
+ }
+
+ build_files(files)
+
+ build_backend = self.get_build_backend()
+
+ dist_dir = os.path.abspath('pip-dist-info')
+ os.makedirs(dist_dir)
+
+ # does-not-exist can't be satisfied, so if it attempts to install
+ # setup_requires, it will fail.
+ build_backend.prepare_metadata_for_build_wheel(dist_dir)
+
_sys_argv_0_passthrough = {
'setup.py': DALS("""
import os