test_unixccompiler.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. """Tests for distutils.unixccompiler."""
  2. import sys
  3. import unittest
  4. from test.support import run_unittest
  5. from test.support.os_helper import EnvironmentVarGuard
  6. from distutils import sysconfig
  7. from distutils.unixccompiler import UnixCCompiler
  8. class UnixCCompilerTestCase(unittest.TestCase):
  9. def setUp(self):
  10. self._backup_platform = sys.platform
  11. self._backup_get_config_var = sysconfig.get_config_var
  12. self._backup_config_vars = dict(sysconfig._config_vars)
  13. class CompilerWrapper(UnixCCompiler):
  14. def rpath_foo(self):
  15. return self.runtime_library_dir_option('/foo')
  16. self.cc = CompilerWrapper()
  17. def tearDown(self):
  18. sys.platform = self._backup_platform
  19. sysconfig.get_config_var = self._backup_get_config_var
  20. sysconfig._config_vars.clear()
  21. sysconfig._config_vars.update(self._backup_config_vars)
  22. @unittest.skipIf(sys.platform == 'win32', "can't test on Windows")
  23. def test_runtime_libdir_option(self):
  24. # Issue#5900
  25. #
  26. # Ensure RUNPATH is added to extension modules with RPATH if
  27. # GNU ld is used
  28. # darwin
  29. sys.platform = 'darwin'
  30. self.assertEqual(self.cc.rpath_foo(), '-L/foo')
  31. # hp-ux
  32. sys.platform = 'hp-ux'
  33. old_gcv = sysconfig.get_config_var
  34. def gcv(v):
  35. return 'xxx'
  36. sysconfig.get_config_var = gcv
  37. self.assertEqual(self.cc.rpath_foo(), ['+s', '-L/foo'])
  38. def gcv(v):
  39. return 'gcc'
  40. sysconfig.get_config_var = gcv
  41. self.assertEqual(self.cc.rpath_foo(), ['-Wl,+s', '-L/foo'])
  42. def gcv(v):
  43. return 'g++'
  44. sysconfig.get_config_var = gcv
  45. self.assertEqual(self.cc.rpath_foo(), ['-Wl,+s', '-L/foo'])
  46. sysconfig.get_config_var = old_gcv
  47. # GCC GNULD
  48. sys.platform = 'bar'
  49. def gcv(v):
  50. if v == 'CC':
  51. return 'gcc'
  52. elif v == 'GNULD':
  53. return 'yes'
  54. sysconfig.get_config_var = gcv
  55. self.assertEqual(self.cc.rpath_foo(), '-Wl,--enable-new-dtags,-R/foo')
  56. # GCC non-GNULD
  57. sys.platform = 'bar'
  58. def gcv(v):
  59. if v == 'CC':
  60. return 'gcc'
  61. elif v == 'GNULD':
  62. return 'no'
  63. sysconfig.get_config_var = gcv
  64. self.assertEqual(self.cc.rpath_foo(), '-Wl,-R/foo')
  65. # GCC GNULD with fully qualified configuration prefix
  66. # see #7617
  67. sys.platform = 'bar'
  68. def gcv(v):
  69. if v == 'CC':
  70. return 'x86_64-pc-linux-gnu-gcc-4.4.2'
  71. elif v == 'GNULD':
  72. return 'yes'
  73. sysconfig.get_config_var = gcv
  74. self.assertEqual(self.cc.rpath_foo(), '-Wl,--enable-new-dtags,-R/foo')
  75. # non-GCC GNULD
  76. sys.platform = 'bar'
  77. def gcv(v):
  78. if v == 'CC':
  79. return 'cc'
  80. elif v == 'GNULD':
  81. return 'yes'
  82. sysconfig.get_config_var = gcv
  83. self.assertEqual(self.cc.rpath_foo(), '-R/foo')
  84. # non-GCC non-GNULD
  85. sys.platform = 'bar'
  86. def gcv(v):
  87. if v == 'CC':
  88. return 'cc'
  89. elif v == 'GNULD':
  90. return 'no'
  91. sysconfig.get_config_var = gcv
  92. self.assertEqual(self.cc.rpath_foo(), '-R/foo')
  93. @unittest.skipUnless(sys.platform == 'darwin', 'test only relevant for OS X')
  94. def test_osx_cc_overrides_ldshared(self):
  95. # Issue #18080:
  96. # ensure that setting CC env variable also changes default linker
  97. def gcv(v):
  98. if v == 'LDSHARED':
  99. return 'gcc-4.2 -bundle -undefined dynamic_lookup '
  100. return 'gcc-4.2'
  101. sysconfig.get_config_var = gcv
  102. with EnvironmentVarGuard() as env:
  103. env['CC'] = 'my_cc'
  104. del env['LDSHARED']
  105. sysconfig.customize_compiler(self.cc)
  106. self.assertEqual(self.cc.linker_so[0], 'my_cc')
  107. @unittest.skipUnless(sys.platform == 'darwin', 'test only relevant for OS X')
  108. def test_osx_explicit_ldshared(self):
  109. # Issue #18080:
  110. # ensure that setting CC env variable does not change
  111. # explicit LDSHARED setting for linker
  112. def gcv(v):
  113. if v == 'LDSHARED':
  114. return 'gcc-4.2 -bundle -undefined dynamic_lookup '
  115. return 'gcc-4.2'
  116. sysconfig.get_config_var = gcv
  117. with EnvironmentVarGuard() as env:
  118. env['CC'] = 'my_cc'
  119. env['LDSHARED'] = 'my_ld -bundle -dynamic'
  120. sysconfig.customize_compiler(self.cc)
  121. self.assertEqual(self.cc.linker_so[0], 'my_ld')
  122. def test_suite():
  123. return unittest.TestLoader().loadTestsFromTestCase(UnixCCompilerTestCase)
  124. if __name__ == "__main__":
  125. run_unittest(test_suite())