aboutsummaryrefslogtreecommitdiffstats
path: root/setuptools
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2020-08-08 19:49:02 -0400
committerJason R. Coombs <jaraco@jaraco.com>2020-08-08 19:49:02 -0400
commit148cace6a965fb8f6d9839663c025ceb321ca532 (patch)
treeb105f5ccb6d4ad43e4c248a871c34498178d2d03 /setuptools
parent6b70fb201d6a81448de6ca6f71d7091b9a26096c (diff)
parent59e116c84d76adc9548d1e9a71e7d8f5c22a8b85 (diff)
downloadexternal_python_setuptools-148cace6a965fb8f6d9839663c025ceb321ca532.tar.gz
external_python_setuptools-148cace6a965fb8f6d9839663c025ceb321ca532.tar.bz2
external_python_setuptools-148cace6a965fb8f6d9839663c025ceb321ca532.zip
Merge branch 'master' into distutils-import-hack
Diffstat (limited to 'setuptools')
-rw-r--r--setuptools/_distutils/_msvccompiler.py6
-rw-r--r--setuptools/_distutils/ccompiler.py4
-rw-r--r--setuptools/_distutils/tests/test_msvccompiler.py37
-rw-r--r--setuptools/monkey.py2
-rw-r--r--setuptools/tests/requirements.txt1
-rw-r--r--setuptools/tests/test_distutils_adoption.py63
6 files changed, 108 insertions, 5 deletions
diff --git a/setuptools/_distutils/_msvccompiler.py b/setuptools/_distutils/_msvccompiler.py
index 0e98692e..2d56ee0a 100644
--- a/setuptools/_distutils/_msvccompiler.py
+++ b/setuptools/_distutils/_msvccompiler.py
@@ -15,7 +15,9 @@ for older versions in distutils.msvc9compiler and distutils.msvccompiler.
import os
import subprocess
-import winreg
+import contextlib
+with contextlib.suppress(ImportError):
+ import winreg
from distutils.errors import DistutilsExecError, DistutilsPlatformError, \
CompileError, LibError, LinkError
@@ -501,7 +503,7 @@ class MSVCCompiler(CCompiler) :
log.debug("skipping %s (up-to-date)", output_filename)
def spawn(self, cmd):
- env = dict(os.environ, path=self._paths)
+ env = dict(os.environ, PATH=self._paths)
return super().spawn(cmd, env=env)
# -- Miscellaneous methods -----------------------------------------
diff --git a/setuptools/_distutils/ccompiler.py b/setuptools/_distutils/ccompiler.py
index b5ef143e..57bb94e8 100644
--- a/setuptools/_distutils/ccompiler.py
+++ b/setuptools/_distutils/ccompiler.py
@@ -906,8 +906,8 @@ int main (int argc, char **argv) {
def execute(self, func, args, msg=None, level=1):
execute(func, args, msg, self.dry_run)
- def spawn(self, cmd):
- spawn(cmd, dry_run=self.dry_run)
+ def spawn(self, cmd, **kwargs):
+ spawn(cmd, dry_run=self.dry_run, **kwargs)
def move_file(self, src, dst):
return move_file(src, dst, dry_run=self.dry_run)
diff --git a/setuptools/_distutils/tests/test_msvccompiler.py b/setuptools/_distutils/tests/test_msvccompiler.py
index b518d6a7..88d912b1 100644
--- a/setuptools/_distutils/tests/test_msvccompiler.py
+++ b/setuptools/_distutils/tests/test_msvccompiler.py
@@ -2,6 +2,7 @@
import sys
import unittest
import os
+import threading
from distutils.errors import DistutilsPlatformError
from distutils.tests import support
@@ -74,6 +75,42 @@ class msvccompilerTestCase(support.TempdirManager,
else:
raise unittest.SkipTest("VS 2015 is not installed")
+
+class CheckThread(threading.Thread):
+ exc_info = None
+
+ def run(self):
+ try:
+ super().run()
+ except Exception:
+ self.exc_info = sys.exc_info()
+
+ def __bool__(self):
+ return not self.exc_info
+
+
+class TestSpawn(unittest.TestCase):
+ def test_concurrent_safe(self):
+ """
+ Concurrent calls to spawn should have consistent results.
+ """
+ import distutils._msvccompiler as _msvccompiler
+ compiler = _msvccompiler.MSVCCompiler()
+ compiler._paths = "expected"
+ inner_cmd = 'import os; assert os.environ["PATH"] == "expected"'
+ command = ['python', '-c', inner_cmd]
+
+ threads = [
+ CheckThread(target=compiler.spawn, args=[command])
+ for n in range(100)
+ ]
+ for thread in threads:
+ thread.start()
+ for thread in threads:
+ thread.join()
+ assert all(threads)
+
+
def test_suite():
return unittest.makeSuite(msvccompilerTestCase)
diff --git a/setuptools/monkey.py b/setuptools/monkey.py
index 3c77f8cf..e5f1377b 100644
--- a/setuptools/monkey.py
+++ b/setuptools/monkey.py
@@ -138,7 +138,7 @@ def patch_for_msvc_specialized_compiler():
msvc = import_module('setuptools.msvc')
if platform.system() != 'Windows':
- # Compilers only availables on Microsoft Windows
+ # Compilers only available on Microsoft Windows
return
def patch_params(mod_name, func_name):
diff --git a/setuptools/tests/requirements.txt b/setuptools/tests/requirements.txt
index 19bf5aef..d0d07f70 100644
--- a/setuptools/tests/requirements.txt
+++ b/setuptools/tests/requirements.txt
@@ -10,3 +10,4 @@ pytest-cov>=2.5.1
paver; python_version>="3.6"
futures; python_version=="2.7"
pip>=19.1 # For proper file:// URLs support.
+jaraco.envs
diff --git a/setuptools/tests/test_distutils_adoption.py b/setuptools/tests/test_distutils_adoption.py
new file mode 100644
index 00000000..7f28a217
--- /dev/null
+++ b/setuptools/tests/test_distutils_adoption.py
@@ -0,0 +1,63 @@
+import os
+import sys
+import functools
+import subprocess
+import platform
+
+import pytest
+import jaraco.envs
+import path
+
+
+class VirtualEnv(jaraco.envs.VirtualEnv):
+ name = '.env'
+
+ def run(self, cmd, *args, **kwargs):
+ cmd = [self.exe(cmd[0])] + cmd[1:]
+ return subprocess.check_output(cmd, *args, cwd=self.root, **kwargs)
+
+
+@pytest.fixture
+def venv(tmpdir):
+ env = VirtualEnv()
+ env.root = path.Path(tmpdir)
+ env.req = os.getcwd()
+ return env.create()
+
+
+def popen_text(call):
+ """
+ Augment the Popen call with the parameters to ensure unicode text.
+ """
+ return functools.partial(call, universal_newlines=True) \
+ if sys.version_info < (3, 7) else functools.partial(call, text=True)
+
+
+def find_distutils(venv, imports='distutils', env=None, **kwargs):
+ py_cmd = 'import {imports}; print(distutils.__file__)'.format(**locals())
+ cmd = ['python', '-c', py_cmd]
+ if platform.system() == 'Windows':
+ env['SYSTEMROOT'] = os.environ['SYSTEMROOT']
+ return popen_text(venv.run)(cmd, env=env, **kwargs)
+
+
+def test_distutils_stdlib(venv):
+ """
+ Ensure stdlib distutils is used when appropriate.
+ """
+ assert venv.name not in find_distutils(venv, env=dict()).split(os.sep)
+
+
+def test_distutils_local_with_setuptools(venv):
+ """
+ Ensure local distutils is used when appropriate.
+ """
+ env = dict(SETUPTOOLS_USE_DISTUTILS='local')
+ loc = find_distutils(venv, imports='setuptools, distutils', env=env)
+ assert venv.name in loc.split(os.sep)
+
+
+@pytest.mark.xfail(reason="#2259")
+def test_distutils_local(venv):
+ env = dict(SETUPTOOLS_USE_DISTUTILS='local')
+ assert venv.name in find_distutils(venv, env=env).split(os.sep)