1"""Tests for distutils.unixccompiler."""
2import sys
3import unittest
4from test.support import EnvironmentVarGuard, run_unittest
5
6from distutils import sysconfig
7from distutils.unixccompiler import UnixCCompiler
8
9class 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
137def test_suite():
138    return unittest.makeSuite(UnixCCompilerTestCase)
139
140if __name__ == "__main__":
141    run_unittest(test_suite())
142