blob: e2f036619707a31e88dc38bc36947e882a6d5480 [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 Gjesse4ea95dc2023-10-26 15:23:34 +020024ASM_VERSION = '9.6' # 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'
Rico Wind4436e3f2023-12-18 08:52:26 +000027KOTLIN_METADATA_VERSION = '0.7.0'
Søren Gjesse80ae2c72023-10-26 12:04:01 +020028KOTLIN_VERSION = '1.9.0'
29GUAVA_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
Rico Windbe22bff2023-07-03 13:40:21 +020038# Resource shrinker dependency versions
39AAPT2_PROTO_VERSION = '8.2.0-alpha10-10154469'
40PROTOBUF_VERSION = '3.19.3'
Søren Gjesse80ae2c72023-10-26 12:04:01 +020041STUDIO_SDK_VERSION = '31.2.0-rc01'
Søren Gjesse44faa872023-05-23 12:21:22 +020042
43BUILD_DEPENDENCIES = [
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020044 'com.google.code.gson:gson:{version}'.format(version=GSON_VERSION),
45 'com.google.guava:guava:{version}'.format(version=GUAVA_VERSION),
46 'it.unimi.dsi:fastutil:{version}'.format(version=FASTUTIL_VERSION),
Søren Gjesse80ae2c72023-10-26 12:04:01 +020047
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020048 'org.ow2.asm:asm:{version}'.format(version=ASM_VERSION),
49 'org.ow2.asm:asm-util:{version}'.format(version=ASM_VERSION),
50 'org.ow2.asm:asm-commons:{version}'.format(version=ASM_VERSION),
Søren Gjesse80ae2c72023-10-26 12:04:01 +020051
52 'com.google.errorprone:javac:9+181-r4173-1',
53
54 'com.android.tools.build:aapt2-proto:{version}'.format(
55 version=AAPT2_PROTO_VERSION),
56 'com.android.tools.layoutlib:layoutlib-api:{version}'.format(
57 version=STUDIO_SDK_VERSION),
58 'com.android.tools:common:{version}'.format(version=STUDIO_SDK_VERSION),
59 'com.android.tools:sdk-common:{version}'.format(version=STUDIO_SDK_VERSION),
60 'com.google.protobuf:protobuf-java:{version}'.format(
61 version=PROTOBUF_VERSION),
62
63 'org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:{version}'.format(
64 version=KOTLIN_VERSION),
65 'org.jetbrains.kotlin:kotlin-compiler-embeddable:{version}'.format(
66 version=KOTLIN_VERSION),
67 'org.jetbrains.kotlin:kotlin-gradle-plugin-api:{version}'.format(
68 version=KOTLIN_VERSION),
69 'org.jetbrains.kotlin:kotlin-gradle-plugin-idea:{version}'.format(
70 version=KOTLIN_VERSION),
71 'org.jetbrains.kotlin:kotlin-reflect:{version}'.format(
72 version=KOTLIN_VERSION),
73 'org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:{version}'.format(
74 version=KOTLIN_VERSION),
75 'org.jetbrains.kotlin:kotlin-script-runtime:{version}'.format(
76 version=KOTLIN_VERSION),
77 'org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:{version}'.format(
78 version=KOTLIN_VERSION),
79 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:{version}'.format(
80 version=KOTLIN_VERSION),
81 'org.jetbrains.kotlin:kotlin-tooling-core:{version}'.format(
82 version=KOTLIN_VERSION),
83 'org.jetbrains.kotlinx:kotlinx-metadata-jvm:{version}'.format(
84 version=KOTLIN_METADATA_VERSION),
85 'org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin:4.1.3',
Søren Gjesse44faa872023-05-23 12:21:22 +020086]
87
88TEST_DEPENDENCIES = [
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020089 'junit:junit:{version}'.format(version=JUNIT_VERSION),
90 'com.android.tools.smali:smali:{version}'.format(version=SMALI_VERSION),
91 'com.android.tools.smali:smali-util:{version}'.format(
92 version=SMALI_VERSION),
93 'com.google.errorprone:error_prone_core:{version}'.format(
94 version=ERROR_PRONE_VERSION),
95 'org.javassist:javassist:{version}'.format(version=JAVASSIST_VERSION),
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020096 'org.mockito:mockito-core:{version}'.format(version=MOCKITO_VERSION),
97 'org.testng:testng:{version}'.format(version=TESTNG_VERSION),
Søren Gjesse44faa872023-05-23 12:21:22 +020098]
99
Søren Gjesse4569e472023-10-25 15:15:17 +0200100PLUGIN_DEPENDENCIES = [
Søren Gjesse80ae2c72023-10-26 12:04:01 +0200101 'org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin:4.1.0',
102 'org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.10',
103 'net.ltgt.errorprone:net.ltgt.errorprone.gradle.plugin:3.0.1',
Søren Gjesse50a858a2023-12-12 12:44:11 +0100104 'org.spdx.sbom:org.spdx.sbom.gradle.plugin:0.4.0',
Søren Gjesse4569e472023-10-25 15:15:17 +0200105 # See https://github.com/FasterXML/jackson-core/issues/999.
106 'ch.randelshofer:fastdoubleparser:0.8.0',
107]
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200108
Søren Gjesse44faa872023-05-23 12:21:22 +0200109def dependencies_tar(dependencies_path):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200110 return os.path.join(os.path.dirname(dependencies_path),
111 os.path.basename(dependencies_path) + '.tar.gz')
112
Søren Gjesse44faa872023-05-23 12:21:22 +0200113
114def dependencies_tar_sha1(dependencies_path):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200115 return os.path.join(os.path.dirname(dependencies_path),
116 os.path.basename(dependencies_path) + '.tar.gz.sha1')
117
Søren Gjesse44faa872023-05-23 12:21:22 +0200118
119def remove_local_maven_repository(dependencies_path):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200120 if os.path.exists(dependencies_path):
121 shutil.rmtree(dependencies_path)
122 tar = dependencies_tar(dependencies_path)
123 if os.path.exists(tar):
124 os.remove(tar)
125 sha1 = dependencies_tar_sha1(dependencies_path)
126 if os.path.exists(sha1):
127 os.remove(sha1)
Søren Gjesse44faa872023-05-23 12:21:22 +0200128
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200129
130def create_local_maven_repository(args, dependencies_path, repositories,
131 dependencies):
132 with utils.ChangedWorkingDirectory(args.studio):
133 cmd = [
134 os.path.join('tools', 'base', 'bazel', 'bazel'), 'run',
135 '//tools/base/bazel:local_maven_repository_generator_cli', '--',
136 '--repo-path', dependencies_path, '--fetch'
137 ]
138 for repository in repositories:
139 cmd.extend(['--remote-repo', repository])
140 for dependency in dependencies:
141 cmd.append(dependency)
142 subprocess.check_call(cmd)
143
Søren Gjesse44faa872023-05-23 12:21:22 +0200144
145def parse_options():
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200146 result = argparse.ArgumentParser(
147 description='Create local Maven repository woth dependencies')
148 result.add_argument(
149 '--studio',
150 metavar=('<path>'),
151 required=True,
152 help='Path to a studio-main checkout (to get the tool '
153 '//tools/base/bazel:local_maven_repository_generator_cli)')
Søren Gjesse4569e472023-10-25 15:15:17 +0200154 result.add_argument(
155 '--plugin-deps',
156 '--plugin_deps',
157 default=False,
158 action='store_true',
159 help='Build repository Gradle plugin dependncies')
160 result.add_argument(
161 '--include-maven-local',
162 '--include_maven_local',
163 metavar=('<path>'),
164 default=False,
165 help='Path to maven local repository to include as dependency source')
166 result.add_argument(
167 '--no-upload',
168 '--no_upload',
169 default=False,
170 action='store_true',
171 help="Don't upload to Google CLoud Storage")
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200172 return result.parse_args()
Søren Gjesse44faa872023-05-23 12:21:22 +0200173
174
Søren Gjesse4569e472023-10-25 15:15:17 +0200175def set_utime(path):
176 os.utime(path, (0, 0))
177 for root, dirs, files in os.walk(path):
178 for f in files:
179 os.utime(os.path.join(root, f), (0, 0))
180 for d in dirs:
181 os.utime(os.path.join(root, d), (0, 0))
182
Søren Gjesse44faa872023-05-23 12:21:22 +0200183def main():
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200184 args = parse_options()
Søren Gjesse44faa872023-05-23 12:21:22 +0200185
Søren Gjesse4569e472023-10-25 15:15:17 +0200186 repositories = REPOSITORIES
187 if args.include_maven_local:
188 # Add the local repository as the first for it to take precedence.
189 # Use A- prefix as current local_maven_repository_generator orderes by name.
190 repositories = ['A-Local=file://%s' % args.include_maven_local] + REPOSITORIES
Søren Gjesse44faa872023-05-23 12:21:22 +0200191
Søren Gjesse4569e472023-10-25 15:15:17 +0200192 dependencies = []
Søren Gjesse44faa872023-05-23 12:21:22 +0200193
Søren Gjesse4569e472023-10-25 15:15:17 +0200194 if args.plugin_deps:
195 dependencies_plugin_path = os.path.join(utils.THIRD_PARTY, 'dependencies_plugin')
196 remove_local_maven_repository(dependencies_plugin_path)
197 print("Downloading to " + dependencies_plugin_path)
198 create_local_maven_repository(
199 args, dependencies_plugin_path, repositories, PLUGIN_DEPENDENCIES)
200 set_utime(dependencies_plugin_path)
201 dependencies.append('dependencies_plugin')
202 else:
203 dependencies_path = os.path.join(utils.THIRD_PARTY, 'dependencies')
204 remove_local_maven_repository(dependencies_path)
205 print("Downloading to " + dependencies_path)
206 create_local_maven_repository(
207 args, dependencies_path, repositories, BUILD_DEPENDENCIES + TEST_DEPENDENCIES)
208 set_utime(dependencies_path)
209 dependencies.append('dependencies')
Søren Gjesse4569e472023-10-25 15:15:17 +0200210
211 upload_cmds = []
212 for dependency in dependencies:
213 upload_cmds.append([
214 'upload_to_google_storage.py',
215 '-a',
216 '--bucket',
217 'r8-deps',
218 dependency])
219
220 if not args.no_upload:
221 print("Uploading to Google Cloud Storage:")
222 with utils.ChangedWorkingDirectory(utils.THIRD_PARTY):
223 for cmd in upload_cmds:
224 subprocess.check_call(cmd)
225 else:
226 print("Not uploading to Google Cloud Storage. "
227 + "Run the following commands in %s to do so manually" % utils.THIRD_PARTY)
228 for cmd in upload_cmds:
229 print(" ".join(cmd))
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200230
Søren Gjesse44faa872023-05-23 12:21:22 +0200231
232if __name__ == '__main__':
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200233 sys.exit(main())