forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathtest_toolchain.py
140 lines (112 loc) · 4.51 KB
/
test_toolchain.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# -*- 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()