blob: f08fd49e41e8cdf84c7726e5a24d1ef471e0e577 [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 Adamsen65ef2982023-08-24 08:45:39 +020018 cmd_prefix=None, jar=None, main=None, time_consumer=None,
Christoffer Quist Adamsena6f47982023-09-13 13:05:17 +020019 debug_agent=None, worker_id=None):
Ian Zernye92325b2020-03-13 13:29:27 +010020 cmd = []
Søren Gjessec853feb2020-03-16 09:34:41 +010021 if cmd_prefix:
22 cmd.extend(cmd_prefix)
Mathias Ravdd6a6de2018-05-18 10:18:33 +020023 if build is None:
24 build, args = extract_build_from_args(args)
25 if build:
Tamas Keneza730a7e2018-12-10 15:02:28 +010026 gradle.RunGradle(['r8lib' if tool.startswith('r8lib') else 'r8'])
Mathias Ravdd6a6de2018-05-18 10:18:33 +020027 if track_memory_file:
28 cmd.extend(['tools/track_memory.sh', track_memory_file])
Ian Zerny3f54e222019-02-12 10:51:17 +010029 cmd.append(jdk.GetJavaExecutable())
Mathias Rav56df69d2018-06-07 12:38:21 +020030 if extra_args:
31 cmd.extend(extra_args)
Christoffer Quist Adamsena6f47982023-09-13 13:05:17 +020032 if debug_agent is None:
33 debug_agent, args = extract_debug_agent_from_args(args)
34 if debug_agent:
Ian Zernyad5218a2021-01-21 16:07:58 +010035 cmd.append(
36 '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005')
Mathias Ravdd6a6de2018-05-18 10:18:33 +020037 if debug:
38 cmd.append('-ea')
39 if profile:
40 cmd.append('-agentlib:hprof=cpu=samples,interval=1,depth=8')
Christoffer Quist Adamsen870fa462020-12-15 10:50:54 +010041 if jar:
42 cmd.extend(['-cp', jar, main])
43 elif tool == 'r8lib-d8':
Søren Gjesse95becbf2018-12-11 08:48:00 +010044 cmd.extend(['-cp', utils.R8LIB_JAR, 'com.android.tools.r8.D8'])
Christoffer Quist Adamsen7ff14092021-04-15 11:48:12 +020045 elif tool == 'r8lib-l8':
46 cmd.extend(['-cp', utils.R8LIB_JAR, 'com.android.tools.r8.L8'])
Tamas Keneza730a7e2018-12-10 15:02:28 +010047 elif tool == 'r8lib-r8':
48 cmd.extend(['-cp', utils.R8LIB_JAR, 'com.android.tools.r8.R8'])
Søren Gjesse80e00482021-04-06 13:17:35 +020049 elif tool == 'r8lib-tracereferences':
50 cmd.extend(['-cp', utils.R8LIB_JAR, 'com.android.tools.r8.tracereferences.TraceReferences'])
Tamas Keneza730a7e2018-12-10 15:02:28 +010051 else:
Søren Gjesse95becbf2018-12-11 08:48:00 +010052 cmd.extend(['-jar', utils.R8_JAR, tool])
Søren Gjessec4e6a282018-10-04 12:37:03 +020053 lib, args = extract_lib_from_args(args)
54 if lib:
55 cmd.extend(["--lib", lib])
Mathias Ravdd6a6de2018-05-18 10:18:33 +020056 cmd.extend(args)
Christoffer Quist Adamsen65ef2982023-08-24 08:45:39 +020057 utils.PrintCmd(cmd, quiet=quiet, worker_id=worker_id)
Christoffer Quist Adamsend7a5b722022-02-24 18:12:02 +010058 start = time.time()
Jinseong Jeon158a3f12019-02-08 01:40:59 -080059 if timeout > 0:
60 kill = lambda process: process.kill()
61 proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
62 timer = Timer(timeout, kill, [proc])
63 try:
64 timer.start()
65 stdout, stderr = proc.communicate()
66 finally:
67 timer.cancel()
Christoffer Quist Adamsen4c6d15d2022-09-08 11:30:04 +020068 result = stdout.decode('utf-8') if return_stdout else proc.returncode
Jinseong Jeon158a3f12019-02-08 01:40:59 -080069 else:
Christoffer Quist Adamsend7a5b722022-02-24 18:12:02 +010070 result = (
Christoffer Quist Adamsen4c6d15d2022-09-08 11:30:04 +020071 subprocess.check_output(cmd).decode('utf-8')
Christoffer Quist Adamsend7a5b722022-02-24 18:12:02 +010072 if return_stdout
73 else subprocess.call(cmd, stdout=stdout, stderr=stderr))
74 duration = int((time.time() - start) * 1000)
75 if time_consumer:
76 time_consumer(duration)
77 return result
Mathias Ravdd6a6de2018-05-18 10:18:33 +020078
Ian Zerny0f5fc732018-11-15 14:34:41 +010079def run_in_tests(tool, args, build=None, debug=True, extra_args=None):
80 if build is None:
81 build, args = extract_build_from_args(args)
82 if build:
83 gradle.RunGradle([
84 'copyMavenDeps',
85 'compileTestJava',
86 ])
87 cmd = []
Ian Zerny3f54e222019-02-12 10:51:17 +010088 cmd.append(jdk.GetJavaExecutable())
Ian Zerny0f5fc732018-11-15 14:34:41 +010089 if extra_args:
90 cmd.extend(extra_args)
91 if debug:
92 cmd.append('-ea')
93 cmd.extend(['-cp', ':'.join([
94 utils.BUILD_MAIN_DIR,
95 utils.BUILD_TEST_DIR,
96 ] + glob.glob('%s/*.jar' % utils.BUILD_DEPS_DIR))])
97 cmd.extend([tool])
98 cmd.extend(args)
99 utils.PrintCmd(cmd)
100 return subprocess.call(cmd)
101
Mathias Ravdd6a6de2018-05-18 10:18:33 +0200102def extract_build_from_args(input_args):
103 build = True
104 args = []
105 for arg in input_args:
106 if arg in ("--build", "--no-build"):
107 build = arg == "--build"
108 else:
109 args.append(arg)
110 return build, args
Søren Gjessec4e6a282018-10-04 12:37:03 +0200111
112def extract_lib_from_args(input_args):
113 lib = None
114 args = []
115 for arg in input_args:
116 if arg == '--lib-android':
Søren Gjesse315b8252018-12-13 16:28:42 +0100117 lib = utils.get_android_jar(28)
Søren Gjessec4e6a282018-10-04 12:37:03 +0200118 elif arg == '--lib-java':
119 lib = utils.RT_JAR
120 else:
121 args.append(arg)
122 return lib, args
Ian Zernyad5218a2021-01-21 16:07:58 +0100123
124def extract_debug_agent_from_args(input_args):
125 agent = False
126 args = []
127 for arg in input_args:
128 if arg in ('--debug-agent', '--debug_agent'):
129 agent = True
130 else:
131 args.append(arg)
132 return agent, args