Skip to content

Commit

Permalink
Merge pull request #2306 from takluyver/pep517-setup-requires
Browse files Browse the repository at this point in the history
Don't install setup_requires when run as a PEP-517 backend.
  • Loading branch information
jaraco authored Aug 13, 2020
2 parents a42d300 + d2883ac commit 6f7c262
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 3 deletions.
3 changes: 3 additions & 0 deletions changelog.d/2306.change.rst
Original file line number Diff line number Diff line change
@@ -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.
22 changes: 20 additions & 2 deletions setuptools/build_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,22 @@ def patch(cls):
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
Expand Down Expand Up @@ -154,7 +170,8 @@ def prepare_metadata_for_build_wheel(self, metadata_directory,
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:
Expand Down Expand Up @@ -194,7 +211,8 @@ def _build_with_temp_dir(self, setup_command, result_extension,
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)
Expand Down
31 changes: 30 additions & 1 deletion setuptools/tests/test_build_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ def test_setup_requires(self, setup_literal, requirements, use_wheel,
setup(
name="qux",
version="0.0.0",
py_modules=["hello.py"],
py_modules=["hello"],
setup_requires={setup_literal},
)
""").format(setup_literal=setup_literal),
Expand All @@ -407,6 +407,35 @@ def run():

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
Expand Down

0 comments on commit 6f7c262

Please sign in to comment.