Imported Upstream version 49.5.0 upstream/49.5.0
authorDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 29 Dec 2020 22:08:08 +0000 (07:08 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 29 Dec 2020 22:08:08 +0000 (07:08 +0900)
.bumpversion.cfg
CHANGES.rst
setup.cfg
setuptools/build_meta.py
setuptools/tests/test_build_meta.py

index 547dc886cd03f3e69fd000aee6d4a14376bd4463..7ecebcd92eccb3a17fc0466e359e701449cb5dfa 100644 (file)
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 49.4.0
+current_version = 49.5.0
 commit = True
 tag = True
 
index ac07145956179c64c2bbfe23cf021229ae4300d3..534e15a8f2fd890b35ef6c82d4e2a64d91ab3e0f 100644 (file)
@@ -1,3 +1,11 @@
+v49.5.0
+-------
+
+* #2306: 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.
+
+
 v49.4.0
 -------
 
index 76d99d44d7f058c45dc8fcb82ffe5574d5e4adc4..7618ab116d6c2081b93ded1f214a954ac9d756d0 100644 (file)
--- a/setup.cfg
+++ b/setup.cfg
@@ -16,7 +16,7 @@ formats = zip
 
 [metadata]
 name = setuptools
-version = 49.4.0
+version = 49.5.0
 description = Easily download, build, install, upgrade, and uninstall Python packages
 author = Python Packaging Authority
 author_email = distutils-sig@python.org
index 46266814ad9cb70246426cb443bb3b0b554665c5..371321879aa34895deab8581ba71ef4f1b968100 100644 (file)
@@ -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)
index 8fcf3055ff0807098b5f3000c68590f7b6d64e15..fdb4b95010d9d36d504ceac91e69d549bd502ef5 100644 (file)
@@ -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