blob: 5d5c69ffed9b8c5aae6ab93ef040c36df2f483b6 [file] [log] [blame]
Søren Gjesse44faa872023-05-23 12:21:22 +02001#!/usr/bin/env python3
2# Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
3# for details. All rights reserved. Use of this source code is governed by a
4# BSD-style license that can be found in the LICENSE file.
5
6import argparse
7import os.path
Clément Béra148faa42023-09-14 09:26:45 +00008import shutil
Clément Béra77e6c122023-09-25 13:55:11 +02009import subprocess
Søren Gjesse44faa872023-05-23 12:21:22 +020010import sys
11
12import utils
13
Søren Gjesse4569e472023-10-25 15:15:17 +020014# The local_maven_repository_generator orders the repositories by name, so
Søren Gjesse10dd4272023-09-20 09:46:52 +020015# prefix with X- to control the order, as many dependencies are present
Søren Gjesse4569e472023-10-25 15:15:17 +020016# in several repositories. Save A- for additional local repository.
Søren Gjesse44faa872023-05-23 12:21:22 +020017REPOSITORIES = [
Søren Gjesse4569e472023-10-25 15:15:17 +020018 'B-Google=https://maven.google.com/',
19 'C-Maven Central=https://repo1.maven.org/maven2/',
20 "D-Gradle Plugins=https://plugins.gradle.org/m2/",
Søren Gjesse44faa872023-05-23 12:21:22 +020021]
22
23ANDRDID_SUPPORT_VERSION = '25.4.0'
Søren Gjesse2b98d662024-11-01 13:14:31 +010024ASM_VERSION = '9.7.1' # When updating update tools/asmifier.py and Toolhelper as well.
Søren Gjesse44faa872023-05-23 12:21:22 +020025ESPRESSO_VERSION = '3.0.0'
26FASTUTIL_VERSION = '7.2.1'
Clément Béra650f1d92025-02-04 13:20:47 +010027KOTLIN_METADATA_VERSION = '2.1.0'
Søren Gjessea8ca5842025-02-06 14:03:10 +010028KOTLIN_VERSION = '2.0.21'
Søren Gjesse80ae2c72023-10-26 12:04:01 +020029GUAVA_VERSION = '32.1.2-jre'
Søren Gjesse40db6da2023-08-11 08:04:19 +020030GSON_VERSION = '2.10.1'
Søren Gjesse44faa872023-05-23 12:21:22 +020031JAVASSIST_VERSION = '3.29.2-GA'
32JUNIT_VERSION = '4.13-beta-2'
33MOCKITO_VERSION = '2.10.0'
34SMALI_VERSION = '3.0.3'
35ERROR_PRONE_VERSION = '2.18.0'
36TESTNG_VERSION = '6.10'
37
Ian Zerny4c2fae02024-06-17 15:20:13 +020038# keepanno & resource shrinker dependencies
39PROTOBUF_VERSION = '3.19.3'
40
Rico Windbe22bff2023-07-03 13:40:21 +020041# Resource shrinker dependency versions
42AAPT2_PROTO_VERSION = '8.2.0-alpha10-10154469'
Rico Windb3c8c292024-04-10 14:00:58 +020043STUDIO_SDK_VERSION = '31.5.0-alpha04'
Søren Gjesse44faa872023-05-23 12:21:22 +020044
45BUILD_DEPENDENCIES = [
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020046 'com.google.code.gson:gson:{version}'.format(version=GSON_VERSION),
47 'com.google.guava:guava:{version}'.format(version=GUAVA_VERSION),
48 'it.unimi.dsi:fastutil:{version}'.format(version=FASTUTIL_VERSION),
Søren Gjesse80ae2c72023-10-26 12:04:01 +020049
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020050 'org.ow2.asm:asm:{version}'.format(version=ASM_VERSION),
51 'org.ow2.asm:asm-util:{version}'.format(version=ASM_VERSION),
52 'org.ow2.asm:asm-commons:{version}'.format(version=ASM_VERSION),
Søren Gjesse80ae2c72023-10-26 12:04:01 +020053
54 'com.google.errorprone:javac:9+181-r4173-1',
55
56 'com.android.tools.build:aapt2-proto:{version}'.format(
57 version=AAPT2_PROTO_VERSION),
58 'com.android.tools.layoutlib:layoutlib-api:{version}'.format(
59 version=STUDIO_SDK_VERSION),
60 'com.android.tools:common:{version}'.format(version=STUDIO_SDK_VERSION),
61 'com.android.tools:sdk-common:{version}'.format(version=STUDIO_SDK_VERSION),
62 'com.google.protobuf:protobuf-java:{version}'.format(
63 version=PROTOBUF_VERSION),
64
65 'org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:{version}'.format(
66 version=KOTLIN_VERSION),
67 'org.jetbrains.kotlin:kotlin-compiler-embeddable:{version}'.format(
68 version=KOTLIN_VERSION),
69 'org.jetbrains.kotlin:kotlin-gradle-plugin-api:{version}'.format(
70 version=KOTLIN_VERSION),
71 'org.jetbrains.kotlin:kotlin-gradle-plugin-idea:{version}'.format(
72 version=KOTLIN_VERSION),
73 'org.jetbrains.kotlin:kotlin-reflect:{version}'.format(
74 version=KOTLIN_VERSION),
75 'org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:{version}'.format(
76 version=KOTLIN_VERSION),
77 'org.jetbrains.kotlin:kotlin-script-runtime:{version}'.format(
78 version=KOTLIN_VERSION),
79 'org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:{version}'.format(
80 version=KOTLIN_VERSION),
81 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:{version}'.format(
82 version=KOTLIN_VERSION),
83 'org.jetbrains.kotlin:kotlin-tooling-core:{version}'.format(
84 version=KOTLIN_VERSION),
Søren Gjessea8ca5842025-02-06 14:03:10 +010085 'org.jetbrains.kotlin:kotlin-build-tools-impl:{version}'.format(
86 version=KOTLIN_VERSION),
Søren Gjessec922df42024-05-17 15:37:59 +020087 'org.jetbrains.kotlin:kotlin-metadata-jvm:{version}'.format(
Søren Gjesse80ae2c72023-10-26 12:04:01 +020088 version=KOTLIN_METADATA_VERSION),
Søren Gjesse44faa872023-05-23 12:21:22 +020089]
90
91TEST_DEPENDENCIES = [
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020092 'junit:junit:{version}'.format(version=JUNIT_VERSION),
93 'com.android.tools.smali:smali:{version}'.format(version=SMALI_VERSION),
94 'com.android.tools.smali:smali-util:{version}'.format(
95 version=SMALI_VERSION),
96 'com.google.errorprone:error_prone_core:{version}'.format(
97 version=ERROR_PRONE_VERSION),
98 'org.javassist:javassist:{version}'.format(version=JAVASSIST_VERSION),
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020099 'org.mockito:mockito-core:{version}'.format(version=MOCKITO_VERSION),
100 'org.testng:testng:{version}'.format(version=TESTNG_VERSION),
Søren Gjesse44faa872023-05-23 12:21:22 +0200101]
102
Søren Gjesse4569e472023-10-25 15:15:17 +0200103PLUGIN_DEPENDENCIES = [
Ian Zerny4c2fae02024-06-17 15:20:13 +0200104 'com.google.protobuf:protobuf-gradle-plugin:0.9.4',
Søren Gjessea8ca5842025-02-06 14:03:10 +0100105 'org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin:pom:5.1.2',
Søren Gjesse80ae2c72023-10-26 12:04:01 +0200106 'org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.10',
Søren Gjesse20a2ee22024-02-09 08:24:54 +0100107 'net.ltgt.errorprone:net.ltgt.errorprone.gradle.plugin:pom:3.0.1',
108 'org.spdx.sbom:org.spdx.sbom.gradle.plugin:pom:0.4.0',
Søren Gjesse4569e472023-10-25 15:15:17 +0200109 # See https://github.com/FasterXML/jackson-core/issues/999.
110 'ch.randelshofer:fastdoubleparser:0.8.0',
111]
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200112
Søren Gjesse44faa872023-05-23 12:21:22 +0200113def dependencies_tar(dependencies_path):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200114 return os.path.join(os.path.dirname(dependencies_path),
115 os.path.basename(dependencies_path) + '.tar.gz')
116
Søren Gjesse44faa872023-05-23 12:21:22 +0200117
118def dependencies_tar_sha1(dependencies_path):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200119 return os.path.join(os.path.dirname(dependencies_path),
120 os.path.basename(dependencies_path) + '.tar.gz.sha1')
121
Søren Gjesse44faa872023-05-23 12:21:22 +0200122
123def remove_local_maven_repository(dependencies_path):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200124 if os.path.exists(dependencies_path):
125 shutil.rmtree(dependencies_path)
126 tar = dependencies_tar(dependencies_path)
127 if os.path.exists(tar):
128 os.remove(tar)
129 sha1 = dependencies_tar_sha1(dependencies_path)
130 if os.path.exists(sha1):
131 os.remove(sha1)
Søren Gjesse44faa872023-05-23 12:21:22 +0200132
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200133
134def create_local_maven_repository(args, dependencies_path, repositories,
135 dependencies):
136 with utils.ChangedWorkingDirectory(args.studio):
137 cmd = [
138 os.path.join('tools', 'base', 'bazel', 'bazel'), 'run',
139 '//tools/base/bazel:local_maven_repository_generator_cli', '--',
140 '--repo-path', dependencies_path, '--fetch'
141 ]
142 for repository in repositories:
143 cmd.extend(['--remote-repo', repository])
144 for dependency in dependencies:
145 cmd.append(dependency)
146 subprocess.check_call(cmd)
147
Søren Gjesse44faa872023-05-23 12:21:22 +0200148
149def parse_options():
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200150 result = argparse.ArgumentParser(
151 description='Create local Maven repository woth dependencies')
152 result.add_argument(
153 '--studio',
154 metavar=('<path>'),
155 required=True,
156 help='Path to a studio-main checkout (to get the tool '
157 '//tools/base/bazel:local_maven_repository_generator_cli)')
Søren Gjesse4569e472023-10-25 15:15:17 +0200158 result.add_argument(
159 '--plugin-deps',
160 '--plugin_deps',
161 default=False,
162 action='store_true',
163 help='Build repository Gradle plugin dependncies')
164 result.add_argument(
165 '--include-maven-local',
166 '--include_maven_local',
167 metavar=('<path>'),
168 default=False,
169 help='Path to maven local repository to include as dependency source')
170 result.add_argument(
171 '--no-upload',
172 '--no_upload',
173 default=False,
174 action='store_true',
175 help="Don't upload to Google CLoud Storage")
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200176 return result.parse_args()
Søren Gjesse44faa872023-05-23 12:21:22 +0200177
178
Søren Gjesse4569e472023-10-25 15:15:17 +0200179def set_utime(path):
180 os.utime(path, (0, 0))
181 for root, dirs, files in os.walk(path):
182 for f in files:
183 os.utime(os.path.join(root, f), (0, 0))
184 for d in dirs:
185 os.utime(os.path.join(root, d), (0, 0))
186
Søren Gjesse44faa872023-05-23 12:21:22 +0200187def main():
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200188 args = parse_options()
Søren Gjesse44faa872023-05-23 12:21:22 +0200189
Søren Gjesse4569e472023-10-25 15:15:17 +0200190 repositories = REPOSITORIES
191 if args.include_maven_local:
192 # Add the local repository as the first for it to take precedence.
193 # Use A- prefix as current local_maven_repository_generator orderes by name.
194 repositories = ['A-Local=file://%s' % args.include_maven_local] + REPOSITORIES
Søren Gjesse44faa872023-05-23 12:21:22 +0200195
Søren Gjesse4569e472023-10-25 15:15:17 +0200196 dependencies = []
Søren Gjesse44faa872023-05-23 12:21:22 +0200197
Søren Gjesse4569e472023-10-25 15:15:17 +0200198 if args.plugin_deps:
199 dependencies_plugin_path = os.path.join(utils.THIRD_PARTY, 'dependencies_plugin')
200 remove_local_maven_repository(dependencies_plugin_path)
201 print("Downloading to " + dependencies_plugin_path)
202 create_local_maven_repository(
203 args, dependencies_plugin_path, repositories, PLUGIN_DEPENDENCIES)
204 set_utime(dependencies_plugin_path)
205 dependencies.append('dependencies_plugin')
206 else:
207 dependencies_path = os.path.join(utils.THIRD_PARTY, 'dependencies')
208 remove_local_maven_repository(dependencies_path)
209 print("Downloading to " + dependencies_path)
210 create_local_maven_repository(
211 args, dependencies_path, repositories, BUILD_DEPENDENCIES + TEST_DEPENDENCIES)
212 set_utime(dependencies_path)
213 dependencies.append('dependencies')
Søren Gjesse4569e472023-10-25 15:15:17 +0200214
215 upload_cmds = []
216 for dependency in dependencies:
217 upload_cmds.append([
218 'upload_to_google_storage.py',
219 '-a',
220 '--bucket',
221 'r8-deps',
222 dependency])
223
224 if not args.no_upload:
225 print("Uploading to Google Cloud Storage:")
226 with utils.ChangedWorkingDirectory(utils.THIRD_PARTY):
227 for cmd in upload_cmds:
228 subprocess.check_call(cmd)
229 else:
230 print("Not uploading to Google Cloud Storage. "
231 + "Run the following commands in %s to do so manually" % utils.THIRD_PARTY)
232 for cmd in upload_cmds:
233 print(" ".join(cmd))
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200234
Søren Gjesse44faa872023-05-23 12:21:22 +0200235
236if __name__ == '__main__':
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200237 sys.exit(main())