blob: 1e4ae4fe0982cd2cc94d41377b3790717e00b3f4 [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 Gjesse712400e2024-04-29 13:08:11 +020024ASM_VERSION = '9.7' # 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'
Søren Gjesse6cbc33f2024-03-07 16:36:35 +010027KOTLIN_METADATA_VERSION = '0.9.0'
Søren Gjessea076d562024-02-09 09:02:30 +010028KOTLIN_VERSION = '1.9.20'
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
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'
Rico Windb3c8c292024-04-10 14:00:58 +020041STUDIO_SDK_VERSION = '31.5.0-alpha04'
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),
Søren Gjesse44faa872023-05-23 12:21:22 +020085]
86
87TEST_DEPENDENCIES = [
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020088 'junit:junit:{version}'.format(version=JUNIT_VERSION),
89 'com.android.tools.smali:smali:{version}'.format(version=SMALI_VERSION),
90 'com.android.tools.smali:smali-util:{version}'.format(
91 version=SMALI_VERSION),
92 'com.google.errorprone:error_prone_core:{version}'.format(
93 version=ERROR_PRONE_VERSION),
94 'org.javassist:javassist:{version}'.format(version=JAVASSIST_VERSION),
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +020095 'org.mockito:mockito-core:{version}'.format(version=MOCKITO_VERSION),
96 'org.testng:testng:{version}'.format(version=TESTNG_VERSION),
Søren Gjesse44faa872023-05-23 12:21:22 +020097]
98
Søren Gjesse4569e472023-10-25 15:15:17 +020099PLUGIN_DEPENDENCIES = [
Søren Gjessea076d562024-02-09 09:02:30 +0100100 'org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin:pom:4.2.1',
Søren Gjesse80ae2c72023-10-26 12:04:01 +0200101 'org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.10',
Søren Gjesse20a2ee22024-02-09 08:24:54 +0100102 'net.ltgt.errorprone:net.ltgt.errorprone.gradle.plugin:pom:3.0.1',
103 'org.spdx.sbom:org.spdx.sbom.gradle.plugin:pom:0.4.0',
Søren Gjesse4569e472023-10-25 15:15:17 +0200104 # See https://github.com/FasterXML/jackson-core/issues/999.
105 'ch.randelshofer:fastdoubleparser:0.8.0',
106]
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200107
Søren Gjesse44faa872023-05-23 12:21:22 +0200108def dependencies_tar(dependencies_path):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200109 return os.path.join(os.path.dirname(dependencies_path),
110 os.path.basename(dependencies_path) + '.tar.gz')
111
Søren Gjesse44faa872023-05-23 12:21:22 +0200112
113def dependencies_tar_sha1(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.sha1')
116
Søren Gjesse44faa872023-05-23 12:21:22 +0200117
118def remove_local_maven_repository(dependencies_path):
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200119 if os.path.exists(dependencies_path):
120 shutil.rmtree(dependencies_path)
121 tar = dependencies_tar(dependencies_path)
122 if os.path.exists(tar):
123 os.remove(tar)
124 sha1 = dependencies_tar_sha1(dependencies_path)
125 if os.path.exists(sha1):
126 os.remove(sha1)
Søren Gjesse44faa872023-05-23 12:21:22 +0200127
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200128
129def create_local_maven_repository(args, dependencies_path, repositories,
130 dependencies):
131 with utils.ChangedWorkingDirectory(args.studio):
132 cmd = [
133 os.path.join('tools', 'base', 'bazel', 'bazel'), 'run',
134 '//tools/base/bazel:local_maven_repository_generator_cli', '--',
135 '--repo-path', dependencies_path, '--fetch'
136 ]
137 for repository in repositories:
138 cmd.extend(['--remote-repo', repository])
139 for dependency in dependencies:
140 cmd.append(dependency)
141 subprocess.check_call(cmd)
142
Søren Gjesse44faa872023-05-23 12:21:22 +0200143
144def parse_options():
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200145 result = argparse.ArgumentParser(
146 description='Create local Maven repository woth dependencies')
147 result.add_argument(
148 '--studio',
149 metavar=('<path>'),
150 required=True,
151 help='Path to a studio-main checkout (to get the tool '
152 '//tools/base/bazel:local_maven_repository_generator_cli)')
Søren Gjesse4569e472023-10-25 15:15:17 +0200153 result.add_argument(
154 '--plugin-deps',
155 '--plugin_deps',
156 default=False,
157 action='store_true',
158 help='Build repository Gradle plugin dependncies')
159 result.add_argument(
160 '--include-maven-local',
161 '--include_maven_local',
162 metavar=('<path>'),
163 default=False,
164 help='Path to maven local repository to include as dependency source')
165 result.add_argument(
166 '--no-upload',
167 '--no_upload',
168 default=False,
169 action='store_true',
170 help="Don't upload to Google CLoud Storage")
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200171 return result.parse_args()
Søren Gjesse44faa872023-05-23 12:21:22 +0200172
173
Søren Gjesse4569e472023-10-25 15:15:17 +0200174def set_utime(path):
175 os.utime(path, (0, 0))
176 for root, dirs, files in os.walk(path):
177 for f in files:
178 os.utime(os.path.join(root, f), (0, 0))
179 for d in dirs:
180 os.utime(os.path.join(root, d), (0, 0))
181
Søren Gjesse44faa872023-05-23 12:21:22 +0200182def main():
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200183 args = parse_options()
Søren Gjesse44faa872023-05-23 12:21:22 +0200184
Søren Gjesse4569e472023-10-25 15:15:17 +0200185 repositories = REPOSITORIES
186 if args.include_maven_local:
187 # Add the local repository as the first for it to take precedence.
188 # Use A- prefix as current local_maven_repository_generator orderes by name.
189 repositories = ['A-Local=file://%s' % args.include_maven_local] + REPOSITORIES
Søren Gjesse44faa872023-05-23 12:21:22 +0200190
Søren Gjesse4569e472023-10-25 15:15:17 +0200191 dependencies = []
Søren Gjesse44faa872023-05-23 12:21:22 +0200192
Søren Gjesse4569e472023-10-25 15:15:17 +0200193 if args.plugin_deps:
194 dependencies_plugin_path = os.path.join(utils.THIRD_PARTY, 'dependencies_plugin')
195 remove_local_maven_repository(dependencies_plugin_path)
196 print("Downloading to " + dependencies_plugin_path)
197 create_local_maven_repository(
198 args, dependencies_plugin_path, repositories, PLUGIN_DEPENDENCIES)
199 set_utime(dependencies_plugin_path)
200 dependencies.append('dependencies_plugin')
201 else:
202 dependencies_path = os.path.join(utils.THIRD_PARTY, 'dependencies')
203 remove_local_maven_repository(dependencies_path)
204 print("Downloading to " + dependencies_path)
205 create_local_maven_repository(
206 args, dependencies_path, repositories, BUILD_DEPENDENCIES + TEST_DEPENDENCIES)
207 set_utime(dependencies_path)
208 dependencies.append('dependencies')
Søren Gjesse4569e472023-10-25 15:15:17 +0200209
210 upload_cmds = []
211 for dependency in dependencies:
212 upload_cmds.append([
213 'upload_to_google_storage.py',
214 '-a',
215 '--bucket',
216 'r8-deps',
217 dependency])
218
219 if not args.no_upload:
220 print("Uploading to Google Cloud Storage:")
221 with utils.ChangedWorkingDirectory(utils.THIRD_PARTY):
222 for cmd in upload_cmds:
223 subprocess.check_call(cmd)
224 else:
225 print("Not uploading to Google Cloud Storage. "
226 + "Run the following commands in %s to do so manually" % utils.THIRD_PARTY)
227 for cmd in upload_cmds:
228 print(" ".join(cmd))
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200229
Søren Gjesse44faa872023-05-23 12:21:22 +0200230
231if __name__ == '__main__':
Christoffer Quist Adamsen2434a4d2023-10-16 11:29:03 +0200232 sys.exit(main())