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