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