Home | History | Annotate | Download | only in tests
      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