blob: 45d84e206dcb41a84282c91927b218d7a365c949 [file] [log] [blame]
Mathias Ravdd6a6de2018-05-18 10:18:33 +02001# Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
2# for details. All rights reserved. Use of this source code is governed by a
3# BSD-style license that can be found in the LICENSE file.
4
Ian Zerny0f5fc732018-11-15 14:34:41 +01005import glob
Mathias Ravdd6a6de2018-05-18 10:18:33 +02006import subprocess
Jinseong Jeon158a3f12019-02-08 01:40:59 -08007from threading import Timer
Ian Zernye92325b2020-03-13 13:29:27 +01008
9import gradle
10import jdk
Mathias Ravdd6a6de2018-05-18 10:18:33 +020011import utils
12
Ian Zernye92325b2020-03-13 13:29:27 +010013
Mathias Ravdd6a6de2018-05-18 10:18:33 +020014def run(tool, args, build=None, debug=True,
Rico Wind5fdec152018-12-17 09:16:14 +010015 profile=False, track_memory_file=None, extra_args=None,
Søren Gjesse943389f2020-03-13 10:40:25 +010016 stderr=None, stdout=None, return_stdout=False, timeout=0, quiet=False,
Christoffer Quist Adamsen870fa462020-12-15 10:50:54 +010017 cmd_prefix=None, jar=None, main=None):
Ian Zernye92325b2020-03-13 13:29:27 +010018 cmd = []
Søren Gjessec853feb2020-03-16 09:34:41 +010019 if cmd_prefix:
20 cmd.extend(cmd_prefix)
Mathias Ravdd6a6de2018-05-18 10:18:33 +020021 if build is None:
22 build, args = extract_build_from_args(args)
23 if build:
Tamas Keneza730a7e2018-12-10 15:02:28 +010024 gradle.RunGradle(['r8lib' if tool.startswith('r8lib') else 'r8'])
Mathias Ravdd6a6de2018-05-18 10:18:33 +020025 if track_memory_file:
26 cmd.extend(['tools/track_memory.sh', track_memory_file])
Ian Zerny3f54e222019-02-12 10:51:17 +010027 cmd.append(jdk.GetJavaExecutable())
Mathias Rav56df69d2018-06-07 12:38:21 +020028 if extra_args:
29 cmd.extend(extra_args)
Mathias Ravdd6a6de2018-05-18 10:18:33 +020030 if debug:
31 cmd.append('-ea')
32 if profile:
33 cmd.append('-agentlib:hprof=cpu=samples,interval=1,depth=8')
Christoffer Quist Adamsen870fa462020-12-15 10:50:54 +010034 if jar:
35 cmd.extend(['-cp', jar, main])
36 elif tool == 'r8lib-d8':
Søren Gjesse95becbf2018-12-11 08:48:00 +010037 cmd.extend(['-cp', utils.R8LIB_JAR, 'com.android.tools.r8.D8'])
Tamas Keneza730a7e2018-12-10 15:02:28 +010038 elif tool == 'r8lib-r8':
39 cmd.extend(['-cp', utils.R8LIB_JAR, 'com.android.tools.r8.R8'])
40 else:
Søren Gjesse95becbf2018-12-11 08:48:00 +010041 cmd.extend(['-jar', utils.R8_JAR, tool])
Søren Gjessec4e6a282018-10-04 12:37:03 +020042 lib, args = extract_lib_from_args(args)
43 if lib:
44 cmd.extend(["--lib", lib])
Mathias Ravdd6a6de2018-05-18 10:18:33 +020045 cmd.extend(args)
Morten Krogh-Jespersenae9557c2019-10-23 15:14:02 +020046 utils.PrintCmd(cmd, quiet=quiet)
Jinseong Jeon158a3f12019-02-08 01:40:59 -080047 if timeout > 0:
48 kill = lambda process: process.kill()
49 proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
50 timer = Timer(timeout, kill, [proc])
51 try:
52 timer.start()
53 stdout, stderr = proc.communicate()
54 finally:
55 timer.cancel()
56 return stdout if return_stdout else proc.returncode
57 else:
58 if return_stdout:
59 return subprocess.check_output(cmd)
60 return subprocess.call(cmd, stdout=stdout, stderr=stderr)
Mathias Ravdd6a6de2018-05-18 10:18:33 +020061
Ian Zerny0f5fc732018-11-15 14:34:41 +010062def run_in_tests(tool, args, build=None, debug=True, extra_args=None):
63 if build is None:
64 build, args = extract_build_from_args(args)
65 if build:
66 gradle.RunGradle([
67 'copyMavenDeps',
68 'compileTestJava',
69 ])
70 cmd = []
Ian Zerny3f54e222019-02-12 10:51:17 +010071 cmd.append(jdk.GetJavaExecutable())
Ian Zerny0f5fc732018-11-15 14:34:41 +010072 if extra_args:
73 cmd.extend(extra_args)
74 if debug:
75 cmd.append('-ea')
76 cmd.extend(['-cp', ':'.join([
77 utils.BUILD_MAIN_DIR,
78 utils.BUILD_TEST_DIR,
79 ] + glob.glob('%s/*.jar' % utils.BUILD_DEPS_DIR))])
80 cmd.extend([tool])
81 cmd.extend(args)
82 utils.PrintCmd(cmd)
83 return subprocess.call(cmd)
84
Mathias Ravdd6a6de2018-05-18 10:18:33 +020085def extract_build_from_args(input_args):
86 build = True
87 args = []
88 for arg in input_args:
89 if arg in ("--build", "--no-build"):
90 build = arg == "--build"
91 else:
92 args.append(arg)
93 return build, args
Søren Gjessec4e6a282018-10-04 12:37:03 +020094
95def extract_lib_from_args(input_args):
96 lib = None
97 args = []
98 for arg in input_args:
99 if arg == '--lib-android':
Søren Gjesse315b8252018-12-13 16:28:42 +0100100 lib = utils.get_android_jar(28)
Søren Gjessec4e6a282018-10-04 12:37:03 +0200101 elif arg == '--lib-java':
102 lib = utils.RT_JAR
103 else:
104 args.append(arg)
105 return lib, args