# -*- python -*- # test_toolchain.py - Unit tests for swift_build_support.toolchain # # This source file is part of the Swift.org open source project # # Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors # Licensed under Apache License v2.0 with Runtime Library Exception # # See https://swift.org/LICENSE.txt for license information # See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors import os import platform import unittest from swift_build_support import toolchain from swift_build_support.toolchain import host_toolchain def get_suffix(path, prefix): basename = os.path.basename(path) return basename[len(prefix):] class ToolchainTestCase(unittest.TestCase): def test_clang_tools(self): tc = host_toolchain() self.assertIsNotNone(tc.cc) self.assertIsNotNone(tc.cxx) self.assertTrue( os.path.isabs(tc.cc) and os.path.basename(tc.cc).startswith(self._platform_cc_name())) self.assertTrue( os.path.isabs(tc.cxx) and os.path.basename(tc.cxx).startswith(self._platform_cxx_name())) def test_llvm_tools(self): tc = host_toolchain() self.assertTrue( tc.llvm_profdata is None or os.path.isabs(tc.llvm_profdata) and os.path.basename(tc.llvm_profdata).startswith('llvm-profdata')) self.assertTrue( tc.llvm_cov is None or os.path.isabs(tc.llvm_cov) and os.path.basename(tc.llvm_cov).startswith('llvm-cov')) def test_misc_tools(self): tc = host_toolchain() # CMake self.assertIsNotNone(tc.cmake) self.assertTrue( os.path.basename(tc.cmake).startswith('cmake')) # Ninja self.assertTrue(tc.ninja is None or os.path.basename(tc.ninja) == 'ninja' or os.path.basename(tc.ninja) == 'ninja-build') # distcc self.assertTrue(tc.distcc is None or os.path.basename(tc.distcc) == 'distcc') # pump self.assertTrue(tc.distcc_pump is None or os.path.basename(tc.distcc_pump) == 'pump' or os.path.basename(tc.distcc_pump) == 'distcc-pump') # sccache self.assertTrue(tc.sccache is None or os.path.basename(tc.sccache) == 'sccache') def test_find_tool(self): tc = host_toolchain() # Toolchain.find_tool(path) can find arbitrary tool in PATH sh = tc.find_tool('sh') self.assertTrue(sh is not None and os.path.isabs(sh) and os.path.basename(sh) == 'sh') tar = tc.find_tool('tar') self.assertTrue(tar is not None and os.path.isabs(tar) and os.path.basename(tar) == 'tar') def test_tools_suffix_match(self): tc = host_toolchain() # CC and CXX must have consistent suffix cc_suffix = get_suffix(tc.cc, self._platform_cc_name()) cxx_suffix = get_suffix(tc.cxx, self._platform_cxx_name()) self.assertEqual(cc_suffix, cxx_suffix) def test_tools_llvm_suffix(self): tc = host_toolchain() cov_suffix = None profdata_suffix = None if tc.llvm_cov: cov_suffix = get_suffix(tc.llvm_cov, 'llvm-cov') if tc.llvm_profdata: profdata_suffix = get_suffix(tc.llvm_profdata, 'llvm-profdata') if profdata_suffix is not None and cov_suffix is not None: self.assertEqual(profdata_suffix, cov_suffix) # If we have suffixed clang, llvm tools must have the same suffix. cc_suffix = get_suffix(tc.cc, self._platform_cc_name()) if cc_suffix != '': if cov_suffix is not None: self.assertEqual(cc_suffix, cov_suffix) if profdata_suffix is not None: self.assertEqual(cc_suffix, profdata_suffix) def test_toolchain_instances(self): # Check that we can instantiate every toolchain, even if it isn't the # current platform. toolchain.MacOSX() toolchain.Linux() toolchain.FreeBSD() toolchain.Cygwin() def _platform_cc_name(self): if platform.system() == 'Windows': return 'clang-cl' else: return 'clang' def _platform_cxx_name(self): if platform.system() == 'Windows': return 'clang-cl' else: return 'clang++' if __name__ == '__main__': unittest.main()