| 
									
										
										
										
											2009-05-09 11:55:12 +00:00
										 |  |  | """Tests for distutils.unixccompiler.""" | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2013-05-28 16:35:30 -07:00
										 |  |  | from test.support import EnvironmentVarGuard, run_unittest | 
					
						
							| 
									
										
										
										
											2009-05-09 11:55:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-22 12:50:05 +00:00
										 |  |  | from distutils import sysconfig | 
					
						
							| 
									
										
										
										
											2009-05-09 11:55:12 +00:00
										 |  |  | from distutils.unixccompiler import UnixCCompiler | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class UnixCCompilerTestCase(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self._backup_platform = sys.platform | 
					
						
							|  |  |  |         self._backup_get_config_var = sysconfig.get_config_var | 
					
						
							|  |  |  |         class CompilerWrapper(UnixCCompiler): | 
					
						
							|  |  |  |             def rpath_foo(self): | 
					
						
							|  |  |  |                 return self.runtime_library_dir_option('/foo') | 
					
						
							|  |  |  |         self.cc = CompilerWrapper() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         sys.platform = self._backup_platform | 
					
						
							|  |  |  |         sysconfig.get_config_var = self._backup_get_config_var | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-18 16:41:01 +02:00
										 |  |  |     @unittest.skipIf(sys.platform == 'win32', "can't test on Windows") | 
					
						
							| 
									
										
										
										
											2009-05-09 11:55:12 +00:00
										 |  |  |     def test_runtime_libdir_option(self): | 
					
						
							|  |  |  |         # Issue#5900 | 
					
						
							|  |  |  |         # | 
					
						
							|  |  |  |         # Ensure RUNPATH is added to extension modules with RPATH if | 
					
						
							|  |  |  |         # GNU ld is used | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # darwin | 
					
						
							|  |  |  |         sys.platform = 'darwin' | 
					
						
							|  |  |  |         self.assertEqual(self.cc.rpath_foo(), '-L/foo') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # hp-ux | 
					
						
							|  |  |  |         sys.platform = 'hp-ux' | 
					
						
							| 
									
										
										
										
											2009-09-09 08:48:07 +00:00
										 |  |  |         old_gcv = sysconfig.get_config_var | 
					
						
							|  |  |  |         def gcv(v): | 
					
						
							|  |  |  |             return 'xxx' | 
					
						
							|  |  |  |         sysconfig.get_config_var = gcv | 
					
						
							|  |  |  |         self.assertEqual(self.cc.rpath_foo(), ['+s', '-L/foo']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gcv(v): | 
					
						
							|  |  |  |             return 'gcc' | 
					
						
							|  |  |  |         sysconfig.get_config_var = gcv | 
					
						
							|  |  |  |         self.assertEqual(self.cc.rpath_foo(), ['-Wl,+s', '-L/foo']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def gcv(v): | 
					
						
							|  |  |  |             return 'g++' | 
					
						
							|  |  |  |         sysconfig.get_config_var = gcv | 
					
						
							|  |  |  |         self.assertEqual(self.cc.rpath_foo(), ['-Wl,+s', '-L/foo']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         sysconfig.get_config_var = old_gcv | 
					
						
							| 
									
										
										
										
											2009-05-09 11:55:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # GCC GNULD | 
					
						
							|  |  |  |         sys.platform = 'bar' | 
					
						
							|  |  |  |         def gcv(v): | 
					
						
							|  |  |  |             if v == 'CC': | 
					
						
							|  |  |  |                 return 'gcc' | 
					
						
							|  |  |  |             elif v == 'GNULD': | 
					
						
							|  |  |  |                 return 'yes' | 
					
						
							|  |  |  |         sysconfig.get_config_var = gcv | 
					
						
							|  |  |  |         self.assertEqual(self.cc.rpath_foo(), '-Wl,--enable-new-dtags,-R/foo') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # GCC non-GNULD | 
					
						
							|  |  |  |         sys.platform = 'bar' | 
					
						
							|  |  |  |         def gcv(v): | 
					
						
							|  |  |  |             if v == 'CC': | 
					
						
							|  |  |  |                 return 'gcc' | 
					
						
							|  |  |  |             elif v == 'GNULD': | 
					
						
							|  |  |  |                 return 'no' | 
					
						
							|  |  |  |         sysconfig.get_config_var = gcv | 
					
						
							|  |  |  |         self.assertEqual(self.cc.rpath_foo(), '-Wl,-R/foo') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-08 23:57:53 +00:00
										 |  |  |         # GCC GNULD with fully qualified configuration prefix | 
					
						
							|  |  |  |         # see #7617 | 
					
						
							|  |  |  |         sys.platform = 'bar' | 
					
						
							|  |  |  |         def gcv(v): | 
					
						
							|  |  |  |             if v == 'CC': | 
					
						
							|  |  |  |                 return 'x86_64-pc-linux-gnu-gcc-4.4.2' | 
					
						
							|  |  |  |             elif v == 'GNULD': | 
					
						
							|  |  |  |                 return 'yes' | 
					
						
							|  |  |  |         sysconfig.get_config_var = gcv | 
					
						
							|  |  |  |         self.assertEqual(self.cc.rpath_foo(), '-Wl,--enable-new-dtags,-R/foo') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-09 11:55:12 +00:00
										 |  |  |         # non-GCC GNULD | 
					
						
							|  |  |  |         sys.platform = 'bar' | 
					
						
							|  |  |  |         def gcv(v): | 
					
						
							|  |  |  |             if v == 'CC': | 
					
						
							|  |  |  |                 return 'cc' | 
					
						
							|  |  |  |             elif v == 'GNULD': | 
					
						
							|  |  |  |                 return 'yes' | 
					
						
							|  |  |  |         sysconfig.get_config_var = gcv | 
					
						
							|  |  |  |         self.assertEqual(self.cc.rpath_foo(), '-R/foo') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # non-GCC non-GNULD | 
					
						
							|  |  |  |         sys.platform = 'bar' | 
					
						
							|  |  |  |         def gcv(v): | 
					
						
							|  |  |  |             if v == 'CC': | 
					
						
							|  |  |  |                 return 'cc' | 
					
						
							|  |  |  |             elif v == 'GNULD': | 
					
						
							|  |  |  |                 return 'no' | 
					
						
							|  |  |  |         sysconfig.get_config_var = gcv | 
					
						
							|  |  |  |         self.assertEqual(self.cc.rpath_foo(), '-R/foo') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-28 16:35:30 -07:00
										 |  |  |     @unittest.skipUnless(sys.platform == 'darwin', 'test only relevant for OS X') | 
					
						
							|  |  |  |     def test_osx_cc_overrides_ldshared(self): | 
					
						
							|  |  |  |         # Issue #18080: | 
					
						
							|  |  |  |         # ensure that setting CC env variable also changes default linker | 
					
						
							|  |  |  |         def gcv(v): | 
					
						
							|  |  |  |             if v == 'LDSHARED': | 
					
						
							|  |  |  |                 return 'gcc-4.2 -bundle -undefined dynamic_lookup ' | 
					
						
							|  |  |  |             return 'gcc-4.2' | 
					
						
							|  |  |  |         sysconfig.get_config_var = gcv | 
					
						
							|  |  |  |         with EnvironmentVarGuard() as env: | 
					
						
							|  |  |  |             env['CC'] = 'my_cc' | 
					
						
							|  |  |  |             del env['LDSHARED'] | 
					
						
							|  |  |  |             sysconfig.customize_compiler(self.cc) | 
					
						
							|  |  |  |         self.assertEqual(self.cc.linker_so[0], 'my_cc') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @unittest.skipUnless(sys.platform == 'darwin', 'test only relevant for OS X') | 
					
						
							| 
									
										
										
										
											2016-05-26 05:35:26 +00:00
										 |  |  |     def test_osx_explicit_ldshared(self): | 
					
						
							| 
									
										
										
										
											2013-05-28 16:35:30 -07:00
										 |  |  |         # Issue #18080: | 
					
						
							|  |  |  |         # ensure that setting CC env variable does not change | 
					
						
							|  |  |  |         #   explicit LDSHARED setting for linker | 
					
						
							|  |  |  |         def gcv(v): | 
					
						
							|  |  |  |             if v == 'LDSHARED': | 
					
						
							|  |  |  |                 return 'gcc-4.2 -bundle -undefined dynamic_lookup ' | 
					
						
							|  |  |  |             return 'gcc-4.2' | 
					
						
							|  |  |  |         sysconfig.get_config_var = gcv | 
					
						
							|  |  |  |         with EnvironmentVarGuard() as env: | 
					
						
							|  |  |  |             env['CC'] = 'my_cc' | 
					
						
							|  |  |  |             env['LDSHARED'] = 'my_ld -bundle -dynamic' | 
					
						
							|  |  |  |             sysconfig.customize_compiler(self.cc) | 
					
						
							|  |  |  |         self.assertEqual(self.cc.linker_so[0], 'my_ld') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-09 11:55:12 +00:00
										 |  |  | def test_suite(): | 
					
						
							|  |  |  |     return unittest.makeSuite(UnixCCompilerTestCase) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							| 
									
										
										
										
											2010-11-06 02:44:43 +00:00
										 |  |  |     run_unittest(test_suite()) |