blob: 9eb859f7986d88345e4a2df9aeae5ccca970d6e9 [file] [log] [blame]
snickolls-arm2decd2c2024-01-17 11:24:49 +00001#!/usr/bin/env python3
armvixlad96eda2013-06-14 11:42:37 +01002
Alexandre Ramesb78f1392016-07-01 14:22:22 +01003# Copyright 2015, VIXL authors
armvixlad96eda2013-06-14 11:42:37 +01004# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions are met:
8#
9# * Redistributions of source code must retain the above copyright notice,
10# this list of conditions and the following disclaimer.
11# * Redistributions in binary form must reproduce the above copyright notice,
12# this list of conditions and the following disclaimer in the documentation
13# and/or other materials provided with the distribution.
14# * Neither the name of ARM Limited nor the names of its contributors may be
15# used to endorse or promote products derived from this software without
16# specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
19# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
22# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
armvixlad96eda2013-06-14 11:42:37 +010029import argparse
armvixldb644342015-07-21 11:37:10 +010030import fcntl
armvixldb644342015-07-21 11:37:10 +010031import itertools
armvixl4a102ba2014-07-14 09:02:40 +010032import multiprocessing
armvixldb644342015-07-21 11:37:10 +010033import os
34from os.path import join
35import platform
armvixldb644342015-07-21 11:37:10 +010036import subprocess
37import sys
armvixlad96eda2013-06-14 11:42:37 +010038import time
armvixldb644342015-07-21 11:37:10 +010039
40import config
armvixl0f35e362016-05-10 13:57:58 +010041import clang_format
Anthony Barbier89eefef2019-07-05 11:15:13 +010042import clang_tidy
armvixldb644342015-07-21 11:37:10 +010043import lint
44import printer
45import test
Anthony Barbier89eefef2019-07-05 11:15:13 +010046import test_runner
armvixlad96eda2013-06-14 11:42:37 +010047import util
48
49
armvixldb644342015-07-21 11:37:10 +010050dir_root = config.dir_root
51
Anthony Barbierf2986e12019-02-28 16:49:23 +000052
53# Remove duplicates from a list
54def RemoveDuplicates(values):
55 # Convert the list into a set and back to list
56 # as sets guarantee items are unique.
57 return list(set(values))
armvixldb644342015-07-21 11:37:10 +010058
59
Anthony Barbierf2986e12019-02-28 16:49:23 +000060# Custom argparse.Action to automatically add and handle an 'all' option.
61# If no 'default' value is set, it will default to 'all.
62# If accepted options are set using 'choices' then only these values will be
63# allowed.
64# If they're set using 'soft_choices' then 'all' will default to these values,
65# but other values will also be accepted.
66class AllChoiceAction(argparse.Action):
armvixldb644342015-07-21 11:37:10 +010067
Anthony Barbierf2986e12019-02-28 16:49:23 +000068 # At least one option was set by the user.
69 WasSetByUser = False
armvixldb644342015-07-21 11:37:10 +010070
Anthony Barbierf2986e12019-02-28 16:49:23 +000071 def __init__(self, **kwargs):
72 if 'choices' in kwargs:
73 assert 'soft_choices' not in kwargs,\
74 "Can't have both 'choices' and 'soft_choices' options"
75 self.all_choices = list(kwargs['choices'])
76 kwargs['choices'].append('all')
armvixldb644342015-07-21 11:37:10 +010077 else:
Anthony Barbierf2986e12019-02-28 16:49:23 +000078 self.all_choices = kwargs['soft_choices']
79 kwargs['help'] += ' Supported values: {' + ','.join(
80 ['all'] + self.all_choices) + '}'
81 del kwargs['soft_choices']
82 if 'default' not in kwargs:
83 kwargs['default'] = self.all_choices
84 super(AllChoiceAction, self).__init__(**kwargs)
armvixldb644342015-07-21 11:37:10 +010085
Anthony Barbierf2986e12019-02-28 16:49:23 +000086 def __call__(self, parser, namespace, values, option_string=None):
87 AllChoiceAction.WasSetByUser = True
88 if 'all' in values:
89 # Substitute 'all' by the actual values.
90 values = self.all_choices + [value for value in values if value != 'all']
armvixldb644342015-07-21 11:37:10 +010091
Anthony Barbierf2986e12019-02-28 16:49:23 +000092 setattr(namespace, self.dest, RemoveDuplicates(values))
armvixl5799d6c2014-05-01 11:05:00 +010093
94
armvixlad96eda2013-06-14 11:42:37 +010095def BuildOptions():
armvixldb644342015-07-21 11:37:10 +010096 args = argparse.ArgumentParser(
97 description =
armvixl0f35e362016-05-10 13:57:58 +010098 '''This tool runs all tests matching the specified filters for multiple
armvixldb644342015-07-21 11:37:10 +010099 environment, build options, and runtime options configurations.''',
100 # Print default values.
101 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
102
103 args.add_argument('filters', metavar='filter', nargs='*',
104 help='Run tests matching all of the (regexp) filters.')
105
106 # We automatically build the script options from the options to be tested.
107 test_arguments = args.add_argument_group(
108 'Test options',
109 'These options indicate what should be tested')
Anthony Barbierf2986e12019-02-28 16:49:23 +0000110 test_arguments.add_argument(
111 '--negative_testing',
112 help='Tests with negative testing enabled.',
113 action='store_const',
114 const='on',
115 default='off')
116 test_arguments.add_argument(
117 '--compiler',
118 help='Test for the specified compilers.',
119 soft_choices=config.tested_compilers,
120 action=AllChoiceAction,
121 nargs="+")
122 test_arguments.add_argument(
123 '--mode',
124 help='Test with the specified build modes.',
125 choices=config.build_options_modes,
126 action=AllChoiceAction,
127 nargs="+")
128 test_arguments.add_argument(
129 '--std',
130 help='Test with the specified C++ standard.',
131 soft_choices=config.tested_cpp_standards,
132 action=AllChoiceAction,
133 nargs="+")
134 test_arguments.add_argument(
135 '--target',
136 help='Test with the specified isa enabled.',
137 soft_choices=config.build_options_target,
138 action=AllChoiceAction,
139 nargs="+")
armvixldb644342015-07-21 11:37:10 +0100140
141 general_arguments = args.add_argument_group('General options')
Jacob Bramley59d74ae2017-01-18 15:27:45 +0000142 general_arguments.add_argument('--dry-run', action='store_true',
143 help='''Don't actually build or run anything,
144 but print the configurations that would be
145 tested.''')
Anthony Barbier88e1d032019-06-13 15:20:20 +0100146 general_arguments.add_argument('--verbose', action='store_true',
147 help='''Print extra information.''')
armvixldb644342015-07-21 11:37:10 +0100148 general_arguments.add_argument(
149 '--jobs', '-j', metavar='N', type=int, nargs='?',
Anthony Barbier9c4ba7a2019-02-15 15:20:25 +0000150 default=multiprocessing.cpu_count(),
151 const=multiprocessing.cpu_count(),
armvixldb644342015-07-21 11:37:10 +0100152 help='''Runs the tests using N jobs. If the option is set but no value is
153 provided, the script will use as many jobs as it thinks useful.''')
Pierre Langlois44096c42018-05-23 23:15:25 +0100154 general_arguments.add_argument('--clang-format',
155 default=clang_format.DEFAULT_CLANG_FORMAT,
156 help='Path to clang-format.')
Anthony Barbier89eefef2019-07-05 11:15:13 +0100157 general_arguments.add_argument('--clang-tidy',
158 default=clang_tidy.DEFAULT_CLANG_TIDY,
159 help='Path to clang-tidy.')
armvixldb644342015-07-21 11:37:10 +0100160 general_arguments.add_argument('--nobench', action='store_true',
161 help='Do not run benchmarks.')
162 general_arguments.add_argument('--nolint', action='store_true',
163 help='Do not run the linter.')
armvixl0f35e362016-05-10 13:57:58 +0100164 general_arguments.add_argument('--noclang-format', action='store_true',
165 help='Do not run clang-format.')
Anthony Barbier89eefef2019-07-05 11:15:13 +0100166 general_arguments.add_argument('--noclang-tidy', action='store_true',
167 help='Do not run clang-tidy.')
armvixldb644342015-07-21 11:37:10 +0100168 general_arguments.add_argument('--notest', action='store_true',
169 help='Do not run tests.')
Martyn Capewellad16ac62021-06-30 15:10:02 +0100170 general_arguments.add_argument('--nocheck-code-coverage', action='store_true',
171 help='Do not check code coverage results log.')
Alexandre Rames73064a22016-07-08 09:17:03 +0100172 general_arguments.add_argument('--fail-early', action='store_true',
173 help='Exit as soon as a test fails.')
armvixl684cd2a2015-10-23 13:38:33 +0100174 general_arguments.add_argument(
175 '--under_valgrind', action='store_true',
176 help='''Run the test-runner commands under Valgrind.
177 Note that a few tests are known to fail because of
178 issues in Valgrind''')
armvixldb644342015-07-21 11:37:10 +0100179 return args.parse_args()
armvixlad96eda2013-06-14 11:42:37 +0100180
181
armvixldb644342015-07-21 11:37:10 +0100182def RunCommand(command, environment_options = None):
183 # Create a copy of the environment. We do not want to pollute the environment
184 # of future commands run.
Anthony Barbierf2986e12019-02-28 16:49:23 +0000185 environment = os.environ.copy()
armvixlad96eda2013-06-14 11:42:37 +0100186
armvixldb644342015-07-21 11:37:10 +0100187 printable_command = ''
188 if environment_options:
Anthony Barbierf2986e12019-02-28 16:49:23 +0000189 # Add the environment options to the environment:
190 environment.update(environment_options)
191 printable_command += ' ' + DictToString(environment_options) + ' '
armvixldb644342015-07-21 11:37:10 +0100192 printable_command += ' '.join(command)
armvixlad96eda2013-06-14 11:42:37 +0100193
armvixldb644342015-07-21 11:37:10 +0100194 printable_command_orange = \
195 printer.COLOUR_ORANGE + printable_command + printer.NO_COLOUR
196 printer.PrintOverwritableLine(printable_command_orange)
197 sys.stdout.flush()
armvixlad96eda2013-06-14 11:42:37 +0100198
armvixldb644342015-07-21 11:37:10 +0100199 # Start a process for the command.
200 # Interleave `stderr` and `stdout`.
201 p = subprocess.Popen(command,
202 stdout=subprocess.PIPE,
203 stderr=subprocess.STDOUT,
204 env=environment)
armvixlad96eda2013-06-14 11:42:37 +0100205
armvixldb644342015-07-21 11:37:10 +0100206 # We want to be able to display a continuously updated 'work indicator' while
207 # the process is running. Since the process can hang if the `stdout` pipe is
208 # full, we need to pull from it regularly. We cannot do so via the
209 # `readline()` function because it is blocking, and would thus cause the
210 # indicator to not be updated properly. So use file control mechanisms
211 # instead.
212 indicator = ' (still working: %d seconds elapsed)'
armvixl5799d6c2014-05-01 11:05:00 +0100213
armvixldb644342015-07-21 11:37:10 +0100214 # Mark the process output as non-blocking.
215 flags = fcntl.fcntl(p.stdout, fcntl.F_GETFL)
216 fcntl.fcntl(p.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
armvixl5799d6c2014-05-01 11:05:00 +0100217
armvixldb644342015-07-21 11:37:10 +0100218 t_start = time.time()
Anthony Barbierf2986e12019-02-28 16:49:23 +0000219 t_current = t_start
armvixldb644342015-07-21 11:37:10 +0100220 t_last_indication = t_start
Anthony Barbier7b4df2b2019-03-12 17:36:15 +0000221 t_current = t_start
snickolls-arm2decd2c2024-01-17 11:24:49 +0000222 process_output = b''
armvixl5799d6c2014-05-01 11:05:00 +0100223
armvixldb644342015-07-21 11:37:10 +0100224 # Keep looping as long as the process is running.
225 while p.poll() is None:
226 # Avoid polling too often.
227 time.sleep(0.1)
228 # Update the progress indicator.
229 t_current = time.time()
230 if (t_current - t_start >= 2) and (t_current - t_last_indication >= 1):
231 printer.PrintOverwritableLine(
232 printable_command_orange + indicator % int(t_current - t_start))
233 sys.stdout.flush()
234 t_last_indication = t_current
235 # Pull from the process output.
236 while True:
237 try:
238 line = os.read(p.stdout.fileno(), 1024)
239 except OSError:
snickolls-arm2decd2c2024-01-17 11:24:49 +0000240 line = b''
armvixldb644342015-07-21 11:37:10 +0100241 break
snickolls-arm2decd2c2024-01-17 11:24:49 +0000242 if line == b'': break
armvixldb644342015-07-21 11:37:10 +0100243 process_output += line
armvixlad96eda2013-06-14 11:42:37 +0100244
armvixldb644342015-07-21 11:37:10 +0100245 # The process has exited. Don't forget to retrieve the rest of its output.
246 out, err = p.communicate()
247 rc = p.poll()
248 process_output += out
armvixlad96eda2013-06-14 11:42:37 +0100249
Anthony Barbierb5f72392019-02-15 15:33:48 +0000250 printable_command += ' (took %d seconds)' % int(t_current - t_start)
armvixldb644342015-07-21 11:37:10 +0100251 if rc == 0:
252 printer.Print(printer.COLOUR_GREEN + printable_command + printer.NO_COLOUR)
armvixl4a102ba2014-07-14 09:02:40 +0100253 else:
armvixldb644342015-07-21 11:37:10 +0100254 printer.Print(printer.COLOUR_RED + printable_command + printer.NO_COLOUR)
snickolls-arm2decd2c2024-01-17 11:24:49 +0000255 printer.Print(process_output.decode())
armvixldb644342015-07-21 11:37:10 +0100256 return rc
armvixl5799d6c2014-05-01 11:05:00 +0100257
258
Anthony Barbierf2986e12019-02-28 16:49:23 +0000259def RunLinter(jobs):
snickolls-arm2decd2c2024-01-17 11:24:49 +0000260 return lint.RunLinter([join(dir_root, x) for x in util.get_source_files()],
armvixldb644342015-07-21 11:37:10 +0100261 jobs = args.jobs, progress_prefix = 'cpp lint: ')
armvixlad96eda2013-06-14 11:42:37 +0100262
armvixlad96eda2013-06-14 11:42:37 +0100263
Anthony Barbierf2986e12019-02-28 16:49:23 +0000264def RunClangFormat(clang_path, jobs):
mmc28a1a2c1d32024-02-01 16:43:49 +0000265 return clang_format.ClangFormatFiles(util.get_source_files(exclude_dirs=['.*', '*/traces/*', '*/aarch32/*']),
Jacob Bramleyf89cb482019-06-28 15:53:18 +0100266 clang_path,
267 jobs = jobs,
armvixl0f35e362016-05-10 13:57:58 +0100268 progress_prefix = 'clang-format: ')
269
Anthony Barbier89eefef2019-07-05 11:15:13 +0100270def RunClangTidy(clang_path, jobs):
mmc28a1a2c1d32024-02-01 16:43:49 +0000271 return clang_tidy.ClangTidyFiles(util.get_source_files(exclude_dirs=['.*', '*/traces/*', '*/aarch32/*']),
Anthony Barbier89eefef2019-07-05 11:15:13 +0100272 clang_path,
273 jobs = jobs,
274 progress_prefix = 'clang-tidy: ')
armvixl0f35e362016-05-10 13:57:58 +0100275
Martyn Capewellad16ac62021-06-30 15:10:02 +0100276def CheckCodeCoverage():
277 command = ['tools/check_recent_coverage.sh']
278 return RunCommand(command)
279
Anthony Barbierf2986e12019-02-28 16:49:23 +0000280def BuildAll(build_options, jobs, environment_options):
281 scons_command = ['scons', '-C', dir_root, 'all', '-j', str(jobs)]
Anthony Barbier9c4ba7a2019-02-15 15:20:25 +0000282 if util.IsCommandAvailable('ccache'):
283 scons_command += ['compiler_wrapper=ccache']
284 # Fixes warnings for ccache 3.3.1 and lower:
285 environment_options = environment_options.copy()
286 environment_options["CCACHE_CPP2"] = 'yes'
Anthony Barbierf2986e12019-02-28 16:49:23 +0000287 scons_command += DictToString(build_options).split()
288 return RunCommand(scons_command, environment_options)
armvixlad96eda2013-06-14 11:42:37 +0100289
armvixl4a102ba2014-07-14 09:02:40 +0100290
Anthony Barbierf2986e12019-02-28 16:49:23 +0000291def CanRunAarch64(options, args):
292 for target in options['target']:
293 if target in ['aarch64', 'a64']:
Rodolph Perfetta9a9331f2016-12-09 22:05:48 +0000294 return True
295
296 return False
297
298
Rodolph Perfetta9a9331f2016-12-09 22:05:48 +0000299def CanRunAarch32(options, args):
Anthony Barbierf2986e12019-02-28 16:49:23 +0000300 for target in options['target']:
301 if target in ['aarch32', 'a32', 't32']:
302 return True
303 return False
Rodolph Perfetta9a9331f2016-12-09 22:05:48 +0000304
305
306def RunBenchmarks(options, args):
armvixldb644342015-07-21 11:37:10 +0100307 rc = 0
Rodolph Perfetta9a9331f2016-12-09 22:05:48 +0000308 if CanRunAarch32(options, args):
Pierre Langlois1c1488c2016-12-14 18:16:44 +0000309 benchmark_names = util.ListCCFilesWithoutExt(config.dir_aarch32_benchmarks)
310 for bench in benchmark_names:
311 rc |= RunCommand(
312 [os.path.realpath(
Martyn Capewell9cd420f2017-05-12 20:30:23 +0100313 join(config.dir_build_latest, 'benchmarks/aarch32', bench)), '10'])
Rodolph Perfetta9a9331f2016-12-09 22:05:48 +0000314 if CanRunAarch64(options, args):
Pierre Langlois1c1488c2016-12-14 18:16:44 +0000315 benchmark_names = util.ListCCFilesWithoutExt(config.dir_aarch64_benchmarks)
316 for bench in benchmark_names:
317 rc |= RunCommand(
318 [util.relrealpath(
Martyn Capewell9cd420f2017-05-12 20:30:23 +0100319 join(config.dir_build_latest,
320 'benchmarks/aarch64', bench)), '10'])
armvixldb644342015-07-21 11:37:10 +0100321 return rc
armvixl4a102ba2014-07-14 09:02:40 +0100322
armvixl4a102ba2014-07-14 09:02:40 +0100323
armvixl4a102ba2014-07-14 09:02:40 +0100324
Anthony Barbierf2986e12019-02-28 16:49:23 +0000325# It is a precommit run if the user did not specify any of the
326# options that would affect the automatically generated combinations.
327def IsPrecommitRun(args):
328 return args.negative_testing == "off" and not AllChoiceAction.WasSetByUser
329
330# Generate a list of all the possible combinations of the passed list:
331# ListCombinations( a = [a0, a1], b = [b0, b1] ) will return
332# [ {a : a0, b : b0}, {a : a0, b : b1}, {a: a1, b : b0}, {a : a1, b : b1}]
333def ListCombinations(**kwargs):
334 # End of recursion: no options passed
335 if not kwargs:
336 return [{}]
337 option, values = kwargs.popitem()
338 configs = ListCombinations(**kwargs)
339 retval = []
340 if not isinstance(values, list):
341 values = [values]
342 for value in values:
343 for config in configs:
344 new_config = config.copy()
345 new_config[option] = value
346 retval.append(new_config)
347 return retval
348
349# Convert a dictionary into a space separated string
350# {a : a0, b : b0} --> "a=a0 b=b0"
351def DictToString(options):
352 return " ".join(
353 ["{}={}".format(option, value) for option, value in options.items()])
armvixlad96eda2013-06-14 11:42:37 +0100354
355
356if __name__ == '__main__':
armvixldb644342015-07-21 11:37:10 +0100357 util.require_program('scons')
armvixlad96eda2013-06-14 11:42:37 +0100358
armvixlad96eda2013-06-14 11:42:37 +0100359 args = BuildOptions()
armvixlad96eda2013-06-14 11:42:37 +0100360
Anthony Barbierf2986e12019-02-28 16:49:23 +0000361 rc = util.ReturnCode(args.fail_early, printer.Print)
Alexandre Rames73064a22016-07-08 09:17:03 +0100362
armvixl684cd2a2015-10-23 13:38:33 +0100363 if args.under_valgrind:
364 util.require_program('valgrind')
365
Martyn Capewellad16ac62021-06-30 15:10:02 +0100366 if not args.nocheck_code_coverage:
367 rc.Combine(CheckCodeCoverage())
368
Anthony Barbier89eefef2019-07-05 11:15:13 +0100369 tests = test_runner.TestQueue()
Anthony Barbierf2986e12019-02-28 16:49:23 +0000370 if not args.nolint and not args.dry_run:
371 rc.Combine(RunLinter(args.jobs))
Jacob Bramley59d74ae2017-01-18 15:27:45 +0000372
Anthony Barbierf2986e12019-02-28 16:49:23 +0000373 if not args.noclang_format and not args.dry_run:
374 rc.Combine(RunClangFormat(args.clang_format, args.jobs))
375
Anthony Barbier89eefef2019-07-05 11:15:13 +0100376 if not args.noclang_tidy and not args.dry_run:
377 rc.Combine(RunClangTidy(args.clang_tidy, args.jobs))
378
Anthony Barbierf2986e12019-02-28 16:49:23 +0000379 list_options = []
380 if IsPrecommitRun(args):
381 # Maximize the coverage for precommit testing.
382
Pierre Langloisa5b3cef2019-01-28 11:30:38 +0000383 # Debug builds with negative testing and all targets enabled.
Anthony Barbierf2986e12019-02-28 16:49:23 +0000384 list_options += ListCombinations(
385 compiler = args.compiler,
386 negative_testing = 'on',
Jacob Bramley191e7572020-01-31 14:19:57 +0000387 std = args.std,
Anthony Barbierf2986e12019-02-28 16:49:23 +0000388 mode = 'debug',
389 target = 'a64,a32,t32')
390
391 # Release builds with all targets enabled.
392 list_options += ListCombinations(
393 compiler = args.compiler,
394 negative_testing = 'off',
395 std = args.std,
396 mode = 'release',
397 target = 'a64,a32,t32')
398
Jacob Bramley364a0682020-02-05 17:10:21 +0000399 # Debug builds for individual targets.
Anthony Barbierf2986e12019-02-28 16:49:23 +0000400 list_options += ListCombinations(
Jacob Bramley364a0682020-02-05 17:10:21 +0000401 compiler = args.compiler[0],
Anthony Barbierf2986e12019-02-28 16:49:23 +0000402 negative_testing = 'off',
Jacob Bramley191e7572020-01-31 14:19:57 +0000403 std = args.std,
Jacob Bramley364a0682020-02-05 17:10:21 +0000404 mode = 'debug',
405 target = ['a32', 't32', 'a64'])
Anthony Barbierf2986e12019-02-28 16:49:23 +0000406 else:
407 list_options = ListCombinations(
408 compiler = args.compiler,
409 negative_testing = args.negative_testing,
410 std = args.std,
411 mode = args.mode,
412 target = args.target)
413
414 for options in list_options:
415 if (args.dry_run):
416 print(DictToString(options))
417 continue
418 # Convert 'compiler' into an environment variable:
419 environment_options = {'CXX': options['compiler']}
420 del options['compiler']
421
422 # Avoid going through the build stage if we are not using the build
423 # result.
424 if not (args.notest and args.nobench):
425 build_rc = BuildAll(options, args.jobs, environment_options)
426 # Don't run the tests for this configuration if the build failed.
427 if build_rc != 0:
428 rc.Combine(build_rc)
429 continue
armvixlad96eda2013-06-14 11:42:37 +0100430
armvixldb644342015-07-21 11:37:10 +0100431 # Use the realpath of the test executable so that the commands printed
432 # can be copy-pasted and run.
Alexandre Rames81c76e62016-07-19 09:53:09 +0100433 test_executable = util.relrealpath(
armvixldb644342015-07-21 11:37:10 +0100434 join(config.dir_build_latest, 'test', 'test-runner'))
435
436 if not args.notest:
437 printer.Print(test_executable)
Anthony Barbier89eefef2019-07-05 11:15:13 +0100438 tests.AddTests(
Anthony Barbierf2986e12019-02-28 16:49:23 +0000439 test_executable,
440 args.filters,
Anthony Barbier89eefef2019-07-05 11:15:13 +0100441 list(),
442 args.under_valgrind)
armvixldb644342015-07-21 11:37:10 +0100443
444 if not args.nobench:
Anthony Barbierf2986e12019-02-28 16:49:23 +0000445 rc.Combine(RunBenchmarks(options, args))
armvixldb644342015-07-21 11:37:10 +0100446
Anthony Barbier88e1d032019-06-13 15:20:20 +0100447 rc.Combine(tests.Run(args.jobs, args.verbose))
Jacob Bramley59d74ae2017-01-18 15:27:45 +0000448 if not args.dry_run:
Anthony Barbierf2986e12019-02-28 16:49:23 +0000449 rc.PrintStatus()
Alexandre Rames7c0ea8b2016-05-18 13:47:42 +0100450
Anthony Barbierf2986e12019-02-28 16:49:23 +0000451 sys.exit(rc.Value)