14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Tests for distutils.ccompiler."""
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test.test_support import captured_stdout
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.ccompiler import (gen_lib_options, CCompiler,
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                 get_default_compiler, customize_compiler)
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils import debug
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom distutils.tests import support
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass FakeCompiler(object):
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def library_dir_option(self, dir):
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return "-L" + dir
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def runtime_library_dir_option(self, dir):
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ["-cool", "-R" + dir]
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def find_library_file(self, dirs, lib, debug=0):
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return 'found'
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def library_option(self, lib):
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return "-l" + lib
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass CCompilerTestCase(support.EnvironGuard, unittest.TestCase):
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_gen_lib_options(self):
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        compiler = FakeCompiler()
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        libdirs = ['lib1', 'lib2']
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        runlibdirs = ['runlib1']
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        libs = [os.path.join('dir', 'name'), 'name2']
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        opts = gen_lib_options(compiler, libdirs, runlibdirs, libs)
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        wanted = ['-Llib1', '-Llib2', '-cool', '-Rrunlib1', 'found',
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                  '-lname2']
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(opts, wanted)
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_debug_print(self):
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class MyCCompiler(CCompiler):
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            executables = {}
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        compiler = MyCCompiler()
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        with captured_stdout() as stdout:
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            compiler.debug_print('xxx')
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        stdout.seek(0)
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(stdout.read(), '')
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        debug.DEBUG = True
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            with captured_stdout() as stdout:
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                compiler.debug_print('xxx')
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            stdout.seek(0)
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(stdout.read(), 'xxx\n')
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finally:
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            debug.DEBUG = False
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_customize_compiler(self):
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # not testing if default compiler is not unix
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if get_default_compiler() != 'unix':
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.environ['AR'] = 'my_ar'
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        os.environ['ARFLAGS'] = '-arflags'
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # make sure AR gets caught
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class compiler:
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            compiler_type = 'unix'
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def set_executables(self, **kw):
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.exes = kw
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        comp = compiler()
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        customize_compiler(comp)
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(comp.exes['archiver'], 'my_ar -arflags')
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_suite():
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return unittest.makeSuite(CCompilerTestCase)
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__":
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unittest.main(defaultTest="test_suite")
82