mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This adds a flag to enable sccache in order to simplify the build-script invocation, particularly for new contributors.
141 lines
4.5 KiB
Python
141 lines
4.5 KiB
Python
# -*- 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()
|