162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#!/usr/bin/env python 262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# Copyright 2017 the V8 project authors. All rights reserved. 362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# Use of this source code is governed by a BSD-style license that can be 462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# found in the LICENSE file. 562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch"""\ 662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochConvenience wrapper for compiling V8 with gn/ninja and running tests. 762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSets up build output directories if they don't exist. 862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochProduces simulator builds for non-Intel target architectures. 962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochUses Goma by default if it is detected (at output directory setup time). 1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochExpects to be run from the root of a V8 checkout. 1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochUsage: 1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch gm.py [<arch>].[<mode>].[<target>] [testname...] 1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochAll arguments are optional. Most combinations should work, e.g.: 1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch gm.py ia32.debug x64.release d8 1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch gm.py x64 mjsunit/foo cctest/test-bar/* 1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch""" 1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# See HELP below for additional documentation. 2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochimport os 2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochimport subprocess 2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochimport sys 2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBUILD_OPTS_DEFAULT = "" 2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBUILD_OPTS_GOMA = "-j1000 -l50" 2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBUILD_TARGETS_TEST = ["d8", "cctest", "unittests"] 2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBUILD_TARGETS_ALL = ["all"] 2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# All arches that this script understands. 3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochARCHES = ["ia32", "x64", "arm", "arm64", "mipsel", "mips64el", "ppc", "ppc64", 3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "s390", "s390x", "x87"] 3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# Arches that get built/run when you don't specify any. 3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDEFAULT_ARCHES = ["ia32", "x64", "arm", "arm64"] 3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# Modes that this script understands. 3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMODES = ["release", "debug", "optdebug"] 3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# Modes that get built/run when you don't specify any. 3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDEFAULT_MODES = ["release", "debug"] 3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# Build targets that can be manually specified. 4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTARGETS = ["d8", "cctest", "unittests", "v8_fuzzers"] 4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# Build targets that get built when you don't specify any (and specified tests 4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# don't imply any other targets). 4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDEFAULT_TARGETS = ["d8"] 4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# Tests that run-tests.py would run by default that can be run with 4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# BUILD_TARGETS_TESTS. 4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDEFAULT_TESTS = ["cctest", "debugger", "intl", "message", "mjsunit", 4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "preparser", "unittests"] 4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# These can be suffixed to any <arch>.<mode> combo, or used standalone, 4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch# or used as global modifiers (affecting all <arch>.<mode> combos). 5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACTIONS = { 5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "all": {"targets": BUILD_TARGETS_ALL, "tests": []}, 5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "tests": {"targets": BUILD_TARGETS_TEST, "tests": []}, 5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "check": {"targets": BUILD_TARGETS_TEST, "tests": DEFAULT_TESTS}, 5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "checkall": {"targets": BUILD_TARGETS_ALL, "tests": ["ALL"]}, 5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHELP = """<arch> can be any of: %(arches)s 5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch<mode> can be any of: %(modes)s 5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch<target> can be any of: 6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch - cctest, d8, unittests, v8_fuzzers (build respective binary) 6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch - all (build all binaries) 6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch - tests (build test binaries) 6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch - check (build test binaries, run most tests) 6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch - checkall (build all binaries, run more tests) 6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch""" % {"arches": " ".join(ARCHES), 6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "modes": " ".join(MODES)} 6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTESTSUITES_TARGETS = {"benchmarks": "d8", 6962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "cctest": "cctest", 7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "debugger": "d8", 7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "fuzzer": "v8_fuzzers", 7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "intl": "d8", 7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "message": "d8", 7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "mjsunit": "d8", 7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "mozilla": "d8", 7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "preparser": "d8", 7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "test262": "d8", 7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "unittests": "unittests", 7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "webkit": "d8"} 8062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 8162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochOUTDIR = "out" 8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 8362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochIS_GOMA_MACHINE = (os.path.exists(os.path.expanduser("~/goma")) or 8462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os.environ.get('GOMADIR')) 8562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 8662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochUSE_GOMA = "true" if IS_GOMA_MACHINE else "false" 8762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBUILD_OPTS = BUILD_OPTS_GOMA if IS_GOMA_MACHINE else BUILD_OPTS_DEFAULT 8862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 8962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochRELEASE_ARGS_TEMPLATE = """\ 9062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochis_component_build = false 9162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochis_debug = false 9262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch%s 9362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuse_goma = {GOMA} 9462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochv8_enable_backtrace = true 9562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochv8_enable_disassembler = true 9662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochv8_enable_object_print = true 9762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochv8_enable_verify_heap = true 9862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch""".replace("{GOMA}", USE_GOMA) 9962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 10062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDEBUG_ARGS_TEMPLATE = """\ 10162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochgdb_index = true 10262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochis_component_build = true 10362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochis_debug = true 10462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochsymbol_level = 2 10562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch%s 10662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuse_goma = {GOMA} 10762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochv8_enable_backtrace = true 10862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochv8_enable_slow_dchecks = true 10962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochv8_optimized_debug = false 11062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch""".replace("{GOMA}", USE_GOMA) 11162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 11262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochOPTDEBUG_ARGS_TEMPLATE = """\ 11362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochgdb_index = false 11462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochis_component_build = true 11562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochis_debug = true 11662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochsymbol_level = 1 11762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch%s 11862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuse_goma = {GOMA} 11962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochv8_enable_backtrace = true 12062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochv8_enable_verify_heap = true 12162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochv8_optimized_debug = true 12262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch""".replace("{GOMA}", USE_GOMA) 12362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 12462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochARGS_TEMPLATES = { 12562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "release": RELEASE_ARGS_TEMPLATE, 12662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "debug": DEBUG_ARGS_TEMPLATE, 12762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "optdebug": OPTDEBUG_ARGS_TEMPLATE 12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochdef PrintHelpAndExit(): 13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch print(__doc__) 13262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch print(HELP) 13362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch sys.exit(0) 13462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 13562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochdef _Call(cmd, silent=False): 13662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if not silent: print("# %s" % cmd) 13762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return subprocess.call(cmd, shell=True) 13862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 13962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochdef _Write(filename, content): 14062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch print("# echo > %s << EOF\n%sEOF" % (filename, content)) 14162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch with open(filename, "w") as f: 14262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch f.write(content) 14362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 14462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochdef GetPath(arch, mode): 14562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch subdir = "%s.%s" % (arch, mode) 14662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return os.path.join(OUTDIR, subdir) 14762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 14862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Config(object): 14962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def __init__(self, arch, mode, targets, tests=[]): 15062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.arch = arch 15162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.mode = mode 15262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.targets = set(targets) 15362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.tests = set(tests) 15462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 15562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def Extend(self, targets, tests=[]): 15662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.targets.update(targets) 15762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.tests.update(tests) 15862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 15962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def GetTargetCpu(self): 16062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch cpu = "x86" 16162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if self.arch.endswith("64") or self.arch == "s390x": 16262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch cpu = "x64" 16362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return "target_cpu = \"%s\"" % cpu 16462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 16562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def GetV8TargetCpu(self): 16662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if self.arch in ("arm", "arm64", "mipsel", "mips64el", "ppc", "ppc64", 16762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "s390", "s390x"): 16862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return "\nv8_target_cpu = \"%s\"" % self.arch 16962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return "" 17062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 17162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def GetGnArgs(self): 17262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch template = ARGS_TEMPLATES[self.mode] 17362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch arch_specific = self.GetTargetCpu() + self.GetV8TargetCpu() 17462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return template % arch_specific 17562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 17662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def Build(self): 17762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch path = GetPath(self.arch, self.mode) 17862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch args_gn = os.path.join(path, "args.gn") 17962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if not os.path.exists(path): 18062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch print("# mkdir -p %s" % path) 18162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch os.makedirs(path) 18262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if not os.path.exists(args_gn): 18362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch _Write(args_gn, self.GetGnArgs()) 18462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch code = _Call("gn gen %s" % path) 18562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if code != 0: return code 18662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch targets = " ".join(self.targets) 18762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return _Call("ninja -C %s %s %s" % (path, BUILD_OPTS, targets)) 18862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 18962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def RunTests(self): 19062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if not self.tests: return 0 19162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if "ALL" in self.tests: 19262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch tests = "" 19362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch else: 19462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch tests = " ".join(self.tests) 19562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return _Call("tools/run-tests.py --arch=%s --mode=%s %s" % 19662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch (self.arch, self.mode, tests)) 19762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 19862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochdef GetTestBinary(argstring): 19962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for suite in TESTSUITES_TARGETS: 20062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if argstring.startswith(suite): return TESTSUITES_TARGETS[suite] 20162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return None 20262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 20362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass ArgumentParser(object): 20462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def __init__(self): 20562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.global_targets = set() 20662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.global_tests = set() 20762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.global_actions = set() 20862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.configs = {} 20962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 21062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def PopulateConfigs(self, arches, modes, targets, tests): 21162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for a in arches: 21262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for m in modes: 21362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch path = GetPath(a, m) 21462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if path not in self.configs: 21562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.configs[path] = Config(a, m, targets, tests) 21662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch else: 21762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.configs[path].Extend(targets, tests) 21862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 21962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def ProcessGlobalActions(self): 22062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch have_configs = len(self.configs) > 0 22162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for action in self.global_actions: 22262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch impact = ACTIONS[action] 22362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (have_configs): 22462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for c in self.configs: 22562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.configs[c].Extend(**impact) 22662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch else: 22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.PopulateConfigs(DEFAULT_ARCHES, DEFAULT_MODES, **impact) 22862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 22962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def ParseArg(self, argstring): 23062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if argstring in ("-h", "--help", "help"): 23162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PrintHelpAndExit() 23262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch arches = [] 23362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch modes = [] 23462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch targets = [] 23562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch actions = [] 23662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch tests = [] 23762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch words = argstring.split('.') 23862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if len(words) == 1: 23962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch word = words[0] 24062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if word in ACTIONS: 24162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.global_actions.add(word) 24262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return 24362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if word in TARGETS: 24462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.global_targets.add(word) 24562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return 24662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch maybe_target = GetTestBinary(word) 24762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if maybe_target is not None: 24862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.global_tests.add(word) 24962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.global_targets.add(maybe_target) 25062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return 25162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for word in words: 25262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if word in ARCHES: 25362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch arches.append(word) 25462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch elif word in MODES: 25562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch modes.append(word) 25662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch elif word in TARGETS: 25762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch targets.append(word) 25862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch elif word in ACTIONS: 25962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch actions.append(word) 26062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch else: 26162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch print("Didn't understand: %s" % word) 26262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch sys.exit(1) 26362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch # Process actions. 26462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for action in actions: 26562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch impact = ACTIONS[action] 26662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch targets += impact["targets"] 26762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch tests += impact["tests"] 26862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch # Fill in defaults for things that weren't specified. 26962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch arches = arches or DEFAULT_ARCHES 27062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch modes = modes or DEFAULT_MODES 27162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch targets = targets or DEFAULT_TARGETS 27262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch # Produce configs. 27362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.PopulateConfigs(arches, modes, targets, tests) 27462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 27562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch def ParseArguments(self, argv): 27662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if len(argv) == 0: 27762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PrintHelpAndExit() 27862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for argstring in argv: 27962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.ParseArg(argstring) 28062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.ProcessGlobalActions() 28162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for c in self.configs: 28262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch self.configs[c].Extend(self.global_targets, self.global_tests) 28362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return self.configs 28462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 28562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochdef Main(argv): 28662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch parser = ArgumentParser() 28762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch configs = parser.ParseArguments(argv[1:]) 28862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return_code = 0 28962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for c in configs: 29062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return_code += configs[c].Build() 29162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for c in configs: 29262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return_code += configs[c].RunTests() 29362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if return_code == 0: 29462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch _Call("notify-send 'Done!' 'V8 compilation finished successfully.'", 29562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch silent=True) 29662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch else: 29762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch _Call("notify-send 'Error!' 'V8 compilation finished with errors.'", 29862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch silent=True) 29962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return return_code 30062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 30162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochif __name__ == "__main__": 30262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch sys.exit(Main(sys.argv)) 303