summaryrefslogtreecommitdiff
path: root/setuptools
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2020-08-13 18:59:17 -0400
committerGitHub <noreply@github.com>2020-08-13 18:59:17 -0400
commit6f7c26250a2d9e64a823f10224522dd40d2f163f (patch)
treecd7335152a5bc17d9cad0524dce5d836257583fe /setuptools
parenta42d30089c42605d0f3191e4ccc19e1cfd1e0ccd (diff)
parentd2883ac4f1d94c16a1ab279e7b1065558b67da4b (diff)
downloadpython-setuptools-git-6f7c26250a2d9e64a823f10224522dd40d2f163f.tar.gz
Merge pull request #2306 from takluyver/pep517-setup-requires
Don't install setup_requires when run as a PEP-517 backend.
Diffstat (limited to 'setuptools')
-rw-r--r--setuptools/build_meta.py22
-rw-r--r--setuptools/tests/test_build_meta.py31
2 files changed, 50 insertions, 3 deletions
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