blob: 881f6dcea205525c1d12ce57802f52469d344ab6 [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
Christoffer Quist Adamsend7a5b722022-02-24 18:12:02 +01006import time
Mathias Ravdd6a6de2018-05-18 10:18:33 +02007import subprocess
Jinseong Jeon158a3f12019-02-08 01:40:59 -08008from threading import Timer
Ian Zernye92325b2020-03-13 13:29:27 +01009
10import gradle
11import jdk
Mathias Ravdd6a6de2018-05-18 10:18:33 +020012import utils
13
Ian Zernye92325b2020-03-13 13:29:27 +010014
Mathias Ravdd6a6de2018-05-18 10:18:33 +020015def run(tool, args, build=None, debug=True,
Rico Wind5fdec152018-12-17 09:16:14 +010016 profile=False, track_memory_file=None, extra_args=None,
Søren Gjesse943389f2020-03-13 10:40:25 +010017 stderr=None, stdout=None, return_stdout=False, timeout=0, quiet=False,
Christoffer Quist Adamsend7a5b722022-02-24 18:12:02 +010018 cmd_prefix=None, jar=None, main=None, time_consumer=None):
Ian Zernye92325b2020-03-13 13:29:27 +010019 cmd = []
Søren Gjessec853feb2020-03-16 09:34:41 +010020 if cmd_prefix:
21 cmd.extend(cmd_prefix)
Mathias Ravdd6a6de2018-05-18 10:18:33 +020022 if build is None:
23 build, args = extract_build_from_args(args)
24 if build:
Tamas Keneza730a7e2018-12-10 15:02:28 +010025 gradle.RunGradle(['r8lib' if tool.startswith('r8lib') else 'r8'])
Mathias Ravdd6a6de2018-05-18 10:18:33 +020026 if track_memory_file:
27 cmd.extend(['tools/track_memory.sh', track_memory_file])
Ian Zerny3f54e222019-02-12 10:51:17 +010028 cmd.append(jdk.GetJavaExecutable())
Mathias Rav56df69d2018-06-07 12:38:21 +020029 if extra_args:
30 cmd.extend(extra_args)
Ian Zernyad5218a2021-01-21 16:07:58 +010031 agent, args = extract_debug_agent_from_args(args)
32 if agent:
33 cmd.append(
34 '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005')
Mathias Ravdd6a6de2018-05-18 10:18:33 +020035 if debug:
36 cmd.append('-ea')
37 if profile:
38 cmd.append('-agentlib:hprof=cpu=samples,interval=1,depth=8')
Christoffer Quist Adamsen870fa462020-12-15 10:50:54 +010039 if jar:
40 cmd.extend(['-cp', jar, main])
41 elif tool == 'r8lib-d8':
Søren Gjesse95becbf2018-12-11 08:48:00 +010042 cmd.extend(['-cp', utils.R8LIB_JAR, 'com.android.tools.r8.D8'])
Christoffer Quist Adamsen7ff14092021-04-15 11:48:12 +020043 elif tool == 'r8lib-l8':
44 cmd.extend(['-cp', utils.R8LIB_JAR, 'com.android.tools.r8.L8'])
Tamas Keneza730a7e2018-12-10 15:02:28 +010045 elif tool == 'r8lib-r8':
46 cmd.extend(['-cp', utils.R8LIB_JAR, 'com.android.tools.r8.R8'])
Søren Gjesse80e00482021-04-06 13:17:35 +020047 elif tool == 'r8lib-tracereferences':
48 cmd.extend(['-cp', utils.R8LIB_JAR, 'com.android.tools.r8.tracereferences.TraceReferences'])
Tamas Keneza730a7e2018-12-10 15:02:28 +010049 else:
Søren Gjesse95becbf2018-12-11 08:48:00 +010050 cmd.extend(['-jar', utils.R8_JAR, tool])
Søren Gjessec4e6a282018-10-04 12:37:03 +020051 lib, args = extract_lib_from_args(args)
52 if lib:
53 cmd.extend(["--lib", lib])
Mathias Ravdd6a6de2018-05-18 10:18:33 +020054 cmd.extend(args)
Morten Krogh-Jespersenae9557c2019-10-23 15:14:02 +020055 utils.PrintCmd(cmd, quiet=quiet)
Christoffer Quist Adamsend7a5b722022-02-24 18:12:02 +010056 start = time.time()
Jinseong Jeon158a3f12019-02-08 01:40:59 -080057 if timeout > 0:
58 kill = lambda process: process.kill()
59 proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
60 timer = Timer(timeout, kill, [proc])
61 try:
62 timer.start()
63 stdout, stderr = proc.communicate()
64 finally:
65 timer.cancel()
Christoffer Quist Adamsen4c6d15d2022-09-08 11:30:04 +020066 result = stdout.decode('utf-8') if return_stdout else proc.returncode
Jinseong Jeon158a3f12019-02-08 01:40:59 -080067 else:
Christoffer Quist Adamsend7a5b722022-02-24 18:12:02 +010068 result = (
Christoffer Quist Adamsen4c6d15d2022-09-08 11:30:04 +020069 subprocess.check_output(cmd).decode('utf-8')
Christoffer Quist Adamsend7a5b722022-02-24 18:12:02 +010070 if return_stdout
71 else subprocess.call(cmd, stdout=stdout, stderr=stderr))
72 duration = int((time.time() - start) * 1000)
73 if time_consumer:
74 time_consumer(duration)
75 return result
Mathias Ravdd6a6de2018-05-18 10:18:33 +020076
Ian Zerny0f5fc732018-11-15 14:34:41 +010077def run_in_tests(tool, args, build=None, debug=True, extra_args=None):
78 if build is None:
79 build, args = extract_build_from_args(args)
80 if build:
81 gradle.RunGradle([
82 'copyMavenDeps',
83 'compileTestJava',
84 ])
85 cmd = []
Ian Zerny3f54e222019-02-12 10:51:17 +010086 cmd.append(jdk.GetJavaExecutable())
Ian Zerny0f5fc732018-11-15 14:34:41 +010087 if extra_args:
88 cmd.extend(extra_args)
89 if debug:
90 cmd.append('-ea')
91 cmd.extend(['-cp', ':'.join([
92 utils.BUILD_MAIN_DIR,
93 utils.BUILD_TEST_DIR,
94 ] + glob.glob('%s/*.jar' % utils.BUILD_DEPS_DIR))])
95 cmd.extend([tool])
96 cmd.extend(args)
97 utils.PrintCmd(cmd)
98 return subprocess.call(cmd)
99
Mathias Ravdd6a6de2018-05-18 10:18:33 +0200100def extract_build_from_args(input_args):
101 build = True
102 args = []
103 for arg in input_args:
104 if arg in ("--build", "--no-build"):
105 build = arg == "--build"
106 else:
107 args.append(arg)
108 return build, args
Søren Gjessec4e6a282018-10-04 12:37:03 +0200109
110def extract_lib_from_args(input_args):
111 lib = None
112 args = []
113 for arg in input_args:
114 if arg == '--lib-android':
Søren Gjesse315b8252018-12-13 16:28:42 +0100115 lib = utils.get_android_jar(28)
Søren Gjessec4e6a282018-10-04 12:37:03 +0200116 elif arg == '--lib-java':
117 lib = utils.RT_JAR
118 else:
119 args.append(arg)
120 return lib, args
Ian Zernyad5218a2021-01-21 16:07:58 +0100121
122def extract_debug_agent_from_args(input_args):
123 agent = False
124 args = []
125 for arg in input_args:
126 if arg in ('--debug-agent', '--debug_agent'):
127 agent = True
128 else:
129 args.append(arg)
130 return agent, args