test_msvccompiler.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. """Tests for distutils._msvccompiler."""
  2. import sys
  3. import unittest
  4. import os
  5. from distutils.errors import DistutilsPlatformError
  6. from distutils.tests import support
  7. from test.support import run_unittest
  8. SKIP_MESSAGE = (None if sys.platform == "win32" else
  9. "These tests are only for win32")
  10. @unittest.skipUnless(SKIP_MESSAGE is None, SKIP_MESSAGE)
  11. class msvccompilerTestCase(support.TempdirManager,
  12. unittest.TestCase):
  13. def test_no_compiler(self):
  14. import distutils._msvccompiler as _msvccompiler
  15. # makes sure query_vcvarsall raises
  16. # a DistutilsPlatformError if the compiler
  17. # is not found
  18. def _find_vcvarsall(plat_spec):
  19. return None, None
  20. old_find_vcvarsall = _msvccompiler._find_vcvarsall
  21. _msvccompiler._find_vcvarsall = _find_vcvarsall
  22. try:
  23. self.assertRaises(DistutilsPlatformError,
  24. _msvccompiler._get_vc_env,
  25. 'wont find this version')
  26. finally:
  27. _msvccompiler._find_vcvarsall = old_find_vcvarsall
  28. def test_compiler_options(self):
  29. import distutils._msvccompiler as _msvccompiler
  30. # suppress path to vcruntime from _find_vcvarsall to
  31. # check that /MT is added to compile options
  32. old_find_vcvarsall = _msvccompiler._find_vcvarsall
  33. def _find_vcvarsall(plat_spec):
  34. return old_find_vcvarsall(plat_spec)[0], None
  35. _msvccompiler._find_vcvarsall = _find_vcvarsall
  36. try:
  37. compiler = _msvccompiler.MSVCCompiler()
  38. compiler.initialize()
  39. self.assertIn('/MT', compiler.compile_options)
  40. self.assertNotIn('/MD', compiler.compile_options)
  41. finally:
  42. _msvccompiler._find_vcvarsall = old_find_vcvarsall
  43. def test_vcruntime_copy(self):
  44. import distutils._msvccompiler as _msvccompiler
  45. # force path to a known file - it doesn't matter
  46. # what we copy as long as its name is not in
  47. # _msvccompiler._BUNDLED_DLLS
  48. old_find_vcvarsall = _msvccompiler._find_vcvarsall
  49. def _find_vcvarsall(plat_spec):
  50. return old_find_vcvarsall(plat_spec)[0], __file__
  51. _msvccompiler._find_vcvarsall = _find_vcvarsall
  52. try:
  53. tempdir = self.mkdtemp()
  54. compiler = _msvccompiler.MSVCCompiler()
  55. compiler.initialize()
  56. compiler._copy_vcruntime(tempdir)
  57. self.assertTrue(os.path.isfile(os.path.join(
  58. tempdir, os.path.basename(__file__))))
  59. finally:
  60. _msvccompiler._find_vcvarsall = old_find_vcvarsall
  61. def test_vcruntime_skip_copy(self):
  62. import distutils._msvccompiler as _msvccompiler
  63. tempdir = self.mkdtemp()
  64. compiler = _msvccompiler.MSVCCompiler()
  65. compiler.initialize()
  66. dll = compiler._vcruntime_redist
  67. self.assertTrue(os.path.isfile(dll))
  68. compiler._copy_vcruntime(tempdir)
  69. self.assertFalse(os.path.isfile(os.path.join(
  70. tempdir, os.path.basename(dll))))
  71. def test_suite():
  72. return unittest.makeSuite(msvccompilerTestCase)
  73. if __name__ == "__main__":
  74. run_unittest(test_suite())