blob: 34470d578aaa52ebd5b8dc3f3249857df8aa9194 [file] [log] [blame]
# -*- 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()