2015-05-23 13:02:50 -03:00
|
|
|
"""Tests for distutils._msvccompiler."""
|
|
|
|
import sys
|
|
|
|
import unittest
|
|
|
|
import os
|
|
|
|
|
|
|
|
from distutils.errors import DistutilsPlatformError
|
|
|
|
from distutils.tests import support
|
|
|
|
from test.support import run_unittest
|
|
|
|
|
|
|
|
|
|
|
|
SKIP_MESSAGE = (None if sys.platform == "win32" else
|
|
|
|
"These tests are only for win32")
|
|
|
|
|
|
|
|
@unittest.skipUnless(SKIP_MESSAGE is None, SKIP_MESSAGE)
|
|
|
|
class msvccompilerTestCase(support.TempdirManager,
|
|
|
|
unittest.TestCase):
|
|
|
|
|
|
|
|
def test_no_compiler(self):
|
2015-09-09 03:42:51 -03:00
|
|
|
import distutils._msvccompiler as _msvccompiler
|
2015-05-23 13:02:50 -03:00
|
|
|
# makes sure query_vcvarsall raises
|
|
|
|
# a DistutilsPlatformError if the compiler
|
|
|
|
# is not found
|
2015-09-09 01:39:01 -03:00
|
|
|
def _find_vcvarsall(plat_spec):
|
|
|
|
return None, None
|
2015-05-23 13:02:50 -03:00
|
|
|
|
|
|
|
old_find_vcvarsall = _msvccompiler._find_vcvarsall
|
|
|
|
_msvccompiler._find_vcvarsall = _find_vcvarsall
|
|
|
|
try:
|
2015-09-09 01:39:01 -03:00
|
|
|
self.assertRaises(DistutilsPlatformError,
|
|
|
|
_msvccompiler._get_vc_env,
|
2015-05-23 13:02:50 -03:00
|
|
|
'wont find this version')
|
|
|
|
finally:
|
|
|
|
_msvccompiler._find_vcvarsall = old_find_vcvarsall
|
|
|
|
|
2015-09-09 01:39:01 -03:00
|
|
|
def test_compiler_options(self):
|
2015-09-09 03:42:51 -03:00
|
|
|
import distutils._msvccompiler as _msvccompiler
|
2015-09-09 01:39:01 -03:00
|
|
|
# suppress path to vcruntime from _find_vcvarsall to
|
|
|
|
# check that /MT is added to compile options
|
|
|
|
old_find_vcvarsall = _msvccompiler._find_vcvarsall
|
|
|
|
def _find_vcvarsall(plat_spec):
|
|
|
|
return old_find_vcvarsall(plat_spec)[0], None
|
|
|
|
_msvccompiler._find_vcvarsall = _find_vcvarsall
|
|
|
|
try:
|
|
|
|
compiler = _msvccompiler.MSVCCompiler()
|
|
|
|
compiler.initialize()
|
|
|
|
|
|
|
|
self.assertIn('/MT', compiler.compile_options)
|
|
|
|
self.assertNotIn('/MD', compiler.compile_options)
|
|
|
|
finally:
|
|
|
|
_msvccompiler._find_vcvarsall = old_find_vcvarsall
|
|
|
|
|
|
|
|
def test_vcruntime_copy(self):
|
2015-09-09 03:42:51 -03:00
|
|
|
import distutils._msvccompiler as _msvccompiler
|
2015-09-09 01:39:01 -03:00
|
|
|
# force path to a known file - it doesn't matter
|
|
|
|
# what we copy as long as its name is not in
|
|
|
|
# _msvccompiler._BUNDLED_DLLS
|
|
|
|
old_find_vcvarsall = _msvccompiler._find_vcvarsall
|
|
|
|
def _find_vcvarsall(plat_spec):
|
|
|
|
return old_find_vcvarsall(plat_spec)[0], __file__
|
|
|
|
_msvccompiler._find_vcvarsall = _find_vcvarsall
|
|
|
|
try:
|
|
|
|
tempdir = self.mkdtemp()
|
|
|
|
compiler = _msvccompiler.MSVCCompiler()
|
|
|
|
compiler.initialize()
|
|
|
|
compiler._copy_vcruntime(tempdir)
|
|
|
|
|
|
|
|
self.assertTrue(os.path.isfile(os.path.join(
|
|
|
|
tempdir, os.path.basename(__file__))))
|
|
|
|
finally:
|
|
|
|
_msvccompiler._find_vcvarsall = old_find_vcvarsall
|
|
|
|
|
|
|
|
def test_vcruntime_skip_copy(self):
|
2015-09-09 03:42:51 -03:00
|
|
|
import distutils._msvccompiler as _msvccompiler
|
|
|
|
|
2015-09-09 01:39:01 -03:00
|
|
|
tempdir = self.mkdtemp()
|
|
|
|
compiler = _msvccompiler.MSVCCompiler()
|
|
|
|
compiler.initialize()
|
|
|
|
dll = compiler._vcruntime_redist
|
2017-09-07 15:49:23 -03:00
|
|
|
self.assertTrue(os.path.isfile(dll), dll or "<None>")
|
2015-09-09 10:54:57 -03:00
|
|
|
|
2015-09-09 01:39:01 -03:00
|
|
|
compiler._copy_vcruntime(tempdir)
|
|
|
|
|
|
|
|
self.assertFalse(os.path.isfile(os.path.join(
|
2017-09-07 15:49:23 -03:00
|
|
|
tempdir, os.path.basename(dll))), dll or "<None>")
|
2015-09-09 01:39:01 -03:00
|
|
|
|
2016-06-17 13:32:38 -03:00
|
|
|
def test_get_vc_env_unicode(self):
|
|
|
|
import distutils._msvccompiler as _msvccompiler
|
|
|
|
|
|
|
|
test_var = 'ṰḖṤṪ┅ṼẨṜ'
|
|
|
|
test_value = '₃⁴₅'
|
|
|
|
|
|
|
|
# Ensure we don't early exit from _get_vc_env
|
|
|
|
old_distutils_use_sdk = os.environ.pop('DISTUTILS_USE_SDK', None)
|
|
|
|
os.environ[test_var] = test_value
|
|
|
|
try:
|
|
|
|
env = _msvccompiler._get_vc_env('x86')
|
|
|
|
self.assertIn(test_var.lower(), env)
|
|
|
|
self.assertEqual(test_value, env[test_var.lower()])
|
|
|
|
finally:
|
|
|
|
os.environ.pop(test_var)
|
|
|
|
if old_distutils_use_sdk:
|
|
|
|
os.environ['DISTUTILS_USE_SDK'] = old_distutils_use_sdk
|
|
|
|
|
2017-09-07 15:49:23 -03:00
|
|
|
def test_get_vc2017(self):
|
|
|
|
import distutils._msvccompiler as _msvccompiler
|
|
|
|
|
|
|
|
# This function cannot be mocked, so pass it if we find VS 2017
|
|
|
|
# and mark it skipped if we do not.
|
|
|
|
version, path = _msvccompiler._find_vc2017()
|
|
|
|
if version:
|
|
|
|
self.assertGreaterEqual(version, 15)
|
|
|
|
self.assertTrue(os.path.isdir(path))
|
|
|
|
else:
|
|
|
|
raise unittest.SkipTest("VS 2017 is not installed")
|
|
|
|
|
|
|
|
def test_get_vc2015(self):
|
|
|
|
import distutils._msvccompiler as _msvccompiler
|
|
|
|
|
|
|
|
# This function cannot be mocked, so pass it if we find VS 2015
|
|
|
|
# and mark it skipped if we do not.
|
|
|
|
version, path = _msvccompiler._find_vc2015()
|
|
|
|
if version:
|
|
|
|
self.assertGreaterEqual(version, 14)
|
|
|
|
self.assertTrue(os.path.isdir(path))
|
|
|
|
else:
|
|
|
|
raise unittest.SkipTest("VS 2015 is not installed")
|
|
|
|
|
2015-05-23 13:02:50 -03:00
|
|
|
def test_suite():
|
|
|
|
return unittest.makeSuite(msvccompilerTestCase)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
run_unittest(test_suite())
|