blob: 20928ae9b84fa4823d9a9444bc2c20f3b7414c20 [file] [log] [blame]
Mads Ager418d1ca2017-05-22 09:35:49 +02001// Copyright (c) 2016, 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.
Ian Zerny5fffb0a2019-02-11 13:54:22 +01004
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +00005import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
Ian Zerny5fffb0a2019-02-11 13:54:22 +01006import net.ltgt.gradle.errorprone.CheckSeverity
Jean-Marie Henaff34d85f72017-06-14 10:32:04 +02007import org.gradle.internal.os.OperatingSystem
Ian Zernyb2d27c42019-02-20 09:09:41 +01008import tasks.DownloadDependency
Ivan Gavrilovic635c7e52017-12-01 15:10:45 +00009import tasks.GetJarsFromConfiguration
Stephan Herhut417a72a2017-07-18 10:38:30 +020010import utils.Utils
Mads Ager418d1ca2017-05-22 09:35:49 +020011
Ian Zerny5fffb0a2019-02-11 13:54:22 +010012buildscript {
13 repositories {
Rico Wind23a05112019-03-27 08:00:44 +010014 maven {
15 url 'http://storage.googleapis.com/r8-deps/maven_mirror/'
16 }
Ian Zerny5fffb0a2019-02-11 13:54:22 +010017 mavenCentral()
Ian Zerny5fffb0a2019-02-11 13:54:22 +010018 maven {
19 url "https://plugins.gradle.org/m2/"
20 }
Morten Krogh-Jespersen68cc4b62019-03-21 10:32:17 +010021 jcenter()
Ian Zerny5fffb0a2019-02-11 13:54:22 +010022 }
23 dependencies {
clementbera0bca05e2019-05-29 14:11:18 +020024 classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.2'
Ian Zerny5fffb0a2019-02-11 13:54:22 +010025 }
26}
27
28plugins {
29 id "net.ltgt.errorprone" version "0.7"
30}
31
32apply plugin: 'java'
33apply plugin: 'idea'
34
Sebastien Hertz143ed112018-02-13 14:26:41 +010035ext {
36 androidSupportVersion = '25.4.0'
clementbera45cea0a2019-04-09 09:26:57 +020037 asmVersion = '7.1'
Sebastien Hertz143ed112018-02-13 14:26:41 +010038 espressoVersion = '3.0.0'
39 fastutilVersion = '7.2.0'
40 guavaVersion = '23.0'
41 joptSimpleVersion = '4.6'
Mads Ager48dd79e2018-05-15 09:13:55 +020042 gsonVersion = '2.7'
Morten Krogh-Jespersen94ff6762019-03-20 14:45:23 +010043 junitVersion = '4.13-beta-2'
Jinseong Jeone11145f2018-12-13 10:57:29 -080044 mockitoVersion = '2.10.0'
Jinseong Jeon46146f42018-12-16 23:26:14 -080045 kotlinVersion = '1.3.11'
Jinseong Jeon20124782019-08-06 22:52:17 -070046 kotlinExtMetadataJVMVersion = '0.1.0'
Sebastien Hertz143ed112018-02-13 14:26:41 +010047 smaliVersion = '2.2b4'
Ian Zerny5fffb0a2019-02-11 13:54:22 +010048 errorproneVersion = '2.3.2'
clementbera4f9c2a92019-07-09 08:50:37 +020049 testngVersion = '6.10'
Sebastien Hertz143ed112018-02-13 14:26:41 +010050}
51
Mads Ager418d1ca2017-05-22 09:35:49 +020052apply from: 'copyAdditionalJctfCommonFiles.gradle'
53
54repositories {
Rico Wind23a05112019-03-27 08:00:44 +010055 maven {
56 url 'http://storage.googleapis.com/r8-deps/maven_mirror/'
57 }
Yohann Roussel126f6872017-08-03 16:25:32 +020058 maven { url 'https://maven.google.com' }
Mads Ager418d1ca2017-05-22 09:35:49 +020059 mavenCentral()
Morten Krogh-Jespersene45b0f92019-03-21 09:56:19 +010060 maven { url 'https://kotlin.bintray.com/kotlinx' }
Mads Ager418d1ca2017-05-22 09:35:49 +020061}
62
Jinseong Jeon05064e12018-07-03 00:21:12 -070063if (project.hasProperty('with_code_coverage')) {
64 apply plugin: 'jacoco'
65}
66
Mads Ager418d1ca2017-05-22 09:35:49 +020067// Custom source set for example tests and generated tests.
68sourceSets {
69 test {
70 java {
71 srcDirs = [
clementbera0fe940d2019-04-23 12:45:18 +020072 'src/test/java',
73 'build/generated/test/java',
74 ]
75 }
76 }
Yohann Rousselbb571622017-11-09 10:47:36 +010077 apiUsageSample {
78 java {
Mathias Rave3f3c522018-05-30 08:22:17 +020079 srcDirs = ['src/test/apiUsageSample', 'src/main/java']
80 include 'com/android/tools/apiusagesample/*.java'
81 include 'com/android/tools/r8/BaseCompilerCommandParser.java'
82 include 'com/android/tools/r8/D8CommandParser.java'
83 include 'com/android/tools/r8/R8CommandParser.java'
84 include 'com/android/tools/r8/utils/FlagFile.java'
Yohann Rousselbb571622017-11-09 10:47:36 +010085 }
Yohann Rousselbb571622017-11-09 10:47:36 +010086 }
Morten Krogh-Jespersen7bc93dc2019-01-29 09:53:08 +010087 cfSegments {
88 java {
89 srcDirs = ['third_party/classlib/java', 'src/cf_segments/java']
90 }
91 output.resourcesDir = 'build/classes/cfSegments'
92 }
Mads Ager418d1ca2017-05-22 09:35:49 +020093 debugTestResources {
94 java {
95 srcDirs = ['src/test/debugTestResources']
96 }
97 output.resourcesDir = 'build/classes/debugTestResources'
98 }
Sebastien Hertz964c5c22017-05-23 15:22:23 +020099 debugTestResourcesJava8 {
100 java {
101 srcDirs = ['src/test/debugTestResourcesJava8']
102 }
103 output.resourcesDir = 'build/classes/debugTestResourcesJava8'
104 }
Sebastien Hertz1d7702b2017-08-18 09:07:27 +0200105 debugTestResourcesKotlin {
106 java {
107 srcDirs = ['src/test/debugTestResourcesKotlin']
108 }
109 output.resourcesDir = 'build/classes/debugTestResourcesKotlin'
110 }
Mads Ager418d1ca2017-05-22 09:35:49 +0200111 examples {
112 java {
Ivan Gavrilovic664f34d2018-11-09 10:02:40 -0800113 srcDirs = ['src/test/examples']
Mads Ager418d1ca2017-05-22 09:35:49 +0200114 }
115 output.resourcesDir = 'build/classes/examples'
116 }
Ian Zernyd3020482019-04-25 07:05:04 +0200117 examplesJava9 {
118 java {
clementbera0bdd90f2019-07-06 11:15:23 +0200119 srcDirs = ['src/test/examplesJava9']
Ian Zernyd3020482019-04-25 07:05:04 +0200120 }
121 }
122 examplesJava11 {
123 java {
clementbera0bdd90f2019-07-06 11:15:23 +0200124 srcDirs = ['src/test/examplesJava11']
125 }
126 }
clementbera4f9c2a92019-07-09 08:50:37 +0200127 jdk11TimeTests {
128 java {
129 srcDirs = [
130 'third_party/openjdk/jdk-11-test/java/time/tck',
131 'third_party/openjdk/jdk-11-test/java/time/test'
132 ]
133 exclude '**/TestZoneTextPrinterParser.java'
134 }
135 }
clementberaefa10522019-07-11 11:20:46 +0200136 examplesTestNGRunner {
clementbera4f9c2a92019-07-09 08:50:37 +0200137 java {
138 srcDirs = ['src/test/testngrunner']
139 }
140 }
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +0100141 examplesKotlin {
142 java {
143 srcDirs = ['src/test/examplesKotlin']
144 }
145 output.resourcesDir = 'build/classes/examplesKotlin'
146 }
Mads Ager418d1ca2017-05-22 09:35:49 +0200147 examplesAndroidN {
148 java {
149 srcDirs = ['src/test/examplesAndroidN']
150 }
151 output.resourcesDir = 'build/classes/examplesAndroidN'
152 }
153 examplesAndroidO {
154 java {
155 srcDirs = ['src/test/examplesAndroidO']
156 }
157 output.resourcesDir = 'build/classes/examplesAndroidO'
158 }
Mikaël Peltier7b7b53a2017-10-09 13:33:21 +0200159 examplesAndroidP {
160 java {
161 srcDirs = ['src/test/examplesAndroidP']
162 }
163 output.resourcesDir = 'build/classes/examplesAndroidP'
164 }
Christoffer Quist Adamsen74288f02019-06-14 12:30:17 +0200165 examplesProto {
166 java {
167 srcDirs = ['src/test/examplesProto']
168 }
Christoffer Quist Adamsen5d398fe2019-06-14 15:00:14 +0200169 compileClasspath = files("third_party/protobuf-lite/libprotobuf_lite.jar")
170 compileClasspath += fileTree(dir: "build/generated/test/proto", include: "*.jar")
Christoffer Quist Adamsen74288f02019-06-14 12:30:17 +0200171 output.resourcesDir = 'build/classes/examplesProto'
172 }
Mads Ager418d1ca2017-05-22 09:35:49 +0200173 jctfCommon {
174 java {
175 srcDirs = [
176 'third_party/jctf/Harness/src',
177 'third_party/jctf/LibTests/src/com/google/jctf/test/categories',
178 'third_party/jctf/LibTests/src/com/google/jctf/test/helper',
179 'third_party/jctf/LibTests/src/com/google/jctf/testHelpers',
180 'third_party/jctf/LibTests/src/org',
181 'build/additionalJctfCommonFiles'
182 ]
183 }
184 resources {
185 srcDirs = ['third_party/jctf/LibTests/resources']
186 }
187 }
188 jctfTests {
189 java {
190 srcDirs = [
191 'third_party/jctf/LibTests/src/com/google/jctf/test/lib',
192 // 'third_party/jctf/VMTests/src',
193 ]
194 }
195 }
Sebastien Hertzd3313772018-01-16 14:12:37 +0100196 kotlinR8TestResources {
197 java {
198 srcDirs = ['src/test/kotlinR8TestResources']
199 }
200 output.resourcesDir = 'build/classes/kotlinR8TestResources'
201 }
Mads Ager418d1ca2017-05-22 09:35:49 +0200202}
203
Ivan Gavrilovic22790f32018-11-07 17:34:38 -0800204// Ensure importing into IntelliJ IDEA use the same output directories as Gradle. In tests we
205// use the output path for tests (ultimately through ToolHelper.getClassPathForTests()) and
206// therefore these paths need to be the same. See https://youtrack.jetbrains.com/issue/IDEA-175172
207// for context.
208idea {
209 sourceSets.all { SourceSet sources ->
210 module {
211 if (sources.name == "main") {
212 sourceDirs += sources.java.srcDirs
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100213 outputDir sources.output.classesDirs[0]
Ivan Gavrilovic22790f32018-11-07 17:34:38 -0800214 } else {
215 testSourceDirs += sources.java.srcDirs
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100216 testOutputDir sources.output.classesDirs[0]
Ivan Gavrilovic22790f32018-11-07 17:34:38 -0800217 }
218 }
219 }
220}
221
Yohann Roussel126f6872017-08-03 16:25:32 +0200222configurations {
223 supportLibs
224}
225
Mads Ager418d1ca2017-05-22 09:35:49 +0200226dependencies {
Mads Agerd1d0da92018-12-10 13:56:50 +0100227 implementation "net.sf.jopt-simple:jopt-simple:$joptSimpleVersion"
228 implementation "com.google.code.gson:gson:$gsonVersion"
Mads Ager0aa48052017-09-15 12:39:15 +0200229 // Include all of guava when compiling the code, but exclude annotations that we don't
230 // need from the packaging.
Sebastien Hertz143ed112018-02-13 14:26:41 +0100231 compileOnly("com.google.guava:guava:$guavaVersion")
Mads Agerd1d0da92018-12-10 13:56:50 +0100232 implementation("com.google.guava:guava:$guavaVersion", {
Mads Ager0aa48052017-09-15 12:39:15 +0200233 exclude group: 'com.google.errorprone'
234 exclude group: 'com.google.code.findbugs'
235 exclude group: 'com.google.j2objc'
236 exclude group: 'org.codehaus.mojo'
237 })
Mads Agerd1d0da92018-12-10 13:56:50 +0100238 implementation group: 'it.unimi.dsi', name: 'fastutil', version: fastutilVersion
239 implementation "org.jetbrains.kotlinx:kotlinx-metadata-jvm:$kotlinExtMetadataJVMVersion"
240 implementation group: 'org.ow2.asm', name: 'asm', version: asmVersion
241 implementation group: 'org.ow2.asm', name: 'asm-commons', version: asmVersion
242 implementation group: 'org.ow2.asm', name: 'asm-tree', version: asmVersion
243 implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
244 implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
clementbera4f9c2a92019-07-09 08:50:37 +0200245 jdk11TimeTestsCompile group: 'org.testng', name: 'testng', version: testngVersion
clementberaefa10522019-07-11 11:20:46 +0200246 examplesTestNGRunnerCompile group: 'org.testng', name: 'testng', version: testngVersion
Mads Ager418d1ca2017-05-22 09:35:49 +0200247 testCompile sourceSets.examples.output
Sebastien Hertz143ed112018-02-13 14:26:41 +0100248 testCompile "junit:junit:$junitVersion"
249 testCompile group: 'org.smali', name: 'smali', version: smaliVersion
Mads Ager418d1ca2017-05-22 09:35:49 +0200250 testCompile files('third_party/jasmin/jasmin-2.4.jar')
251 testCompile files('third_party/jdwp-tests/apache-harmony-jdwp-tests-host.jar')
Jean-Marie Henaffce162f32017-10-04 10:39:27 +0200252 testCompile files('third_party/ddmlib/ddmlib.jar')
Sebastien Hertz143ed112018-02-13 14:26:41 +0100253 jctfCommonCompile "junit:junit:$junitVersion"
254 jctfTestsCompile "junit:junit:$junitVersion"
Mads Ager418d1ca2017-05-22 09:35:49 +0200255 jctfTestsCompile sourceSets.jctfCommon.output
Sebastien Hertz143ed112018-02-13 14:26:41 +0100256 examplesAndroidOCompile group: 'org.ow2.asm', name: 'asm', version: asmVersion
257 examplesAndroidPCompile group: 'org.ow2.asm', name: 'asm', version: asmVersion
Stephan Herhut52cb1022017-10-24 15:10:41 +0200258 // Import Guava for @Nullable annotation
Sebastien Hertz143ed112018-02-13 14:26:41 +0100259 examplesCompile "com.google.guava:guava:$guavaVersion"
Jinseong Jeone11145f2018-12-13 10:57:29 -0800260 examplesCompile "junit:junit:$junitVersion"
261 examplesCompile "org.mockito:mockito-core:$mockitoVersion"
Sebastien Hertz143ed112018-02-13 14:26:41 +0100262 supportLibs "com.android.support:support-v4:$androidSupportVersion"
263 supportLibs "junit:junit:$junitVersion"
264 supportLibs "com.android.support.test.espresso:espresso-core:$espressoVersion"
Yohann Rousselbb571622017-11-09 10:47:36 +0100265 apiUsageSampleCompile sourceSets.main.output
Tamas Kenezb865eee2018-12-03 16:50:45 +0100266 apiUsageSampleCompile "com.google.guava:guava:$guavaVersion"
Sebastien Hertz143ed112018-02-13 14:26:41 +0100267 debugTestResourcesKotlinCompileOnly "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
268 examplesKotlinCompileOnly "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
269 kotlinR8TestResourcesCompileOnly "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100270 errorprone("com.google.errorprone:error_prone_core:$errorproneVersion")
Stephan Herhut417a72a2017-07-18 10:38:30 +0200271}
272
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100273def r8LibPath = "$buildDir/libs/r8lib.jar"
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100274def r8LibExludeDepsPath = "$buildDir/libs/r8lib-exclude-deps.jar"
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100275def r8LibGeneratedKeepRulesPath = "$buildDir/generated/keep.txt"
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100276def r8LibGeneratedKeepRulesExcludeDepsPath = "$buildDir/generated/keep-exclude-deps.txt"
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +0100277def r8LibTestPath = "$buildDir/classes/r8libtest"
clementbera0bca05e2019-05-29 14:11:18 +0200278def java11ClassFiles = "build/classes/java/mainJava11"
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100279
Jean-Marie Henaff39587a82017-06-08 15:20:13 +0200280def osString = OperatingSystem.current().isLinux() ? "linux" :
281 OperatingSystem.current().isMacOsX() ? "mac" : "windows"
Mads Ager418d1ca2017-05-22 09:35:49 +0200282
283def cloudDependencies = [
284 "tests" : [
mikaelpeltierc2aa6652017-10-06 12:53:37 +0200285 "2017-10-04/art",
Rico Wind132bfb42019-03-08 09:27:36 +0100286 "2016-12-19/art"
Mads Ager418d1ca2017-05-22 09:35:49 +0200287 ],
288 "third_party": [
Rico Windf72fa152018-10-22 15:41:03 +0200289 "android_cts_baseline",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200290 "android_jar/lib-v14",
Stephan Herhutb3aca8b2017-12-22 14:14:53 +0100291 "android_jar/lib-v15",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200292 "android_jar/lib-v19",
293 "android_jar/lib-v21",
Stephan Herhutd48be0d2018-01-04 15:33:10 +0100294 "android_jar/lib-v22",
295 "android_jar/lib-v23",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200296 "android_jar/lib-v24",
297 "android_jar/lib-v25",
298 "android_jar/lib-v26",
Søren Gjessec2ffae82018-12-21 12:20:18 +0100299 "android_jar/lib-v27",
300 "android_jar/lib-v28",
Rico Windf72fa152018-10-22 15:41:03 +0200301 "core-lambda-stubs",
302 "dart-sdk",
303 "ddmlib",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200304 "gradle/gradle",
Morten Krogh-Jespersen72f5dff2018-10-12 15:27:39 +0200305 "jacoco",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200306 "jasmin",
307 "jctf",
Morten Krogh-Jespersen4187e162019-03-25 13:19:17 +0100308 "junit",
Rico Windf72fa152018-10-22 15:41:03 +0200309 "jdwp-tests",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200310 "kotlin",
Ian Zerny23942992019-07-10 14:33:52 +0200311 "kotlin-compiler-1.3.41",
Mathias Rav5285faf2018-03-20 14:16:32 +0100312 "openjdk/openjdk-rt-1.8",
Søren Gjesse952e1d52019-05-28 12:51:30 +0200313 "openjdk/desugar_jdk_libs",
clementbera8dbfeda2019-07-03 11:24:13 +0200314 "openjdk/jdk-11-test",
Rico Windf72fa152018-10-22 15:41:03 +0200315 "proguard/proguard5.2.1",
316 "proguard/proguard6.0.1",
Mathias Rav891831f2018-04-26 14:51:18 +0200317 "r8",
Mads Ager418d1ca2017-05-22 09:35:49 +0200318 ],
319 // All dex-vms have a fixed OS of Linux, as they are only supported on Linux, and will be run in a Docker
320 // container on other platforms where supported.
321 "tools" : [
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200322 "linux/art",
323 "linux/art-5.1.1",
324 "linux/art-6.0.1",
325 "linux/art-7.0.0",
Søren Gjesse1528c022018-11-23 15:14:05 +0100326 "linux/art-8.1.0",
Søren Gjessefe7c0112018-12-03 12:33:12 +0100327 "linux/art-9.0.0",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200328 "linux/dalvik",
Stephan Herhut02f0f9d2018-01-04 10:27:31 +0100329 "linux/dalvik-4.0.4",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200330 "${osString}/dx",
Mads Ager418d1ca2017-05-22 09:35:49 +0200331 ]
332]
333
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100334def cloudSystemDependencies = [
335 linux: [
clementbera81738ec2019-04-11 11:32:31 +0200336 "third_party": ["openjdk/openjdk-9.0.4/linux",
clementberab4fa18d2019-04-12 09:09:40 +0200337 "openjdk/jdk8/linux-x86",
338 "openjdk/jdk-11/Linux"],
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100339 ],
340 osx: [
clementbera81738ec2019-04-11 11:32:31 +0200341 "third_party": ["openjdk/openjdk-9.0.4/osx",
clementberab4fa18d2019-04-12 09:09:40 +0200342 "openjdk/jdk8/darwin-x86",
343 "openjdk/jdk-11/Mac"],
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100344 ],
345 windows: [
clementberab4fa18d2019-04-12 09:09:40 +0200346 "third_party": ["openjdk/openjdk-9.0.4/windows",
347 "openjdk/jdk-11/Windows"],
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100348 ],
349]
350
351if (OperatingSystem.current().isWindows()) {
352 cloudSystemDependencies.windows.each { entry ->
353 cloudDependencies.get(entry.key).addAll(entry.value)
354 }
355} else if (OperatingSystem.current().isLinux()) {
356 cloudSystemDependencies.linux.each { entry ->
357 cloudDependencies.get(entry.key).addAll(entry.value)
358 }
359} else if (OperatingSystem.current().isMacOsX()) {
360 cloudSystemDependencies.osx.each { entry ->
361 cloudDependencies.get(entry.key).addAll(entry.value)
362 }
363} else {
364 println "WARNING: Unsupported system: " + OperatingSystem.current()
365}
366
367def getDownloadDepsTaskName(entryKey, entryFile) {
368 return "download_deps_${entryKey}_${entryFile.replace('/', '_').replace('\\', '_')}"
369}
370
Ian Zernyb2d27c42019-02-20 09:09:41 +0100371def getFetchDepsTaskName(entryKey, entryFile) {
372 return "fetch_deps_${entryKey}_${entryFile.replace('/', '_').replace('\\', '_')}"
373}
374
Mads Ager418d1ca2017-05-22 09:35:49 +0200375cloudDependencies.each { entry ->
376 entry.value.each { entryFile ->
Ian Zernyb2d27c42019-02-20 09:09:41 +0100377 task "${getDownloadDepsTaskName(entry.key, entryFile)}"(type: DownloadDependency) {
378 type DownloadDependency.Type.GOOGLE_STORAGE
379 dependency "${entry.key}/${entryFile}"
Mads Ager418d1ca2017-05-22 09:35:49 +0200380 }
381 }
382}
383
384def x20Dependencies = [
385 "third_party": [
Rico Windc346c4a2018-10-23 08:04:16 +0200386 "benchmarks/kotlin-benches",
Jinseong Jeonb0c2dc02019-07-18 11:41:11 -0700387 "chrome/chrome_180917_ffbaa8",
Morten Krogh-Jespersen7bc93dc2019-01-29 09:53:08 +0100388 "classlib",
Morten Krogh-Jespersen480784d2019-02-05 08:10:46 +0100389 "cf_segments",
Rico Windf72fa152018-10-22 15:41:03 +0200390 "desugar/desugar_20180308",
Ian Zernybd2fdcc2019-03-22 13:57:21 +0100391 "internal/issue-127524985",
Rico Windf72fa152018-10-22 15:41:03 +0200392 "framework",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200393 "gmail/gmail_android_170604.16",
Søren Gjesseb552e842018-09-28 12:17:29 +0200394 "gmail/gmail_android_180826.15",
Rico Windf72fa152018-10-22 15:41:03 +0200395 "gmscore/gmscore_v10",
396 "gmscore/gmscore_v9",
397 "gmscore/latest",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200398 "gmscore/v4",
399 "gmscore/v5",
400 "gmscore/v6",
401 "gmscore/v7",
402 "gmscore/v8",
Christoffer Quist Adamsena2a58772018-10-03 09:47:46 +0200403 "nest/nest_20180926_7c6cfb",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200404 "photos/2017-06-06",
Rico Windf72fa152018-10-22 15:41:03 +0200405 "proguard/proguard_internal_159423826",
406 "proguardsettings",
Christoffer Quist Adamsen74288f02019-06-14 12:30:17 +0200407 "proto",
408 "protobuf-lite",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200409 "youtube/youtube.android_12.10",
410 "youtube/youtube.android_12.17",
411 "youtube/youtube.android_12.22",
Søren Gjessefe2de552018-09-24 16:31:10 +0200412 "youtube/youtube.android_13.37",
Rico Wind5acd2b62019-05-10 08:29:01 +0200413 "youtube/youtube.android_14.19"
Mads Ager418d1ca2017-05-22 09:35:49 +0200414 ],
415]
416
417x20Dependencies.each { entry ->
418 entry.value.each { entryFile ->
Ian Zernyb2d27c42019-02-20 09:09:41 +0100419 task "${getDownloadDepsTaskName(entry.key, entryFile)}"(type: DownloadDependency) {
420 type DownloadDependency.Type.X20
421 dependency "${entry.key}/${entryFile}"
Mads Ager418d1ca2017-05-22 09:35:49 +0200422 }
423 }
424}
425
Rico Wind897bb712017-05-23 10:44:29 +0200426task downloadProguard {
427 cloudDependencies.each { entry ->
428 entry.value.each { entryFile ->
429 if (entryFile.contains("proguard")) {
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100430 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Rico Wind897bb712017-05-23 10:44:29 +0200431 }
432 }
433 }
434}
435
Rico Windf6c74ce2018-12-04 08:50:55 +0100436task downloadOpenJDKrt {
437 cloudDependencies.each { entry ->
438 entry.value.each { entryFile ->
439 if (entryFile.contains("openjdk-rt")) {
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100440 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Rico Windf6c74ce2018-12-04 08:50:55 +0100441 }
442 }
443 }
444}
445
Tamas Kenez427205b2017-06-29 15:57:09 +0200446task downloadDx {
447 cloudDependencies.each { entry ->
448 entry.value.each { entryFile ->
Tamas Kenezcea7c202017-10-13 10:53:32 +0200449 if (entryFile.endsWith("/dx")) {
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100450 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Tamas Kenez427205b2017-06-29 15:57:09 +0200451 }
452 }
453 }
454}
455
Tamas Kenez0e10c562017-06-08 10:00:34 +0200456task downloadAndroidCts {
457 cloudDependencies.each { entry ->
458 entry.value.each { entryFile ->
459 if (entryFile.contains("android_cts_baseline")) {
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100460 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Tamas Kenez0e10c562017-06-08 10:00:34 +0200461 }
462 }
463 }
464}
465
Mads Ager418d1ca2017-05-22 09:35:49 +0200466task downloadDeps {
467 cloudDependencies.each { entry ->
468 entry.value.each { entryFile ->
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100469 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Mads Ager418d1ca2017-05-22 09:35:49 +0200470 }
471 }
472 if (!project.hasProperty('no_internal')) {
473 x20Dependencies.each { entry ->
474 entry.value.each { entryFile ->
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100475 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Mads Ager418d1ca2017-05-22 09:35:49 +0200476 }
477 }
478 }
479}
480
481allprojects {
482 sourceCompatibility = JavaVersion.VERSION_1_8
483 targetCompatibility = JavaVersion.VERSION_1_8
484}
485
Rico Wind266336c2019-02-25 10:11:38 +0100486// TODO(ricow): Remove debug prints
487println("NOTE: Current operating system: " + OperatingSystem.current())
488println("NOTE: Current operating system isWindows: " + OperatingSystem.current().isWindows())
489
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100490// Check if running with the JDK location from tools/jdk.py.
491if (OperatingSystem.current().isWindows()) {
492 println "NOTE: Running with JDK: " + org.gradle.internal.jvm.Jvm.current().javaHome
493} else {
494 def javaHomeOut = new StringBuilder()
495 def javaHomeErr = new StringBuilder()
496 def javaHomeProc = './tools/jdk.py'.execute()
497 javaHomeProc.waitForProcessOutput(javaHomeOut, javaHomeErr)
498 def jdkHome = new File(javaHomeOut.toString().trim())
499 if (!jdkHome.exists()) {
500 println "WARNING: Failed to find the ./tools/jdk.py specified JDK: " + jdkHome
501 } else if (jdkHome != org.gradle.internal.jvm.Jvm.current().javaHome) {
502 println("WARNING: Gradle is running in a non-pinned Java"
503 + ". Gradle Java Home: " + org.gradle.internal.jvm.Jvm.current().javaHome
504 + ". Expected: " + jdkHome)
Rico Wind266336c2019-02-25 10:11:38 +0100505 } else {
506 println("NOTE: Running with jdk from tools/jdk.py: " + jdkHome)
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100507 }
Mads Agerc7d14d32018-09-27 11:09:46 +0200508}
509
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100510sourceSets.configureEach { sourceSet ->
511 tasks.named(sourceSet.compileJavaTaskName).configure {
512 // Default disable errorprone (enabled and setup below).
513 options.errorprone.enabled = false
514 options.compilerArgs << '-Xlint:unchecked'
Ian Zerny09135aa2019-02-12 16:03:34 +0100515 // Run all compilation tasks in a forked subprocess.
516 options.fork = true
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100517 // Javac often runs out of stack space when compiling the tests.
518 // Increase the stack size for the javac process.
Ian Zerny09135aa2019-02-12 16:03:34 +0100519 options.forkOptions.jvmArgs << "-Xss4m"
Ian Zerny26307fb2019-03-06 15:18:17 +0100520 // Test compilation is sometimes hitting the default limit at 1g, increase it.
521 options.forkOptions.jvmArgs << "-Xmx2g"
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100522 // Set the bootclass path so compilation is consistent with 1.8 target compatibility.
523 options.forkOptions.jvmArgs << "-Xbootclasspath/a:third_party/openjdk/openjdk-rt-1.8/rt.jar"
524 }
Mads Ager418d1ca2017-05-22 09:35:49 +0200525}
526
Ian Zernyd3020482019-04-25 07:05:04 +0200527tasks.named(sourceSets.examplesJava9.compileJavaTaskName).get().configure {
528 def jdkDir = 'third_party/openjdk/openjdk-9.0.4/'
clementbera0fe940d2019-04-23 12:45:18 +0200529 options.fork = true
530 options.forkOptions.jvmArgs = []
531 if (OperatingSystem.current().isLinux()) {
Ian Zernyd3020482019-04-25 07:05:04 +0200532 options.forkOptions.javaHome = file(jdkDir + 'linux')
clementbera0fe940d2019-04-23 12:45:18 +0200533 } else if (OperatingSystem.current().isMacOsX()) {
Ian Zernyd3020482019-04-25 07:05:04 +0200534 options.forkOptions.javaHome = file(jdkDir + 'osx')
clementbera0fe940d2019-04-23 12:45:18 +0200535 } else {
Ian Zernyd3020482019-04-25 07:05:04 +0200536 options.forkOptions.javaHome = file(jdkDir + 'windows')
537 }
538 sourceCompatibility = JavaVersion.VERSION_1_9
539 targetCompatibility = JavaVersion.VERSION_1_9
540}
541
clementbera0bdd90f2019-07-06 11:15:23 +0200542def setJava11Compilation(sourceSet) {
543 tasks.named(sourceSet).get().configure {
544 def jdkDir = 'third_party/openjdk/jdk-11/'
545 options.fork = true
546 options.forkOptions.jvmArgs = []
547 if (OperatingSystem.current().isLinux()) {
548 options.forkOptions.javaHome = file(jdkDir + 'Linux')
549 } else if (OperatingSystem.current().isMacOsX()) {
550 options.forkOptions.javaHome = file(jdkDir + 'Mac/Contents/Home')
551 } else {
552 options.forkOptions.javaHome = file(jdkDir + 'Windows')
553 }
554 sourceCompatibility = JavaVersion.VERSION_11
555 targetCompatibility = JavaVersion.VERSION_11
clementbera0fe940d2019-04-23 12:45:18 +0200556 }
clementbera0fe940d2019-04-23 12:45:18 +0200557}
558
clementbera0bdd90f2019-07-06 11:15:23 +0200559setJava11Compilation(sourceSets.examplesJava11.compileJavaTaskName)
clementberaefa10522019-07-11 11:20:46 +0200560setJava11Compilation(sourceSets.examplesTestNGRunner.compileJavaTaskName)
clementbera4f9c2a92019-07-09 08:50:37 +0200561setJava11Compilation(sourceSets.jdk11TimeTests.compileJavaTaskName)
clementbera0bdd90f2019-07-06 11:15:23 +0200562
clementbera0bca05e2019-05-29 14:11:18 +0200563task compileMainWithJava11 (type: JavaCompile) {
564 def jdkDir = 'third_party/openjdk/jdk-11/'
565 options.fork = true
566 options.forkOptions.jvmArgs = []
567 if (OperatingSystem.current().isLinux()) {
568 options.forkOptions.javaHome = file(jdkDir + 'Linux')
569 } else if (OperatingSystem.current().isMacOsX()) {
Jake Whartona5204f32019-06-26 08:29:21 -0400570 options.forkOptions.javaHome = file(jdkDir + 'Mac/Contents/Home')
clementbera0bca05e2019-05-29 14:11:18 +0200571 } else {
572 options.forkOptions.javaHome = file(jdkDir + 'Windows')
573 }
574 source = sourceSets.main.allSource
575 destinationDir = file(java11ClassFiles)
576 sourceCompatibility = JavaVersion.VERSION_11
577 targetCompatibility = JavaVersion.VERSION_11
578 classpath = sourceSets.main.compileClasspath
579}
clementbera0fe940d2019-04-23 12:45:18 +0200580
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100581if (!project.hasProperty('without_error_prone') &&
582 // Don't enable error prone on Java 8 as the plugin setup does not support it.
583 !org.gradle.internal.jvm.Jvm.current().javaVersion.java8) {
Mikaël Peltierc9c1e8f2017-10-17 15:45:42 +0200584 compileJava {
585 // Enable error prone for D8/R8 sources.
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100586 options.errorprone.enabled = true
587 options.errorprone.disableAllChecks = true
588 options.errorprone.check('ClassCanBeStatic', CheckSeverity.ERROR)
589 options.errorprone.check('OperatorPrecedence', CheckSeverity.ERROR)
590 options.errorprone.check('RemoveUnusedImports', CheckSeverity.ERROR)
591 options.errorprone.check('MissingOverride', CheckSeverity.ERROR)
592 options.errorprone.check('IntLongMath', CheckSeverity.ERROR)
593 options.errorprone.check('EqualsHashCode', CheckSeverity.ERROR)
594 options.errorprone.check('InconsistentOverloads', CheckSeverity.ERROR)
595 options.errorprone.check('ArrayHashCode', CheckSeverity.ERROR)
596 options.errorprone.check('EqualsIncompatibleType', CheckSeverity.ERROR)
597 options.errorprone.check('NonOverridingEquals', CheckSeverity.ERROR)
598 options.errorprone.check('FallThrough', CheckSeverity.ERROR)
599 options.errorprone.check('MissingCasesInEnumSwitch', CheckSeverity.ERROR)
600 options.errorprone.check('MissingDefault', CheckSeverity.ERROR)
601 options.errorprone.check('MultipleTopLevelClasses', CheckSeverity.ERROR)
602 options.errorprone.check('NarrowingCompoundAssignment', CheckSeverity.ERROR)
603 options.errorprone.check('BoxedPrimitiveConstructor', CheckSeverity.ERROR)
604 options.errorprone.check('LogicalAssignment', CheckSeverity.ERROR)
605 options.errorprone.check('FloatCast', CheckSeverity.ERROR)
606 options.errorprone.check('ReturnValueIgnored', CheckSeverity.ERROR)
Mikaël Peltierc9c1e8f2017-10-17 15:45:42 +0200607 }
608}
609
Mads Ager418d1ca2017-05-22 09:35:49 +0200610compileJctfCommonJava {
611 dependsOn 'copyAdditionalJctfCommonFiles'
612 options.compilerArgs = ['-Xlint:none']
613}
614
615compileJctfTestsJava {
616 dependsOn 'jctfCommonClasses'
617 options.compilerArgs = ['-Xlint:none']
618}
619
Yohann Roussel7f47c032017-09-14 12:19:06 +0200620task consolidatedLicense {
Yohann Roussel7f47c032017-09-14 12:19:06 +0200621 def license = new File(new File(buildDir, 'generatedLicense'), 'LICENSE')
Mads Agerd1d0da92018-12-10 13:56:50 +0100622
Yohann Roussel7f47c032017-09-14 12:19:06 +0200623 inputs.files files('LICENSE', 'LIBRARY-LICENSE') + fileTree(dir: 'library-licensing')
Mads Agerd1d0da92018-12-10 13:56:50 +0100624 def runtimeClasspath = configurations.findByName("runtimeClasspath")
625 inputs.files { runtimeClasspath.getResolvedConfiguration().files }
626
Yohann Roussel7f47c032017-09-14 12:19:06 +0200627 outputs.files license
Mads Agerd1d0da92018-12-10 13:56:50 +0100628
Yohann Roussel7f47c032017-09-14 12:19:06 +0200629 doLast {
Mads Agerd1d0da92018-12-10 13:56:50 +0100630 def dependencies = []
631 runtimeClasspath.resolvedConfiguration.resolvedArtifacts.each {
632 def identifier = (ModuleComponentIdentifier) it.id.componentIdentifier
633 dependencies.add("${identifier.group}:${identifier.module}")
634 }
635 def libraryLicenses = file('LIBRARY-LICENSE').text
636 dependencies.each {
637 if (!libraryLicenses.contains("- artifact: $it")) {
638 throw new GradleException("No license for $it in LIBRARY_LICENSE")
639 }
640 }
641
Yohann Roussel7f47c032017-09-14 12:19:06 +0200642 license.getParentFile().mkdirs()
643 license.createNewFile()
644 license.text = "This file lists all licenses for code distributed.\n"
645 license.text += "All non-library code has the following 3-Clause BSD license.\n"
646 license.text += "\n"
647 license.text += "\n"
648 license.text += file('LICENSE').text
649 license.text += "\n"
650 license.text += "\n"
651 license.text += "Summary of distributed libraries:\n"
652 license.text += "\n"
Mads Agerd1d0da92018-12-10 13:56:50 +0100653 license.text += libraryLicenses
Yohann Roussel7f47c032017-09-14 12:19:06 +0200654 license.text += "\n"
655 license.text += "\n"
656 license.text += "Licenses details:\n"
657 fileTree(dir: 'library-licensing').getFiles().stream().sorted().forEach { file ->
658 license.text += "\n"
659 license.text += "\n"
660 license.text += file.text
661 }
662 }
663}
664
Morten Krogh-Jespersen00699af2018-10-09 10:54:42 +0200665static mergeServiceFiles(ShadowJar task) {
Jinseong Jeon40ceab02018-07-09 14:25:31 -0700666 // Everything under META-INF is not included by default.
667 // Should include before 'relocate' so that the service file path and its content
668 // are properly relocated as well.
669 task.mergeServiceFiles {
670 include 'META-INF/services/*'
671 }
Morten Krogh-Jespersen00699af2018-10-09 10:54:42 +0200672}
673
674static configureRelocations(ShadowJar task) {
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000675 task.relocate('com.google.common', 'com.android.tools.r8.com.google.common')
Mads Ager48dd79e2018-05-15 09:13:55 +0200676 task.relocate('com.google.gson', 'com.android.tools.r8.com.google.gson')
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000677 task.relocate('com.google.thirdparty', 'com.android.tools.r8.com.google.thirdparty')
678 task.relocate('joptsimple', 'com.android.tools.r8.joptsimple')
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000679 task.relocate('org.objectweb.asm', 'com.android.tools.r8.org.objectweb.asm')
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000680 task.relocate('it.unimi.dsi.fastutil', 'com.android.tools.r8.it.unimi.dsi.fastutil')
Søren Gjesse7c560852018-06-20 16:27:21 +0200681 task.relocate('kotlin', 'com.android.tools.r8.jetbrains.kotlin')
682 task.relocate('kotlinx', 'com.android.tools.r8.jetbrains.kotlinx')
683 task.relocate('org.jetbrains', 'com.android.tools.r8.org.jetbrains')
Søren Gjesse06ed1322018-06-21 11:15:07 +0200684 task.relocate('org.intellij', 'com.android.tools.r8.org.intellij')
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000685}
686
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100687task repackageDepsNoRelocate(type: ShadowJar) {
688 configurations = [project.configurations.runtimeClasspath]
689 mergeServiceFiles(it)
690 exclude { it.getRelativePath().getPathString() == "module-info.class" }
691 exclude { it.getRelativePath().getPathString().startsWith("META-INF/maven/") }
Morten Krogh-Jespersen54f196e2019-01-14 16:10:08 +0100692 baseName 'deps-not-relocated'
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100693}
694
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000695task repackageDeps(type: ShadowJar) {
Mads Ager64772812018-12-10 14:21:10 +0100696 configurations = [project.configurations.runtimeClasspath]
Morten Krogh-Jespersen00699af2018-10-09 10:54:42 +0200697 mergeServiceFiles(it)
698 if (!project.hasProperty('lib_no_relocate')) {
699 configureRelocations(it)
700 }
Ivan Gavrilovic2afc0cc2018-07-09 14:31:55 +0100701 exclude { it.getRelativePath().getPathString() == "module-info.class" }
Jinseong Jeon40ceab02018-07-09 14:25:31 -0700702 exclude { it.getRelativePath().getPathString().startsWith("META-INF/maven/") }
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000703 baseName 'deps'
704}
705
706task repackageSources(type: ShadowJar) {
Mads Ager418d1ca2017-05-22 09:35:49 +0200707 from sourceSets.main.output
Morten Krogh-Jespersen00699af2018-10-09 10:54:42 +0200708 mergeServiceFiles(it)
709 if (!project.hasProperty('lib_no_relocate')) {
710 configureRelocations(it)
711 }
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000712 baseName 'sources'
713}
714
clementbera0bca05e2019-05-29 14:11:18 +0200715task repackageSources11(type: ShadowJar) {
716 dependsOn compileMainWithJava11
717 from file(java11ClassFiles)
718 mergeServiceFiles(it)
719 if (!project.hasProperty('lib_no_relocate')) {
720 configureRelocations(it)
721 }
clementbera55e84822019-06-06 16:08:11 +0200722 baseName 'sources11'
clementbera0bca05e2019-05-29 14:11:18 +0200723}
724
Morten Krogh-Jespersen764f23a2018-12-10 15:47:11 +0100725task r8WithRelocatedDeps(type: ShadowJar) {
Morten Krogh-Jespersene47021f2018-10-10 11:08:23 +0200726 from consolidatedLicense.outputs.files
Morten Krogh-Jespersen764f23a2018-12-10 15:47:11 +0100727 baseName 'r8_with_relocated_deps'
Morten Krogh-Jespersene47021f2018-10-10 11:08:23 +0200728 classifier = null
729 version = null
730 manifest {
731 attributes 'Main-Class': 'com.android.tools.r8.SwissArmyKnife'
732 }
733 from repackageSources.outputs.files
Morten Krogh-Jespersen764f23a2018-12-10 15:47:11 +0100734 from repackageDeps.outputs.files
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100735 configureRelocations(it)
Ian Zerny80533c92019-01-24 10:32:09 +0100736 exclude "META-INF/*.kotlin_module"
Søren Gjesse09516862019-07-03 14:38:40 +0200737 exclude "**/*.kotlin_metadata"
Morten Krogh-Jespersene47021f2018-10-10 11:08:23 +0200738}
739
clementbera0bca05e2019-05-29 14:11:18 +0200740task r8WithRelocatedDeps11(type: ShadowJar) {
741 from consolidatedLicense.outputs.files
742 baseName 'r8_with_relocated_deps_11'
743 classifier = null
744 version = null
745 manifest {
746 attributes 'Main-Class': 'com.android.tools.r8.SwissArmyKnife'
747 }
748 from repackageSources11.outputs.files
749 from repackageDeps.outputs.files
750 configureRelocations(it)
751 exclude "META-INF/*.kotlin_module"
Søren Gjesse09516862019-07-03 14:38:40 +0200752 exclude "**/*.kotlin_metadata"
clementbera0bca05e2019-05-29 14:11:18 +0200753}
754
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100755task r8WithoutDeps(type: ShadowJar) {
756 from consolidatedLicense.outputs.files
757 baseName 'r8_without_deps'
758 classifier = null
759 version = null
760 manifest {
761 attributes 'Main-Class': 'com.android.tools.r8.SwissArmyKnife'
762 }
763 from sourceSets.main.output
764}
765
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000766task R8(type: ShadowJar) {
Yohann Roussel7f47c032017-09-14 12:19:06 +0200767 from consolidatedLicense.outputs.files
Mads Ager418d1ca2017-05-22 09:35:49 +0200768 baseName 'r8'
Mikaël Peltiere5e54722017-08-18 12:01:59 +0200769 classifier = null
770 version = null
Mads Ager418d1ca2017-05-22 09:35:49 +0200771 manifest {
Mathias Ravdd6a6de2018-05-18 10:18:33 +0200772 attributes 'Main-Class': 'com.android.tools.r8.SwissArmyKnife'
Mads Ager418d1ca2017-05-22 09:35:49 +0200773 }
774 // In order to build without dependencies, pass the exclude_deps property using:
775 // gradle -Pexclude_deps R8
776 if (!project.hasProperty('exclude_deps')) {
Gautam Korlamad356f22017-12-04 21:45:30 -0800777 from repackageSources.outputs.files
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000778 from repackageDeps.outputs.files
Gautam Korlamad356f22017-12-04 21:45:30 -0800779 } else {
780 from sourceSets.main.output
Mads Ager418d1ca2017-05-22 09:35:49 +0200781 }
Ian Zerny80533c92019-01-24 10:32:09 +0100782 exclude "META-INF/*.kotlin_module"
Søren Gjesse09516862019-07-03 14:38:40 +0200783 exclude "**/*.kotlin_metadata"
Mads Ager418d1ca2017-05-22 09:35:49 +0200784}
785
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100786task R8NoManifestNoDeps(type: ShadowJar) {
787 from consolidatedLicense.outputs.files
788 baseName 'r8nomanifest-exclude-deps'
789 classifier = null
790 version = null
791 from sourceSets.main.output
792}
793
Tamas Kenez8224fbc2018-12-10 09:57:56 +0100794task R8NoManifest(type: ShadowJar) {
795 from consolidatedLicense.outputs.files
796 baseName 'r8nomanifest'
797 classifier = null
798 version = null
799 // In order to build without dependencies, pass the exclude_deps property using:
800 // gradle -Pexclude_deps R8
801 if (!project.hasProperty('exclude_deps')) {
802 from repackageSources.outputs.files
803 from repackageDeps.outputs.files
804 } else {
805 from sourceSets.main.output
806 }
Ian Zerny80533c92019-01-24 10:32:09 +0100807 exclude "META-INF/*.kotlin_module"
Søren Gjesse09516862019-07-03 14:38:40 +0200808 exclude "**/*.kotlin_metadata"
Tamas Kenez8224fbc2018-12-10 09:57:56 +0100809}
810
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000811task D8(type: ShadowJar) {
Mathias Ravdd6a6de2018-05-18 10:18:33 +0200812 from R8.outputs.files
Mads Ager418d1ca2017-05-22 09:35:49 +0200813 baseName 'd8'
814 manifest {
mikaelpeltier80939312017-08-17 15:00:09 +0200815 attributes 'Main-Class': 'com.android.tools.r8.D8'
Mads Ager418d1ca2017-05-22 09:35:49 +0200816 }
Mads Ager418d1ca2017-05-22 09:35:49 +0200817}
818
Mathias Ravdd6a6de2018-05-18 10:18:33 +0200819task CompatDx(type: ShadowJar) {
820 from R8.outputs.files
Mads Ager418d1ca2017-05-22 09:35:49 +0200821 baseName 'compatdx'
822 manifest {
823 attributes 'Main-Class': 'com.android.tools.r8.compatdx.CompatDx'
824 }
Mads Ager418d1ca2017-05-22 09:35:49 +0200825}
826
Mathias Ravdd6a6de2018-05-18 10:18:33 +0200827task CompatProguard(type: ShadowJar) {
828 from R8.outputs.files
Søren Gjesse1d21da72017-09-01 12:05:38 +0200829 baseName 'compatproguard'
830 manifest {
831 attributes 'Main-Class': 'com.android.tools.r8.compatproguard.CompatProguard'
832 }
Lars Bak44cef522017-08-10 16:02:39 +0200833}
834
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100835def baseR8CommandLine(args = []) {
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100836 // Execute r8 commands against a stable r8 with relocated dependencies.
Rico Windcfb65512019-02-27 12:57:34 +0100837 return [org.gradle.internal.jvm.Jvm.current().getJavaExecutable(),
838 "-ea", "-jar", r8WithRelocatedDeps.outputs.files[0]] + args
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100839}
840
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100841def r8CfCommandLine(input, output, pgconf, args = [], libs = []) {
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100842 return baseR8CommandLine([
843 "--classfile", "--release",
844 input,
845 "--output", output,
846 "--pg-conf", pgconf,
847 "--pg-map-output", output + ".map",
848 "--lib", "third_party/openjdk/openjdk-rt-1.8/rt.jar"
849 ] + args + libs.collectMany { ["--lib", it] })
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100850}
851
852def r8LibCreateTask(name, pgConf, r8Task, output, args = [], libs = []) {
853 return tasks.create("r8Lib${name}", Exec) {
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100854 inputs.files ([pgConf, r8WithRelocatedDeps.outputs, r8Task.outputs])
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100855 outputs.file output
856 dependsOn downloadOpenJDKrt
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100857 dependsOn r8WithRelocatedDeps
858 dependsOn r8Task
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100859 commandLine r8CfCommandLine(r8Task.outputs.files[0], output, pgConf, args, libs)
860 workingDir = projectDir
861 }
862}
863
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100864task testJar(type: ShadowJar, dependsOn: testClasses) {
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100865 baseName = "r8tests"
866 from sourceSets.test.output
867}
868
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100869task testJarNoDeps(type: ShadowJar, dependsOn: testClasses) {
870 baseName = "r8tests-exclude-deps"
871 from sourceSets.test.output
872}
873
874def generateR8LibKeepRules(name, r8Source, testSource, output) {
875 return tasks.create("generateR8LibKeepRules_" + name, Exec) {
876 doFirst {
877 standardOutput new FileOutputStream(output)
878 }
879 dependsOn r8WithRelocatedDeps
880 dependsOn r8Source
881 dependsOn testSource
882 dependsOn downloadOpenJDKrt
883 inputs.files ([r8WithRelocatedDeps.outputs, r8Source.outputs, testSource.outputs])
884 outputs.file output
885 commandLine baseR8CommandLine([
886 "printuses",
887 "--keeprules",
888 "third_party/openjdk/openjdk-rt-1.8/rt.jar",
889 r8Source.outputs.files[0],
890 testSource.outputs.files[0]])
891 workingDir = projectDir
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100892 }
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100893}
894
Morten Krogh-Jespersencc5c7d02019-01-10 19:57:15 +0100895task R8LibApiOnly {
896 dependsOn r8LibCreateTask("Api", "src/main/keep.txt", R8NoManifest, r8LibPath)
897 outputs.file r8LibPath
898}
899
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +0100900task R8Lib {
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100901 def genRulesTask = generateR8LibKeepRules(
902 "Main",
903 R8NoManifest,
904 testJar,
905 r8LibGeneratedKeepRulesPath)
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100906 dependsOn r8LibCreateTask(
907 "Main",
908 "src/main/keep.txt",
909 R8NoManifest,
910 r8LibPath,
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100911 ["--pg-conf", genRulesTask.outputs.files[0]]
912 ).dependsOn(genRulesTask)
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +0100913 outputs.file r8LibPath
Tamas Kenezf960e9c2018-12-03 16:13:29 +0100914}
915
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100916task R8LibNoDeps {
917 def genRulesTask = generateR8LibKeepRules(
918 "NoDeps",
919 R8NoManifestNoDeps,
920 testJarNoDeps,
921 r8LibGeneratedKeepRulesExcludeDepsPath
922 )
923 dependsOn r8LibCreateTask(
924 "NoDeps",
925 "src/main/keep.txt",
926 R8NoManifestNoDeps,
927 r8LibExludeDepsPath,
928 ["--pg-conf", genRulesTask.outputs.files[0]],
929 repackageDepsNoRelocate.outputs.files
930 ).dependsOn(repackageDepsNoRelocate, genRulesTask)
931 outputs.file r8LibExludeDepsPath
932}
933
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +0100934task CompatDxLib {
935 dependsOn r8LibCreateTask(
936 "CompatDx", "src/main/keep-compatdx.txt", CompatDx, "build/libs/compatdxlib.jar")
Tamas Kenezf960e9c2018-12-03 16:13:29 +0100937}
938
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +0100939task CompatProguardLib {
940 dependsOn r8LibCreateTask(
941 "CompatPg",
942 "src/main/keep-compatproguard.txt",
943 CompatProguard,
944 "build/libs/compatproguardlib.jar")
Tamas Kenezf960e9c2018-12-03 16:13:29 +0100945}
946
Mads Ager418d1ca2017-05-22 09:35:49 +0200947task sourceJar(type: Jar, dependsOn: classes) {
948 classifier = 'src'
949 from sourceSets.main.allSource
950}
951
952task jctfCommonJar(type: Jar) {
953 from sourceSets.jctfCommon.output
954 baseName 'jctfCommon'
955}
956
957artifacts {
958 archives sourceJar
959}
960
961task createArtTests(type: Exec) {
962 def outputDir = "build/generated/test/java/com/android/tools/r8/art"
Mads Ager7e5bd722017-05-24 07:17:27 +0200963 def createArtTestsScript = "tools/create_art_tests.py"
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100964 inputs.files files("tests/2017-10-04/art.tar.gz", createArtTestsScript)
Mads Ager418d1ca2017-05-22 09:35:49 +0200965 outputs.dir outputDir
966 dependsOn downloadDeps
Mads Ager677e3002017-05-24 07:54:51 +0200967 commandLine "python", createArtTestsScript
Mads Ager418d1ca2017-05-22 09:35:49 +0200968 workingDir = projectDir
969}
970
971task createJctfTests(type: Exec) {
Stephan Herhutea6ee582017-05-23 13:14:34 +0200972 def outputDir = "build/generated/test/java/com/android/tools/r8/jctf"
Tamas Kenez25a99e92017-05-29 10:15:30 +0200973 def script = "tools/create_jctf_tests.py"
Mads Ager418d1ca2017-05-22 09:35:49 +0200974 inputs.file script
975 outputs.dir outputDir
976 dependsOn downloadDeps
Tamas Kenez25a99e92017-05-29 10:15:30 +0200977 commandLine "python", script
Mads Ager418d1ca2017-05-22 09:35:49 +0200978 workingDir = projectDir
979}
980
981compileTestJava {
982 dependsOn createArtTests
983 dependsOn createJctfTests
984}
985
Morten Krogh-Jespersen7bc93dc2019-01-29 09:53:08 +0100986task buildCfSegments(type: Jar, dependsOn: downloadDeps) {
987 from sourceSets.cfSegments.output
988 baseName 'cf_segments'
989 destinationDir file('build/libs')
990}
991
Ian Zernyee23a172018-01-03 09:08:48 +0100992task buildD8ApiUsageSample(type: Jar) {
993 from sourceSets.apiUsageSample.output
994 baseName 'd8_api_usage_sample'
995 destinationDir file('tests')
996}
997
Ian Zerny923a0c12018-01-03 10:59:18 +0100998task buildR8ApiUsageSample(type: Jar) {
999 from sourceSets.apiUsageSample.output
1000 baseName 'r8_api_usage_sample'
1001 destinationDir file('tests')
1002}
1003
Yohann Roussel548ae942018-01-05 11:13:28 +01001004task buildApiSampleJars {
Yohann Roussel548ae942018-01-05 11:13:28 +01001005 dependsOn buildD8ApiUsageSample
1006 dependsOn buildR8ApiUsageSample
1007}
1008
Mads Ager418d1ca2017-05-22 09:35:49 +02001009task buildDebugInfoExamplesDex {
1010 def examplesDir = file("src/test/java")
1011 def hostJar = "debuginfo_examples.jar"
1012 def hostDexJar = "debuginfo_examples_dex.jar"
1013 task "compile_debuginfo_examples"(type: JavaCompile) {
1014 source = fileTree(dir: examplesDir, include: "com/android/tools/r8/debuginfo/*Test.java")
1015 destinationDir = file("build/test/debuginfo_examples/classes")
1016 classpath = sourceSets.main.compileClasspath
1017 sourceCompatibility = JavaVersion.VERSION_1_7
1018 targetCompatibility = JavaVersion.VERSION_1_7
1019 options.compilerArgs += ["-Xlint:-options"]
1020 }
1021 task "jar_debuginfo_examples"(type: Jar, dependsOn: "compile_debuginfo_examples") {
1022 archiveName = hostJar
1023 destinationDir = file("build/test/")
1024 from "build/test/debuginfo_examples/classes"
1025 include "**/*.class"
1026 }
1027 task "dex_debuginfo_examples"(type: Exec,
1028 dependsOn: ["jar_debuginfo_examples", "downloadDeps"]) {
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001029 if (OperatingSystem.current().isWindows()) {
1030 executable file("tools/windows/dx/bin/dx.bat")
Jinseong Jeon35a1eff2017-09-24 23:28:08 -07001031 } else if (OperatingSystem.current().isMacOsX()) {
1032 executable file("tools/mac/dx/bin/dx");
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001033 } else {
1034 executable file("tools/linux/dx/bin/dx");
1035 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001036 args "--dex"
1037 args "--output=build/test/${hostDexJar}"
1038 args "build/test/${hostJar}"
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001039 inputs.files files("build/test/${hostJar}")
Mads Ager418d1ca2017-05-22 09:35:49 +02001040 outputs.file file("build/test/${hostDexJar}")
1041 }
1042 dependsOn dex_debuginfo_examples
1043}
1044
1045task buildDebugTestResourcesJars {
Mads Ager418d1ca2017-05-22 09:35:49 +02001046 def resourcesDir = file("src/test/debugTestResources")
1047 def hostJar = "debug_test_resources.jar"
1048 task "compile_debugTestResources"(type: JavaCompile) {
1049 source = fileTree(dir: resourcesDir, include: '**/*.java')
1050 destinationDir = file("build/test/debugTestResources/classes")
1051 classpath = sourceSets.main.compileClasspath
1052 sourceCompatibility = JavaVersion.VERSION_1_7
1053 targetCompatibility = JavaVersion.VERSION_1_7
1054 options.compilerArgs += ["-g", "-Xlint:-options"]
1055 }
1056 task "jar_debugTestResources"(type: Jar, dependsOn: "compile_debugTestResources") {
1057 archiveName = hostJar
1058 destinationDir = file("build/test/")
1059 from "build/test/debugTestResources/classes"
1060 include "**/*.class"
1061 }
Sebastien Hertz964c5c22017-05-23 15:22:23 +02001062 def java8ResourcesDir = file("src/test/debugTestResourcesJava8")
1063 def java8HostJar = "debug_test_resources_java8.jar"
1064 task "compile_debugTestResourcesJava8"(type: JavaCompile) {
1065 source = fileTree(dir: java8ResourcesDir, include: '**/*.java')
1066 destinationDir = file("build/test/debugTestResourcesJava8/classes")
1067 classpath = sourceSets.main.compileClasspath
1068 sourceCompatibility = JavaVersion.VERSION_1_8
1069 targetCompatibility = JavaVersion.VERSION_1_8
1070 options.compilerArgs += ["-g", "-Xlint:-options"]
1071 }
1072 task "jar_debugTestResourcesJava8"(type: Jar, dependsOn: "compile_debugTestResourcesJava8") {
1073 archiveName = java8HostJar
1074 destinationDir = file("build/test/")
1075 from "build/test/debugTestResourcesJava8/classes"
1076 include "**/*.class"
1077 }
Sebastien Hertz1d7702b2017-08-18 09:07:27 +02001078 def kotlinResourcesDir = file("src/test/debugTestResourcesKotlin")
Sebastien Hertz2ac9bac2018-01-15 16:33:44 +00001079 def kotlinHostJar = "debug_test_resources_kotlin.jar"
1080 task "jar_debugTestResourcesKotlin"(type: kotlin.Kotlinc) {
1081 source = fileTree(dir: kotlinResourcesDir, include: '**/*.kt')
1082 destination = file("build/test/${kotlinHostJar}")
Sebastien Hertz1d7702b2017-08-18 09:07:27 +02001083 }
Sebastien Hertz964c5c22017-05-23 15:22:23 +02001084 dependsOn downloadDeps
Mads Ager418d1ca2017-05-22 09:35:49 +02001085 dependsOn jar_debugTestResources
Sebastien Hertz964c5c22017-05-23 15:22:23 +02001086 dependsOn jar_debugTestResourcesJava8
Sebastien Hertz2ac9bac2018-01-15 16:33:44 +00001087 dependsOn jar_debugTestResourcesKotlin
Mads Ager418d1ca2017-05-22 09:35:49 +02001088}
1089
Søren Gjesse5b4ee0a2018-01-30 13:46:39 +01001090// Examples used by tests, where Android specific APIs are used.
1091task buildExampleAndroidApi(type: JavaCompile) {
1092 source = fileTree(dir: file("src/test/examplesAndroidApi"), include: "**/*.java")
1093 destinationDir = file("build/test/examplesAndroidApi/classes")
1094 classpath = files("third_party/android_jar/lib-v26/android.jar")
1095 sourceCompatibility = JavaVersion.VERSION_1_8
1096 targetCompatibility = JavaVersion.VERSION_1_8
1097}
1098
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001099task buildExampleKotlinJars {
1100 def kotlinSrcDir = file("src/test/examplesKotlin")
1101 kotlinSrcDir.eachDir { dir ->
Sebastien Hertz2ac9bac2018-01-15 16:33:44 +00001102 def name = dir.getName();
1103 dependsOn "compile_example_kotlin_${name}"
1104 task "compile_example_kotlin_${name}"(type: kotlin.Kotlinc) {
1105 source = fileTree(dir: file("src/test/examplesKotlin/${name}"), include: '**/*.kt')
1106 destination = file("build/test/examplesKotlin/${name}.jar")
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001107 }
1108 }
1109}
1110
Christoffer Quist Adamsen74288f02019-06-14 12:30:17 +02001111task buildProtoGeneratedSources {
1112 def examplesProtoDir = file("src/test/examplesProto")
1113 examplesProtoDir.eachDir { dir ->
1114 def name = dir.getName()
1115 task "compile_proto_generated_source_${name}"(type: JavaCompile) {
1116 source = {
1117 file('third_party/proto').listFiles()
1118 .findAll { it.name.startsWith(name) && it.name.endsWith('-src.jar') }
1119 .collect { zipTree(it) }
1120 }
1121 destinationDir = file("build/generated/test/proto/${name}_classes")
1122 classpath = files("third_party/protobuf-lite/libprotobuf_lite.jar")
1123 sourceCompatibility = JavaVersion.VERSION_1_8
1124 targetCompatibility = JavaVersion.VERSION_1_8
1125 }
1126 task "jar_proto_generated_source_${name}"(type: Jar, dependsOn: "compile_proto_generated_source_${name}") {
1127 archiveName = "${name}.jar"
1128 destinationDir = file("build/generated/test/proto")
1129 from "build/generated/test/proto/${name}_classes"
1130 include "/**/*.class"
1131 }
1132 dependsOn "jar_proto_generated_source_${name}"
1133 }
1134}
1135
1136task buildExamplesProto {
1137 def examplesProtoDir = file("src/test/examplesProto")
1138 def examplesProtoOutputDir = file("build/test/examplesProto");
1139 dependsOn buildProtoGeneratedSources
1140 task "compile_examples_proto"(type: JavaCompile) {
1141 source = fileTree(dir: examplesProtoDir, include: "**/*.java")
1142 destinationDir = file("build/test/examplesProto/classes")
Christoffer Quist Adamsen5d398fe2019-06-14 15:00:14 +02001143 classpath = files("third_party/protobuf-lite/libprotobuf_lite.jar")
1144 classpath += fileTree(dir: "build/generated/test/proto", include: "*.jar")
Christoffer Quist Adamsen74288f02019-06-14 12:30:17 +02001145 sourceCompatibility = JavaVersion.VERSION_1_8
1146 targetCompatibility = JavaVersion.VERSION_1_8
1147 }
1148 examplesProtoDir.eachDir { dir ->
1149 def name = dir.getName()
1150 task "jar_examples_proto_${name}"(type: Jar, dependsOn: "compile_examples_proto") {
1151 archiveName = "${name}.jar"
1152 destinationDir = examplesProtoOutputDir
1153 from "build/test/examplesProto/classes"
1154 include name + "/**/*.class"
1155 }
1156 dependsOn "jar_examples_proto_${name}"
1157 }
1158}
1159
Lars Bakc91e87e2017-08-18 08:53:10 +02001160// Proto lite generated code yields warnings when compiling with javac.
1161// We change the options passed to javac to ignore it.
1162compileExamplesJava.options.compilerArgs = ["-Xlint:none"]
1163
Søren Gjesse7320ce52018-05-07 15:45:22 +02001164
Mads Ager418d1ca2017-05-22 09:35:49 +02001165task buildExampleJars {
Rico Wind897bb712017-05-23 10:44:29 +02001166 dependsOn downloadProguard
Mads Ager418d1ca2017-05-22 09:35:49 +02001167 def examplesDir = file("src/test/examples")
Jean-Marie Henaff872e4422017-06-13 10:26:20 +02001168 def proguardScript
1169 if (OperatingSystem.current().isWindows()) {
1170 proguardScript = "third_party/proguard/proguard5.2.1/bin/proguard.bat"
1171 } else {
1172 proguardScript = "third_party/proguard/proguard5.2.1/bin/proguard.sh"
1173 }
Stephan Herhut417a72a2017-07-18 10:38:30 +02001174 task extractExamplesRuntime(type: Sync) {
1175 dependsOn configurations.examplesRuntime
Ivan Gavrilovic635c7e52017-12-01 15:10:45 +00001176 from { configurations.examplesRuntime.collect { zipTree(it) } }
Stephan Herhut417a72a2017-07-18 10:38:30 +02001177 include "**/*.class"
1178 includeEmptyDirs false
1179 into "$buildDir/runtime/examples/"
1180 }
1181
Søren Gjesse7320ce52018-05-07 15:45:22 +02001182 task "copy_examples_resources"(type: org.gradle.api.tasks.Copy) {
1183 from examplesDir
1184 exclude "**/*.java"
1185 exclude "**/keep-rules*.txt"
1186 into file("build/test/examples/classes")
1187 }
1188
1189 task "compile_examples"(type: JavaCompile) {
Søren Gjesse7320ce52018-05-07 15:45:22 +02001190 dependsOn "copy_examples_resources"
Rico Wind40fd2c12018-09-12 12:14:44 +02001191 source examplesDir
Stephan Herhut417a72a2017-07-18 10:38:30 +02001192 include "**/*.java"
Mads Ager418d1ca2017-05-22 09:35:49 +02001193 destinationDir = file("build/test/examples/classes")
Stephan Herhut417a72a2017-07-18 10:38:30 +02001194 classpath = sourceSets.examples.compileClasspath
Mads Ager418d1ca2017-05-22 09:35:49 +02001195 sourceCompatibility = JavaVersion.VERSION_1_7
1196 targetCompatibility = JavaVersion.VERSION_1_7
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001197 options.compilerArgs = ["-g:source,lines", "-Xlint:none"]
1198 }
Rico Wind40fd2c12018-09-12 12:14:44 +02001199 task "compile_examples_debuginfo_all"(type: JavaCompile) {
1200 source examplesDir
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001201 include "**/*.java"
1202 destinationDir = file("build/test/examples/classes_debuginfo_all")
1203 classpath = sourceSets.examples.compileClasspath
1204 sourceCompatibility = JavaVersion.VERSION_1_7
1205 targetCompatibility = JavaVersion.VERSION_1_7
1206 options.compilerArgs = ["-g", "-Xlint:none"]
1207 }
Rico Wind40fd2c12018-09-12 12:14:44 +02001208 task "compile_examples_debuginfo_none"(type: JavaCompile) {
1209 source examplesDir
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001210 include "**/*.java"
1211 destinationDir = file("build/test/examples/classes_debuginfo_none")
1212 classpath = sourceSets.examples.compileClasspath
1213 sourceCompatibility = JavaVersion.VERSION_1_7
1214 targetCompatibility = JavaVersion.VERSION_1_7
1215 options.compilerArgs = ["-g:none", "-Xlint:none"]
Mads Ager418d1ca2017-05-22 09:35:49 +02001216 }
1217 examplesDir.eachDir { dir ->
1218 def name = dir.getName();
1219 def exampleOutputDir = file("build/test/examples");
1220 def jarName = "${name}.jar"
1221 dependsOn "jar_example_${name}"
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001222 dependsOn "jar_example_${name}_debuginfo_all"
1223 dependsOn "jar_example_${name}_debuginfo_none"
Stephan Herhut417a72a2017-07-18 10:38:30 +02001224 dependsOn "extractExamplesRuntime"
1225 def runtimeDependencies = copySpec { }
Mads Ager418d1ca2017-05-22 09:35:49 +02001226 // The "throwing" test verifies debugging/stack info on the post-proguarded output.
1227 def proguardConfigPath = "${dir}/proguard.cfg"
1228 if (new File(proguardConfigPath).exists()) {
1229 task "pre_proguard_example_${name}"(type: Jar, dependsOn: "compile_examples") {
1230 archiveName = "${name}_pre_proguard.jar"
1231 destinationDir = exampleOutputDir
1232 from "build/test/examples/classes"
Stephan Herhut417a72a2017-07-18 10:38:30 +02001233 include name + "/**/*.class"
1234 with runtimeDependencies
1235 includeEmptyDirs false
Mads Ager418d1ca2017-05-22 09:35:49 +02001236 }
1237 def jarPath = files(tasks.getByPath("pre_proguard_example_${name}")).files.first();
1238 def proguardJarPath = "${exampleOutputDir}/${jarName}"
1239 def proguardMapPath = "${exampleOutputDir}/${name}/${name}.map"
1240 task "jar_example_${name}"(type: Exec, dependsOn: "pre_proguard_example_${name}") {
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001241 inputs.files files(
1242 tasks.getByPath("pre_proguard_example_${name}"),
1243 proguardConfigPath)
Mads Ager418d1ca2017-05-22 09:35:49 +02001244 // Enable these to get stdout and stderr redirected to files...
1245 // standardOutput = new FileOutputStream('proguard.stdout')
1246 // errorOutput = new FileOutputStream('proguard.stderr')
Jean-Marie Henaff872e4422017-06-13 10:26:20 +02001247 def proguardArguments = "-verbose -dontwarn java.** -injars ${jarPath}" +
Mads Ager418d1ca2017-05-22 09:35:49 +02001248 " -outjars ${proguardJarPath}" +
1249 " -include ${proguardConfigPath}" +
Jean-Marie Henaff872e4422017-06-13 10:26:20 +02001250 " -printmapping ${proguardMapPath}"
1251 if (OperatingSystem.current().isWindows()) {
1252 executable "${proguardScript}"
1253 args "${proguardArguments}"
1254 } else {
1255 executable "bash"
1256 args "-c", "${proguardScript} '${proguardArguments}'"
1257 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001258 outputs.file proguardJarPath
1259 }
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001260 // TODO: Consider performing distinct proguard compilations.
1261 task "jar_example_${name}_debuginfo_all"(type: Copy, dependsOn: "jar_example_${name}") {
1262 from "${exampleOutputDir}/${name}.jar"
Tamas Kenez925cb642017-09-19 10:41:15 +02001263 into "${exampleOutputDir}"
1264 rename(".*", "${name}_debuginfo_all.jar")
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001265 }
1266 task "jar_example_${name}_debuginfo_none"(type: Copy, dependsOn: "jar_example_${name}") {
1267 from "${exampleOutputDir}/${name}.jar"
Tamas Kenez925cb642017-09-19 10:41:15 +02001268 into "${exampleOutputDir}"
1269 rename(".*", "${name}_debuginfo_none.jar")
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001270 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001271 } else {
1272 task "jar_example_${name}"(type: Jar, dependsOn: "compile_examples") {
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001273 archiveName = "${name}.jar"
Mads Ager418d1ca2017-05-22 09:35:49 +02001274 destinationDir = exampleOutputDir
1275 from "build/test/examples/classes"
Søren Gjesse7320ce52018-05-07 15:45:22 +02001276 include name + "/**/*"
Stephan Herhut417a72a2017-07-18 10:38:30 +02001277 with runtimeDependencies
Søren Gjesse7320ce52018-05-07 15:45:22 +02001278 includeEmptyDirs true
Mads Ager418d1ca2017-05-22 09:35:49 +02001279 }
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001280 task "jar_example_${name}_debuginfo_all"(type: Jar, dependsOn: "compile_examples_debuginfo_all") {
1281 archiveName = "${name}_debuginfo_all.jar"
1282 destinationDir = exampleOutputDir
1283 from "build/test/examples/classes_debuginfo_all"
1284 include name + "/**/*.class"
1285 with runtimeDependencies
1286 includeEmptyDirs false
1287 }
1288 task "jar_example_${name}_debuginfo_none"(type: Jar, dependsOn: "compile_examples_debuginfo_none") {
1289 archiveName = "${name}_debuginfo_none.jar"
1290 destinationDir = exampleOutputDir
1291 from "build/test/examples/classes_debuginfo_none"
1292 include name + "/**/*.class"
1293 with runtimeDependencies
1294 includeEmptyDirs false
1295 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001296 }
1297 }
1298}
1299
1300task buildExampleAndroidNJars {
1301 dependsOn downloadDeps
1302 def examplesDir = file("src/test/examplesAndroidN")
1303 task "compile_examplesAndroidN"(type: JavaCompile) {
1304 source = fileTree(dir: examplesDir, include: '**/*.java')
1305 destinationDir = file("build/test/examplesAndroidN/classes")
1306 classpath = sourceSets.main.compileClasspath
1307 sourceCompatibility = JavaVersion.VERSION_1_8
1308 targetCompatibility = JavaVersion.VERSION_1_8
1309 options.compilerArgs += ["-Xlint:-options"]
1310 }
1311 examplesDir.eachDir { dir ->
1312 def name = dir.getName();
1313 def exampleOutputDir = file("build/test/examplesAndroidN");
1314 def jarName = "${name}.jar"
1315 dependsOn "jar_examplesAndroidN_${name}"
1316 task "jar_examplesAndroidN_${name}"(type: Jar, dependsOn: "compile_examplesAndroidN") {
1317 archiveName = jarName
1318 destinationDir = exampleOutputDir
1319 from "build/test/examplesAndroidN/classes"
1320 include "**/" + name + "/**/*.class"
1321 }
1322 }
1323}
1324
1325
1326task buildExampleAndroidOJars {
1327 dependsOn downloadDeps
1328 def examplesDir = file("src/test/examplesAndroidO")
1329 // NOTE: we want to enable a scenario when test needs to reference some
1330 // classes generated by legacy (1.6) Java compiler to test some specific
1331 // behaviour. To do so we compile all the java files located in sub-directory
1332 // called 'legacy' with Java 1.6, then compile the rest of the files with
1333 // Java 1.8 and a reference to previously generated 1.6 classes.
1334
1335 // Compiling all classes in dirs 'legacy' with old Java version.
1336 task "compile_examplesAndroidO_Legacy"(type: JavaCompile) {
1337 source = fileTree(dir: examplesDir, include: '**/legacy/**/*.java')
1338 destinationDir = file("build/test/examplesAndroidOLegacy/classes")
1339 classpath = sourceSets.main.compileClasspath
1340 sourceCompatibility = JavaVersion.VERSION_1_6
1341 targetCompatibility = JavaVersion.VERSION_1_6
1342 options.compilerArgs += ["-Xlint:-options", "-parameters"]
1343 }
1344 // Compiling the rest of the files as Java 1.8 code.
1345 task "compile_examplesAndroidO"(type: JavaCompile) {
1346 dependsOn "compile_examplesAndroidO_Legacy"
1347 source = fileTree(dir: examplesDir, include: '**/*.java', exclude: '**/legacy/**/*.java')
1348 destinationDir = file("build/test/examplesAndroidO/classes")
1349 classpath = sourceSets.main.compileClasspath
1350 classpath += files("build/test/examplesAndroidOLegacy/classes")
1351 sourceCompatibility = JavaVersion.VERSION_1_8
1352 targetCompatibility = JavaVersion.VERSION_1_8
1353 options.compilerArgs += ["-Xlint:-options", "-parameters"]
1354 }
1355 examplesDir.eachDir { dir ->
1356 def name = dir.getName();
1357 def destinationDir = file("build/test/examplesAndroidO/classes");
1358 if (file("src/test/examplesAndroidO/" + name + "/TestGenerator.java").isFile()) {
1359 task "generate_examplesAndroidO_${name}"(type: JavaExec,
1360 dependsOn: "compile_examplesAndroidO") {
1361 main = name + ".TestGenerator"
1362 classpath = files(destinationDir, sourceSets.main.compileClasspath)
1363 args destinationDir
1364 }
1365 } else {
1366 task "generate_examplesAndroidO_${name}" () {}
1367 }
1368 }
1369 examplesDir.eachDir { dir ->
1370 def name = dir.getName();
1371 def exampleOutputDir = file("build/test/examplesAndroidO");
1372 def jarName = "${name}.jar"
1373 dependsOn "jar_examplesAndroidO_${name}"
1374 task "jar_examplesAndroidO_${name}"(type: Jar, dependsOn: ["compile_examplesAndroidO",
1375 "generate_examplesAndroidO_${name}"]) {
1376 archiveName = jarName
1377 destinationDir = exampleOutputDir
1378 from "build/test/examplesAndroidO/classes" // Java 1.8 classes
1379 from "build/test/examplesAndroidOLegacy/classes" // Java 1.6 classes
1380 include "**/" + name + "/**/*.class"
1381 // Do not include generator into the test runtime jar, it is not useful.
1382 // Otherwise, shrinking will need ASM jars.
1383 exclude "**/TestGenerator*"
1384 }
1385 }
1386}
1387
Mikaël Peltier7b7b53a2017-10-09 13:33:21 +02001388task buildExampleAndroidPJars {
1389 dependsOn downloadDeps
1390 def examplesDir = file("src/test/examplesAndroidP")
1391
1392 task "compile_examplesAndroidP"(type: JavaCompile) {
1393 source = fileTree(dir: examplesDir, include: '**/*.java')
1394 destinationDir = file("build/test/examplesAndroidP/classes")
1395 classpath = sourceSets.main.compileClasspath
1396 sourceCompatibility = JavaVersion.VERSION_1_8
1397 targetCompatibility = JavaVersion.VERSION_1_8
1398 options.compilerArgs += ["-Xlint:-options"]
1399 }
1400 examplesDir.eachDir { dir ->
1401 def name = dir.getName();
1402 def destinationDir = file("build/test/examplesAndroidP/classes");
1403 if (file("src/test/examplesAndroidP/" + name + "/TestGenerator.java").isFile()) {
1404 task "generate_examplesAndroidP_${name}"(type: JavaExec,
1405 dependsOn: "compile_examplesAndroidP") {
1406 main = name + ".TestGenerator"
1407 classpath = files(destinationDir, sourceSets.main.compileClasspath)
1408 args destinationDir
1409 }
1410 } else {
1411 task "generate_examplesAndroidP_${name}" () {}
1412 }
1413 }
1414 examplesDir.eachDir { dir ->
1415 def name = dir.getName();
1416 def exampleOutputDir = file("build/test/examplesAndroidP");
1417 def jarName = "${name}.jar"
1418 dependsOn "jar_examplesAndroidP_${name}"
1419 task "jar_examplesAndroidP_${name}"(type: Jar,
1420 dependsOn: ["compile_examplesAndroidP",
1421 "generate_examplesAndroidP_${name}"]) {
1422 archiveName = jarName
1423 destinationDir = exampleOutputDir
1424 from "build/test/examplesAndroidP/classes" // Java 1.8 classes
1425 include "**/" + name + "/**/*.class"
1426 // Do not include generator into the test runtime jar, it is not useful.
1427 // Otherwise, shrinking will need ASM jars.
1428 exclude "**/TestGenerator*"
1429 }
1430 }
1431}
1432
Mikaël Peltier61633d42017-10-13 16:51:06 +02001433task buildExampleJava9Jars {
1434 def examplesDir = file("src/test/examplesJava9")
1435 examplesDir.eachDir { dir ->
1436 def name = dir.getName();
1437 def exampleOutputDir = file("build/test/examplesJava9");
1438 def jarName = "${name}.jar"
1439 dependsOn "jar_examplesJava9_${name}"
1440 task "jar_examplesJava9_${name}"(type: Jar) {
1441 archiveName = jarName
1442 destinationDir = exampleOutputDir
Ian Zernyd3020482019-04-25 07:05:04 +02001443 from sourceSets.examplesJava9.output
Mikaël Peltier61633d42017-10-13 16:51:06 +02001444 include "**/" + name + "/**/*.class"
1445 }
1446 }
1447}
1448
clementberad7ab1dd2019-04-16 16:05:00 +02001449task buildExampleJava11Jars {
1450 def examplesDir = file("src/test/examplesJava11")
1451 examplesDir.eachDir { dir ->
1452 def name = dir.getName();
1453 def exampleOutputDir = file("build/test/examplesJava11");
1454 def jarName = "${name}.jar"
1455 dependsOn "jar_examplesJava11_${name}"
1456 task "jar_examplesJava11_${name}"(type: Jar) {
1457 archiveName = jarName
1458 destinationDir = exampleOutputDir
Ian Zernyd3020482019-04-25 07:05:04 +02001459 from sourceSets.examplesJava11.output
clementberad7ab1dd2019-04-16 16:05:00 +02001460 include "**/" + name + "/**/*.class"
1461 }
1462 }
1463}
1464
clementberaa92e3cd2019-07-12 14:13:22 +02001465task provideArtFrameworksDependencies {
1466 cloudDependencies.tools.forEach({ art ->
1467 if (art.contains("art")) {
1468 def taskName = art.replace('/','_')
1469 dependsOn "patch_${taskName}"
1470 task "patch_${taskName}"(type: org.gradle.api.tasks.Copy){
1471 from "tools/${art}/framework"
1472 include "**.jar"
1473 into file("tools/${art}/out/host/linux-x86/framework")
1474 }
1475 }
1476 })
1477}
1478
clementbera4f9c2a92019-07-09 08:50:37 +02001479task provideJdk11TestsDependencies(type: org.gradle.api.tasks.Copy) {
1480 from sourceSets.jdk11TimeTests.compileClasspath
1481 include "**/**.jar"
1482 into file("build/test/jdk11Tests")
1483}
1484
1485task buildJdk11TimeTestsJar {
1486 def exampleOutputDir = file("build/test/jdk11Tests");
1487 def jarName = "jdk11TimeTests.jar"
1488 dependsOn "jar_jdk11TimeTests"
1489 dependsOn provideJdk11TestsDependencies
1490 task "jar_jdk11TimeTests"(type: Jar) {
1491 archiveName = jarName
1492 destinationDir = exampleOutputDir
clementberaefa10522019-07-11 11:20:46 +02001493 from sourceSets.examplesTestNGRunner.output
clementbera4f9c2a92019-07-09 08:50:37 +02001494 include "**.class"
1495 from sourceSets.jdk11TimeTests.output
1496 include "**.class"
1497 include "**/**.class"
1498 }
1499}
1500
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001501task buildExamplesKotlin {
1502 if (OperatingSystem.current().isMacOsX() || OperatingSystem.current().isWindows()) {
1503 logger.lifecycle("WARNING: Testing (including building kotlin examples) is only partially" +
1504 " supported on your platform (" + OperatingSystem.current().getName() + ").")
1505 } else if (!OperatingSystem.current().isLinux()) {
1506 logger.lifecycle("WARNING: Testing (including building kotlin examples) is not supported " +
1507 "on your platform. It is fully supported on Linux and partially supported on " +
1508 "Mac OS and Windows")
1509 return;
1510 }
1511 def examplesDir = file("src/test/examplesKotlin")
1512 examplesDir.eachDir { dir ->
Sebastien Hertz2ac9bac2018-01-15 16:33:44 +00001513 def name = dir.getName();
1514 dependsOn "dex_example_kotlin_${name}"
1515 def exampleOutputDir = file("build/test/examplesKotlin/" + name);
1516 def dexPath = file("${exampleOutputDir}")
1517 task "dex_example_kotlin_${name}"(type: dx.Dx,
1518 dependsOn: "compile_example_kotlin_${name}") {
1519 doFirst {
1520 if (!dexPath.exists()) {
1521 dexPath.mkdirs()
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001522 }
1523 }
Sebastien Hertz2ac9bac2018-01-15 16:33:44 +00001524 source = files(tasks.getByPath("compile_example_kotlin_${name}")).asFileTree
1525 destination = dexPath
1526 debug = false
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001527 }
1528 }
1529}
1530
Sebastien Hertzd3313772018-01-16 14:12:37 +01001531task buildKotlinR8TestResources {
1532 def examplesDir = file("src/test/kotlinR8TestResources")
1533 examplesDir.eachDir { dir ->
Sebastien Hertzfe97a712018-02-13 12:08:59 +01001534 kotlin.Kotlinc.KotlinTargetVersion.values().each { kotlinTargetVersion ->
1535 def name = dir.getName()
1536 def taskName = "jar_kotlinR8TestResources_${name}_${kotlinTargetVersion}"
Morten Krogh-Jespersen6c1f2fa2019-01-04 13:23:13 +00001537 def outputFile = "build/test/kotlinR8TestResources/${kotlinTargetVersion}/${name}.jar"
1538 def javaOutput = "build/test/kotlinR8TestResources/${kotlinTargetVersion}/${name}/java"
Denis Vnukovc22da842018-03-14 12:57:20 -07001539 def javaOutputJarName = "${name}.java.jar"
Morten Krogh-Jespersen6c1f2fa2019-01-04 13:23:13 +00001540 def javaOutputJarDir = "build/test/kotlinR8TestResources/${kotlinTargetVersion}"
Denis Vnukovc22da842018-03-14 12:57:20 -07001541 task "${taskName}Kotlin"(type: kotlin.Kotlinc) {
1542 source = fileTree(dir: file("${examplesDir}/${name}"),
1543 include: ['**/*.kt', '**/*.java'])
Sebastien Hertzfe97a712018-02-13 12:08:59 +01001544 destination = file(outputFile)
1545 targetVersion = kotlinTargetVersion
1546 }
Denis Vnukovc22da842018-03-14 12:57:20 -07001547 task "${taskName}Java"(type: JavaCompile) {
1548 source = fileTree(dir: file("${examplesDir}/${name}"), include: '**/*.java')
1549 destinationDir = file(javaOutput)
1550 classpath = sourceSets.main.compileClasspath
1551 sourceCompatibility = JavaVersion.VERSION_1_6
1552 targetCompatibility = JavaVersion.VERSION_1_6
1553 options.compilerArgs += ["-g", "-Xlint:-options"]
1554 }
1555 task "${taskName}JavaJar"(type: Jar, dependsOn: "${taskName}Java") {
1556 archiveName = javaOutputJarName
1557 destinationDir = file(javaOutputJarDir)
1558 from javaOutput
1559 include "**/*.class"
1560 }
1561 dependsOn "${taskName}Kotlin", "${taskName}JavaJar"
Sebastien Hertzd3313772018-01-16 14:12:37 +01001562 }
Sebastien Hertzd3313772018-01-16 14:12:37 +01001563 }
1564}
1565
Mads Ager418d1ca2017-05-22 09:35:49 +02001566task buildExamples {
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001567 if (OperatingSystem.current().isMacOsX() || OperatingSystem.current().isWindows()) {
1568 logger.lifecycle("WARNING: Testing (including building examples) is only partially supported on your " +
1569 "platform (" + OperatingSystem.current().getName() + ").")
Mads Ager418d1ca2017-05-22 09:35:49 +02001570 } else if (!OperatingSystem.current().isLinux()) {
1571 logger.lifecycle("WARNING: Testing (including building examples) is not supported on your platform. " +
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001572 "It is fully supported on Linux and partially supported on Mac OS and Windows")
Mads Ager418d1ca2017-05-22 09:35:49 +02001573 return;
1574 }
1575 dependsOn buildDebugTestResourcesJars
1576 dependsOn buildExampleJars
1577 dependsOn buildExampleAndroidNJars
1578 dependsOn buildExampleAndroidOJars
Mikaël Peltier7b7b53a2017-10-09 13:33:21 +02001579 dependsOn buildExampleAndroidPJars
Mikaël Peltier61633d42017-10-13 16:51:06 +02001580 dependsOn buildExampleJava9Jars
clementberad7ab1dd2019-04-16 16:05:00 +02001581 dependsOn buildExampleJava11Jars
Søren Gjesse5b4ee0a2018-01-30 13:46:39 +01001582 dependsOn buildExampleAndroidApi
Mads Ager418d1ca2017-05-22 09:35:49 +02001583 def examplesDir = file("src/test/examples")
Yohann Rousself820a572017-05-31 20:25:51 +02001584 def noDexTests = [
1585 "multidex",
1586 "multidex002",
1587 "multidex004",
1588 ]
Mads Ager418d1ca2017-05-22 09:35:49 +02001589 examplesDir.eachDir { dir ->
1590 def name = dir.getName();
Yohann Rousself820a572017-05-31 20:25:51 +02001591 if (!(name in noDexTests)) {
1592 dependsOn "dex_example_${name}"
1593 def exampleOutputDir = file("build/test/examples/" + name);
1594 def dexPath = file("${exampleOutputDir}")
1595 def debug = (name == "throwing")
1596 if (!dexPath.exists()) {
1597 dexPath.mkdirs()
1598 }
1599 task "dex_example_${name}"(type: dx.Dx, dependsOn: "jar_example_${name}") {
1600 source = files(tasks.getByPath("jar_example_${name}")).asFileTree
1601 destination = dexPath
1602 debug = debug
1603 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001604 }
1605 }
1606}
1607
1608task buildSmali {
1609 def smaliDir = file("src/test/smali")
1610 smaliDir.eachDirRecurse() { dir ->
1611 def name = dir.getName();
1612 def relativeDir = smaliDir.toPath().relativize(dir.toPath());
1613 def smaliOutputDir = file("build/test/smali/" + relativeDir);
1614 smaliOutputDir.mkdirs()
1615 outputs.dir smaliOutputDir
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001616 def taskName = "smali_build_${relativeDir.toString().replace('/', '_').replace('\\', '_')}"
Mads Ager418d1ca2017-05-22 09:35:49 +02001617 def smaliFiles = fileTree(dir: dir, include: '*.smali')
1618 def javaFiles = fileTree(dir: dir, include: '*.java')
1619 def destDir = smaliOutputDir;
1620 def destFile = destDir.toPath().resolve("${name}.dex").toFile()
1621 def intermediateFileName = "${name}-intermediate.dex";
1622 def intermediateFile = destDir.toPath().resolve(intermediateFileName).toFile()
1623 if (javaFiles.empty) {
1624 if (!smaliFiles.empty) {
1625 dependsOn "${taskName}_smali"
1626 task "${taskName}_smali"(type: smali.Smali) {
1627 source = smaliFiles
1628 destination = destFile
1629 }
1630 }
1631 } else {
1632 dependsOn "${taskName}_dexmerger"
1633 task "${taskName}_smali"(type: smali.Smali) {
1634 source = smaliFiles
1635 destination = intermediateFile
1636 }
1637 task "${taskName}_java"(type: JavaCompile) {
1638 source = javaFiles
1639 destinationDir destDir
1640 classpath = sourceSets.main.compileClasspath
1641 sourceCompatibility = JavaVersion.VERSION_1_7
1642 targetCompatibility = JavaVersion.VERSION_1_7
1643 options.compilerArgs += ["-Xlint:-options"]
1644 }
1645 task "${taskName}_jar"(type: Jar, dependsOn: "${taskName}_java") {
1646 archiveName = "Test.jar"
1647 destinationDir = destDir
1648 from fileTree(dir: destDir, include: 'Test.class')
1649 }
1650 task "${taskName}_dx"(type: dx.Dx, dependsOn: "${taskName}_jar") {
1651 source = fileTree(dir: destDir, include: 'Test.jar')
1652 destination = destDir
1653 }
1654 task "${taskName}_dexmerger"(
1655 type: dx.DexMerger, dependsOn: ["${taskName}_dx", "${taskName}_smali"]) {
1656 source = fileTree(dir: destDir, include: ["classes.dex", intermediateFileName])
1657 destination = destFile
1658 }
1659 }
1660 }
1661}
1662
1663tasks.withType(Test) {
Rico Windc56f21c2019-03-12 07:29:57 +01001664 println("NOTE: Number of processors " + Runtime.runtime.availableProcessors())
Mads Ager418d1ca2017-05-22 09:35:49 +02001665 def userDefinedCoresPerFork = System.getenv('R8_GRADLE_CORES_PER_FORK')
1666 def coresPerFork = userDefinedCoresPerFork ? userDefinedCoresPerFork.toInteger() : 3
1667 // See https://docs.gradle.org/current/dsl/org.gradle.api.tasks.testing.Test.html.
Rico Wind3defc8d2019-03-27 08:07:31 +01001668 maxParallelForks = (Runtime.runtime.availableProcessors().intdiv(coresPerFork) ?: 1) + 1
Rico Windc56f21c2019-03-12 07:29:57 +01001669 println("NOTE: Max parallel forks " + maxParallelForks)
Mads Ager418d1ca2017-05-22 09:35:49 +02001670 forkEvery = 0
Søren Gjesseaf1c5e22017-06-15 12:24:03 +02001671 if (project.hasProperty('disable_assertions')) {
1672 enableAssertions = false
1673 }
Ian Zerny16c2f2d2019-02-19 07:25:11 +01001674 // TODO(b/124091860): Increase the max heap size to avoid OOM when running tests.
1675 maxHeapSize = "4g"
Mads Ager418d1ca2017-05-22 09:35:49 +02001676}
1677
1678task buildPreNJdwpTestsJar(type: Jar) {
1679 baseName = 'jdwp-tests-preN'
1680 from zipTree('third_party/jdwp-tests/apache-harmony-jdwp-tests-host.jar')
1681 // Exclude the classes containing java8
1682 exclude 'org/apache/harmony/jpda/tests/jdwp/InterfaceType/*.class'
1683 exclude 'org/apache/harmony/jpda/tests/jdwp/ObjectReference/InvokeMethodDefault*.class'
1684 includeEmptyDirs = false
1685}
1686
Ian Zerny74143162017-11-24 13:46:35 +01001687task buildPreNJdwpTestsDex(type: Exec, dependsOn: "buildPreNJdwpTestsJar") {
1688 def inFile = buildPreNJdwpTestsJar.archivePath
1689 def outFile = new File(buildPreNJdwpTestsJar.destinationDir, buildPreNJdwpTestsJar.baseName + '-dex.jar')
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001690 inputs.files files(inFile)
Ian Zerny74143162017-11-24 13:46:35 +01001691 outputs.file outFile
1692 if (OperatingSystem.current().isWindows()) {
1693 executable file("tools/windows/dx/bin/dx.bat")
1694 } else if (OperatingSystem.current().isMacOsX()) {
1695 executable file("tools/mac/dx/bin/dx");
1696 } else {
1697 executable file("tools/linux/dx/bin/dx");
1698 }
1699 args "--dex"
1700 args "--output=${outFile}"
1701 args inFile
1702}
1703
Ivan Gavrilovic635c7e52017-12-01 15:10:45 +00001704task getJarsFromSupportLibs(type: GetJarsFromConfiguration) {
1705 setConfiguration(configurations.supportLibs)
Yohann Roussel126f6872017-08-03 16:25:32 +02001706}
1707
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001708def getR8LibTask() {
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +01001709 if (project.hasProperty('r8lib')) {
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001710 return R8Lib
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +01001711 } else if (project.hasProperty('r8lib_no_deps')) {
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001712 return R8LibNoDeps
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +01001713 }
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001714 return null
1715}
1716
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001717task configureTestForR8Lib(type: Copy) {
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +01001718 dependsOn testJar
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001719 inputs.files files("$buildDir/libs/r8tests.jar")
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001720 if (getR8LibTask() != null) {
Morten Krogh-Jespersene0616982019-01-03 12:42:36 +01001721 dependsOn getR8LibTask()
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +01001722 delete r8LibTestPath
1723 from zipTree(testJar.outputs.files[0])
1724 into r8LibTestPath
1725 include "com/android/tools/r8/**"
1726 include "dalvik/**"
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001727 }
1728 outputs.dir r8LibTestPath
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +01001729}
1730
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001731def printStackTrace(TestResult result) {
1732 if (project.hasProperty('r8lib') || project.hasProperty('r8lib_no_deps')) {
1733 def out = new StringBuffer()
1734 def err = new StringBuffer()
Rico Windacc291f2019-03-06 11:36:33 +01001735 def command = "python tools/retrace.py"
Morten Krogh-Jespersen046b18e2019-01-17 15:40:14 +01001736 def header = "RETRACED STACKTRACE";
1737 if (System.getenv('BUILDBOT_BUILDERNAME') != null
1738 && !System.getenv('BUILDBOT_BUILDERNAME').endsWith("_release")) {
1739 header += ": (${command} --commit_hash ${System.getenv('BUILDBOT_REVISION')})";
1740 }
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001741 out.append("\n--------------------------------------\n")
Morten Krogh-Jespersen046b18e2019-01-17 15:40:14 +01001742 out.append("${header}\n")
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001743 out.append("--------------------------------------\n")
1744 Process process = command.execute()
1745 def processIn = new PrintStream(process.getOut())
1746 process.consumeProcessOutput(out, err)
1747 result.exception.printStackTrace(processIn)
1748 processIn.flush()
1749 processIn.close()
1750 process.waitFor()
1751 out.append("\n\n--------------------------------------\n")
1752 out.append("OBFUSCATED STACKTRACE\n")
1753 out.append("--------------------------------------\n")
1754 result.exceptions.add(0, new Exception(out.toString()))
1755 } else {
1756 result.exception.printStackTrace()
1757 }
1758}
1759
Mads Ager418d1ca2017-05-22 09:35:49 +02001760test {
Jean-Marie Henaff7a64eec2018-05-31 15:30:35 +02001761 if (project.hasProperty('generate_golden_files_to')) {
1762 systemProperty 'generate_golden_files_to', project.property('generate_golden_files_to')
1763 assert project.hasProperty('HEAD_sha1')
1764 systemProperty 'test_git_HEAD_sha1', project.property('HEAD_sha1')
1765 }
1766
1767 if (project.hasProperty('use_golden_files_in')) {
1768 systemProperty 'use_golden_files_in', project.property('use_golden_files_in')
1769 assert project.hasProperty('HEAD_sha1')
1770 systemProperty 'test_git_HEAD_sha1', project.property('HEAD_sha1')
1771 }
Ian Zerny4b0de282019-06-28 09:32:24 +02001772
1773 if (project.hasProperty('alternative_frontend')) {
1774 println "NOTE: Running with alternative frontend"
1775 systemProperty 'com.android.tools.r8.useAlternativeFrontend', true
1776 }
1777
Ivan Gavrilovic635c7e52017-12-01 15:10:45 +00001778 dependsOn getJarsFromSupportLibs
Morten Krogh-Jespersen75c38f72018-10-05 09:02:11 +02001779 // R8.jar is required for running bootstrap tests.
1780 dependsOn R8
Mads Ager418d1ca2017-05-22 09:35:49 +02001781 testLogging.exceptionFormat = 'full'
1782 if (project.hasProperty('print_test_stdout')) {
1783 testLogging.showStandardStreams = true
1784 }
Tamas Kenez0cad51c2017-08-21 14:42:01 +02001785 if (project.hasProperty('dex_vm') && project.property('dex_vm') != 'default') {
Ian Zerny324d7612019-03-20 10:52:28 +01001786 println "NOTE: Running with non default vm: " + project.property('dex_vm')
Mads Ager418d1ca2017-05-22 09:35:49 +02001787 systemProperty 'dex_vm', project.property('dex_vm')
Mads Ager418d1ca2017-05-22 09:35:49 +02001788 }
Tamas Kenez0cad51c2017-08-21 14:42:01 +02001789
Ian Zerny324d7612019-03-20 10:52:28 +01001790 // Forward runtime configurations for test parameters.
1791 if (project.hasProperty('runtimes')) {
1792 println "NOTE: Running with runtimes: " + project.property('runtimes')
1793 systemProperty 'runtimes', project.property('runtimes')
Ian Zerny4dfd5a52019-03-12 07:56:11 +01001794 }
1795
Mads Ager418d1ca2017-05-22 09:35:49 +02001796 if (project.hasProperty('one_line_per_test')) {
1797 beforeTest { desc ->
1798 println "Start executing test ${desc.name} [${desc.className}]"
1799 }
1800 afterTest { desc, result ->
Rico Windf88b6be2018-12-11 15:14:05 +01001801 if (result.resultType == TestResult.ResultType.FAILURE) {
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001802 printStackTrace(result)
Rico Windf88b6be2018-12-11 15:14:05 +01001803 }
Rico Windda6836e2018-12-07 12:32:03 +01001804 if (project.hasProperty('update_test_timestamp')) {
1805 file(project.getProperty('update_test_timestamp')).text = new Date().getTime()
1806 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001807 println "Done executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
1808 }
Rico Windf88b6be2018-12-11 15:14:05 +01001809 } else {
1810 afterTest { desc, result ->
1811 if (result.resultType == TestResult.ResultType.FAILURE) {
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001812 printStackTrace(result)
Rico Windf88b6be2018-12-11 15:14:05 +01001813 }
1814 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001815 }
1816 if (project.hasProperty('no_internal')) {
1817 exclude "com/android/tools/r8/internal/**"
Christoffer Quist Adamsen74288f02019-06-14 12:30:17 +02001818 } else {
1819 dependsOn buildExamplesProto
Mads Ager418d1ca2017-05-22 09:35:49 +02001820 }
1821 if (project.hasProperty('only_internal')) {
1822 include "com/android/tools/r8/internal/**"
1823 }
Rico Wind4e218292019-03-07 12:44:49 +01001824
Mads Ager418d1ca2017-05-22 09:35:49 +02001825 if (project.hasProperty('tool')) {
1826 if (project.property('tool') == 'r8') {
Rico Windf02167a2019-03-15 12:27:03 +01001827 exclude "com/android/tools/r8/jctf/**"
Tamas Kenezcfb2c052018-10-12 11:03:57 +02001828 } else if (project.property('tool') == 'd8') {
Rico Windf02167a2019-03-15 12:27:03 +01001829 if (project.hasProperty('only_jctf')) {
1830 include "com/android/tools/r8/jctf/d8/**"
1831 } else {
Rico Wind819f7c52019-03-20 09:44:27 +01001832 // Don't run anything, deprecated
1833 println "Running with deprecated tool d8, not running any tests"
1834 include ""
Rico Windf02167a2019-03-15 12:27:03 +01001835 }
Tamas Kenezcfb2c052018-10-12 11:03:57 +02001836 } else {
1837 assert(project.property('tool') == 'r8cf')
Rico Windf02167a2019-03-15 12:27:03 +01001838 assert(project.hasProperty('only_jctf'))
1839 include "com/android/tools/r8/jctf/r8cf/**"
Mads Ager418d1ca2017-05-22 09:35:49 +02001840 }
1841 }
1842 if (!project.hasProperty('all_tests')) {
1843 exclude "com/android/tools/r8/art/dx/**"
Mads Ager418d1ca2017-05-22 09:35:49 +02001844 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001845 if (!project.hasProperty('jctf') && !project.hasProperty('only_jctf')) {
Stephan Herhutea6ee582017-05-23 13:14:34 +02001846 exclude "com/android/tools/r8/jctf/**"
Mads Ager418d1ca2017-05-22 09:35:49 +02001847 }
Rico Wind8e2f7e42019-02-21 10:13:21 +01001848 if (project.hasProperty('shard_count') ) {
1849 assert project.hasProperty('shard_number')
1850 int shard_count = project.getProperty('shard_count') as Integer
1851 int shard_number = project.getProperty('shard_number') as Integer
1852 assert shard_count < 65536
1853 assert shard_number < shard_count
1854 exclude {
1855 entry ->
1856 // Don't leave out directories. Leaving out a directory means all entries below.
1857 if (entry.file.isDirectory()) {
1858 return false
1859 }
1860 def first4 = entry.getRelativePath().toString().md5().substring(0, 4)
1861 int hash = Integer.parseInt(first4, 16)
1862 return hash % shard_count != shard_number
1863 }
1864 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001865 if (project.hasProperty('jctf_compile_only')) {
1866 println "JCTF: compiling only"
1867 systemProperty 'jctf_compile_only', '1'
1868 }
Tamas Kenezb77b7d82017-08-17 14:05:16 +02001869 if (project.hasProperty('test_dir')) {
1870 systemProperty 'test_dir', project.property('test_dir')
1871 }
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001872 if (project.hasProperty('r8lib') || project.hasProperty('r8lib_no_deps')) {
1873 dependsOn configureTestForR8Lib
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +01001874 // We remove build/classes/test from classpath and rely on configureTestForR8Lib to provide
1875 // all needed tests in r8LibTestPath.
1876 classpath = files([r8LibPath, r8LibTestPath]) +
1877 sourceSets.test.runtimeClasspath -
1878 sourceSets.main.output -
1879 files(['build/classes/test'])
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001880 testClassesDirs = files(r8LibTestPath)
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001881 }
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001882 if (OperatingSystem.current().isLinux()
1883 || OperatingSystem.current().isMacOsX()
1884 || OperatingSystem.current().isWindows()) {
Mads Ager418d1ca2017-05-22 09:35:49 +02001885 if (OperatingSystem.current().isMacOsX()) {
1886 logger.lifecycle("WARNING: Testing in only partially supported on Mac OS. " +
1887 "Art only runs on Linux and tests requiring Art runs in a Docker container, which must be present. " +
1888 "See tools/docker/README.md for details.")
1889 }
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001890 if (OperatingSystem.current().isWindows()) {
1891 logger.lifecycle("WARNING: Testing in only partially supported on Windows. " +
1892 "Art only runs on Linux and tests requiring Art will be skipped")
1893 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001894 dependsOn downloadDeps
1895 dependsOn buildExamples
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001896 dependsOn buildExamplesKotlin
Sebastien Hertzd3313772018-01-16 14:12:37 +01001897 dependsOn buildKotlinR8TestResources
Mads Ager418d1ca2017-05-22 09:35:49 +02001898 dependsOn buildSmali
1899 dependsOn jctfCommonJar
1900 dependsOn jctfTestsClasses
1901 dependsOn buildDebugInfoExamplesDex
1902 dependsOn buildPreNJdwpTestsJar
Mathias Ravcd795072018-03-22 12:47:32 +01001903 dependsOn buildPreNJdwpTestsDex
clementbera4f9c2a92019-07-09 08:50:37 +02001904 dependsOn buildJdk11TimeTestsJar
clementberaa92e3cd2019-07-12 14:13:22 +02001905 dependsOn provideArtFrameworksDependencies
Mads Ager418d1ca2017-05-22 09:35:49 +02001906 } else {
1907 logger.lifecycle("WARNING: Testing in not supported on your platform. Testing is only fully supported on " +
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001908 "Linux and partially supported on Mac OS and Windows. Art does not run on other platforms.")
Mads Ager418d1ca2017-05-22 09:35:49 +02001909 }
1910}
1911
1912// The Art tests we use for R8 are pre-build and downloaded from Google Cloud Storage.
1913//
1914// To build and upload a new set of the Art tests for use with R8 follow these steps:
1915//
1916// First of all an Android checkout is required. Currently it must be located
1917// in $HOME/android/master.
1918//
1919// TODO(ricow): simplify this
1920//
1921// Before: update the checked in art, see scripts/update-host-art.sh
1922//
1923// 1. Get an android checkout in $HOME/android/master and apply the patch from
1924// https://android-review.googlesource.com/#/c/294187/
1925//
1926// 2. run the following commands in the Android checkout directory:
1927//
1928// source build/envsetup.sh
Søren Gjesse34b77732017-07-07 13:56:21 +02001929// lunch aosp_angler-userdebug # or lunch aosp_angler-eng
1930// m desugar
1931// m -j30 test-art-host
1932// DESUGAR=false ANDROID_COMPILE_WITH_JACK=false art/test.py --host -t 001-HelloWorld
1933//
1934// Without running the test.py command the classes.jar file used by desugar in
1935// $HOME/android/master/out/host/common/obj/JAVA_LIBRARIES/core-oj-hostdex_intermediates/
1936// seems to be missing - there is probably also a make target to build it more directly
Mads Ager418d1ca2017-05-22 09:35:49 +02001937//
1938// 3. In the R8 project root directory, make sure we have a clean state before starting:
1939// tools/gradle.py downloadDeps
1940// tools/gradle.py clean
1941// rm -rf tests/art
1942//
1943// 4. Now build in the R8 checkout (-P hack to not generate dirs when not running this target)
Søren Gjesse34b77732017-07-07 13:56:21 +02001944// Make sure you have smali on your path, please use the build binary in the
1945// out/host/linux-x86/bin directory of the android checkout. Currently this is version pre 2.2.1,
1946// if that is updated the call to smali in "task "${smaliToDexTask}"(type: Exec)" below might
1947// need to change as smali got a completely new command line interface in version 2.2.1.
Mikaël Peltiere116cb62017-10-05 10:50:30 +02001948// After Android O, Jack is no longer alive, do not forget to uncomment call to buildArtTest for
1949// Jack if you build an android version using Jack.
Mads Ager418d1ca2017-05-22 09:35:49 +02001950//
Søren Gjesse34b77732017-07-07 13:56:21 +02001951// PATH=$HOME/android/master/out/host/linux-x86/bin:$PATH tools/gradle.py -Pandroid_source buildArtTests
Mads Ager418d1ca2017-05-22 09:35:49 +02001952//
1953// 4a. If any failures are produced in step 4, figure out what went wrong and add an entry in
1954// skippedTests with an explanation. Rerun from step 3.
1955//
1956// 5. Run the tests:
1957// tools/gradle.py clean
1958// tools/test.py
1959//
Søren Gjesse34b77732017-07-07 13:56:21 +02001960// 5a. If any more tests fail, either fix the issue or add them to the failuresToTriage list (note
1961// that you need to change "_" to "-" from stdout). Rerun from step 5 if anything was added to
1962// failuresToTriage.
Mads Ager418d1ca2017-05-22 09:35:49 +02001963//
Søren Gjesse34b77732017-07-07 13:56:21 +02001964// 6. To upload a new version to Google Cloud Storage:
Mads Ager418d1ca2017-05-22 09:35:49 +02001965// cd tests
1966// upload_to_google_storage.py -a --bucket r8-deps art
Søren Gjesse34b77732017-07-07 13:56:21 +02001967//
1968// 7. Update the manifest file describing the Android repo used:
1969// repo manifest -o <r8-checkout-root>/tools/linux/aosp_master_manifest.xml -r
Mads Ager418d1ca2017-05-22 09:35:49 +02001970
Mads Ager418d1ca2017-05-22 09:35:49 +02001971def androidCheckoutDir = file("${System.env.HOME}/android/master")
Mads Ager418d1ca2017-05-22 09:35:49 +02001972
1973def artTestDir = file("${androidCheckoutDir}/art/test")
1974
1975if (project.hasProperty('android_source')) {
1976 task buildArtTests {
1977 outputs.upToDateWhen { false }
1978 def toBeTriaged = [
1979 "903-hello-tagging",
1980 "904-object-allocation",
1981 "905-object-free",
1982 "906-iterate-heap",
1983 "907-get-loaded-classes",
1984 "908-gc-start-finish",
1985 "954-invoke-polymorphic-verifier",
1986 "955-methodhandles-smali",
1987 "596-monitor-inflation",
1988 ]
1989 def skippedTests = toBeTriaged + [
1990 // This test produces no jar.
1991 "000-nop",
1992 // This does not build, as it tests the error when the application exceeds more
1993 // than 65536 methods
1994 "089-many-methods",
1995 // Requires some jack beta jar
1996 "956-methodhandles",
1997 ]
1998
1999 def skippedTestsDx = [
2000 // Tests with custom build scripts, where javac is not passed the options
2001 // -source 1.7 -target 1.7.
2002 "462-checker-inlining-across-dex-files",
2003 "556-invoke-super",
2004 "569-checker-pattern-replacement",
2005 // These tests use jack even when --build-with-javac-dx is specified.
2006 "004-JniTest",
2007 "048-reflect-v8",
2008 "146-bad-interface",
2009 "563-checker-invoke-super",
2010 "580-checker-string-fact-intrinsics", // java.lang.StringFactory
2011 "604-hot-static-interface",
2012 "957-methodhandle-transforms",
2013 "958-methodhandle-emulated-stackframe",
2014 "959-invoke-polymorphic-accessors",
2015 "961-default-iface-resolution-gen",
2016 "962-iface-static",
2017 "963-default-range-smali",
2018 "964-default-iface-init-gen",
2019 "965-default-verify",
2020 "966-default-conflict",
2021 "967-default-ame",
2022 "968-default-partial-compile-gen",
2023 "969-iface-super",
2024 "970-iface-super-resolution-gen",
2025 "971-iface-super",
2026 // These tests does not build with --build-with-javac-dx
2027 "004-NativeAllocations", // Javac error
2028 "031-class-attributes",
2029 "138-duplicate-classes-check",
2030 "157-void-class", // Javac error
2031 "580-checker-string-factory-intrinsics",
2032 "612-jit-dex-cache",
2033 "613-inlining-dex-cache",
2034 "900-hello-plugin", // --experimental agents
2035 "901-hello-ti-agent", // --experimental agents
2036 "902-hello-transformation", // --experimental agents
2037 "909-attach-agent", // --experimental agents
2038 "946-obsolete-throw", // -source 1.7 -target 1.7, but use lambda
2039 "950-redefine-intrinsic", // -source 1.7 -target 1.7, but use method references
2040 "951-threaded-obsolete", // -source 1.7 -target 1.7, but use lambda
2041 "960-default-smali", // --experimental default-methods
2042 // These tests force the build to use jack
2043 "953-invoke-polymorphic-compiler",
2044 "958-methodhandle-stackframe",
2045 ]
2046
2047 def artTestBuildDir = file("${projectDir}/tests/art")
2048
2049 if (androidCheckoutDir.exists()) {
2050 dependsOn downloadDeps
2051 artTestBuildDir.mkdirs()
Mads Ager418d1ca2017-05-22 09:35:49 +02002052 artTestDir.eachDir { dir ->
2053 def name = dir.getName();
2054 def markerFile = dir.toPath().resolve("info.txt").toFile();
2055 if (markerFile.exists() && !(name in skippedTests)) {
2056 if (!(name in skippedTestsDx)) {
Rico Windde2af6c2019-03-26 15:21:08 +01002057 dependsOn buildArtTest(androidCheckoutDir, artTestBuildDir, dir);
Mads Ager418d1ca2017-05-22 09:35:49 +02002058 }
Mads Ager418d1ca2017-05-22 09:35:49 +02002059 }
2060 }
2061 }
2062 doFirst {
2063 if (!androidCheckoutDir.exists()) {
2064 throw new InvalidUserDataException(
2065 "This task requires an Android checkout in ${androidCheckoutDir}");
Mads Ager418d1ca2017-05-22 09:35:49 +02002066 }
2067 }
2068 doLast {
2069 copy {
2070 from file("${androidCheckoutDir}/out/host/linux-x86/nativetest64")
2071 into file("${artTestBuildDir}/lib64")
2072 include 'lib*.so'
2073 }
2074 copy {
2075 from file("${androidCheckoutDir}/out/host/linux-x86/lib64")
2076 into file("${artTestBuildDir}/lib64")
2077 include 'libart.so'
2078 include 'libbacktrace.so'
2079 include 'libbase.so'
2080 include 'libc++.so'
2081 include 'libcutils.so'
2082 include 'liblz4.so'
2083 include 'liblzma.so'
2084 include 'libnativebridge.so'
2085 include 'libnativeloader.so'
2086 include 'libsigchain.so'
2087 include 'libunwind.so'
2088 include 'libziparchive.so'
2089 }
2090 copy {
2091 from file("${androidCheckoutDir}/out/host/linux-x86/nativetest")
2092 into file("${artTestBuildDir}/lib")
2093 include 'lib*.so'
2094 }
2095 copy {
2096 from file("${androidCheckoutDir}/out/host/linux-x86/lib")
2097 into file("${artTestBuildDir}/lib")
2098 include 'libart.so'
2099 include 'libbacktrace.so'
2100 include 'libbase.so'
2101 include 'libc++.so'
2102 include 'libcutils.so'
2103 include 'liblz4.so'
2104 include 'liblzma.so'
2105 include 'libnativebridge.so'
2106 include 'libnativeloader.so'
2107 include 'libsigchain.so'
2108 include 'libunwind.so'
2109 include 'libziparchive.so'
2110 }
2111 }
2112 }
2113}
2114
Rico Windde2af6c2019-03-26 15:21:08 +01002115def buildArtTest(androidCheckoutDir, artTestBuildDir, dir) {
Mads Ager418d1ca2017-05-22 09:35:49 +02002116 def artTestDir = file("${androidCheckoutDir}/art/test")
2117 def artRunTestScript = file("${artTestDir}/run-test")
2118 def dxExecutable = new File("tools/linux/dx/bin/dx");
Jean-Marie Henaff34d85f72017-06-14 10:32:04 +02002119 def dexMergerExecutable = Utils.dexMergerExecutable()
Mads Ager418d1ca2017-05-22 09:35:49 +02002120
Søren Gjesse34b77732017-07-07 13:56:21 +02002121 def name = dir.getName()
Rico Windde2af6c2019-03-26 15:21:08 +01002122 def buildTask = "build_art_test_dx_${name}"
2123 def sanitizeTask = "sanitize_art_test_dx_${name}"
2124 def copyCheckTask = "copy_check_art_test_dx_${name}"
2125 def smaliToDexTask = "smali_to_dex_dx_${name}"
Mads Ager418d1ca2017-05-22 09:35:49 +02002126
2127 def buildInputs = fileTree(dir: dir, include: '**/*')
Rico Windde2af6c2019-03-26 15:21:08 +01002128 def testDir = file("${artTestBuildDir}/dx/${name}")
Mads Ager418d1ca2017-05-22 09:35:49 +02002129 def outputJar = testDir.toPath().resolve("${name}.jar").toFile()
2130 testDir.mkdirs()
Rico Windde2af6c2019-03-26 15:21:08 +01002131 task "$buildTask"(type: Exec) {
2132 outputs.upToDateWhen { false }
2133 inputs.file buildInputs
2134 executable "${artRunTestScript}"
2135 args "--host"
2136 args "--build-only"
2137 args "--build-with-javac-dx"
2138 args "--output-path", "${testDir}"
2139 args "${name}"
2140 environment DX: "${dxExecutable.absolutePath}"
2141 environment DXMERGER: "${dexMergerExecutable.absolutePath}"
2142 environment ANDROID_BUILD_TOP: "${androidCheckoutDir}"
2143 outputs.file outputJar
Mads Ager418d1ca2017-05-22 09:35:49 +02002144 }
2145 task "${sanitizeTask}"(type: Exec, dependsOn: buildTask) {
2146 outputs.upToDateWhen { false }
2147 executable "/bin/bash"
2148 args "-c"
2149 args "rm -rf ${testDir}/smali_*.dex ${testDir}/*-ex.dex ${testDir}/*-ex.jar" +
2150 " ${testDir}/classes-ex ${testDir}/check"
2151 }
2152
2153 task "${smaliToDexTask}"(type: Exec) {
Mikaël Peltiere116cb62017-10-05 10:50:30 +02002154 // Directory that contains smali files is either smali, or smali/art
2155 def smali_dir = file("${dir}/smali/art")
2156 if (smali_dir.exists()) {
2157 workingDir "${testDir}/smali/art"
2158 } else {
2159 workingDir "${testDir}/smali"
2160 }
Mads Ager418d1ca2017-05-22 09:35:49 +02002161 executable "/bin/bash"
Søren Gjesse34b77732017-07-07 13:56:21 +02002162 // This is the command line options for smali prior to 2.2.1, where smali got a new
2163 // command line interface.
2164 args "-c", "smali a *.smali"
2165 // This is the command line options for smali 2.2.1 and later.
2166 // args "-c", "smali -o out.dex *.smali"
Mads Ager418d1ca2017-05-22 09:35:49 +02002167 }
2168
2169 task "${copyCheckTask}"(type: Copy, dependsOn: sanitizeTask) {
2170 def smali_dir = file("${dir}/smali")
2171 outputs.upToDateWhen { false }
Rico Windde2af6c2019-03-26 15:21:08 +01002172 if (smali_dir.exists()) {
Mads Ager418d1ca2017-05-22 09:35:49 +02002173 dependsOn smaliToDexTask
2174 }
2175 from("${artTestDir}/${name}") {
2176 include 'check'
2177 }
2178 into testDir
2179 }
2180
2181 return copyCheckTask
2182}
2183
2184task javadocD8(type: Javadoc) {
Ian Zerny850f13d2018-01-04 11:25:38 +01002185 title "D8 API"
Mads Ager418d1ca2017-05-22 09:35:49 +02002186 classpath = sourceSets.main.compileClasspath
2187 source = sourceSets.main.allJava
Yohann Rousselb16d0f62017-10-09 16:08:09 +02002188 include '**/com/android/tools/r8/ArchiveClassFileProvider.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002189 include '**/com/android/tools/r8/ArchiveProgramResourceProvider.java'
Mads Ager418d1ca2017-05-22 09:35:49 +02002190 include '**/com/android/tools/r8/BaseCommand.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002191 include '**/com/android/tools/r8/BaseCompilerCommand.java'
Yohann Rousselb16d0f62017-10-09 16:08:09 +02002192 include '**/com/android/tools/r8/ClassFileResourceProvider.java'
Yohann Roussel078c9942017-11-28 15:55:46 +01002193 include '**/com/android/tools/r8/CompilationFailedException.java'
Mads Ager418d1ca2017-05-22 09:35:49 +02002194 include '**/com/android/tools/r8/CompilationMode.java'
2195 include '**/com/android/tools/r8/D8.java'
2196 include '**/com/android/tools/r8/D8Command.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002197 include '**/com/android/tools/r8/DexIndexedConsumer.java'
2198 include '**/com/android/tools/r8/DexFilePerClassFileConsumer.java'
Yohann Roussel078c9942017-11-28 15:55:46 +01002199 include '**/com/android/tools/r8/Diagnostic.java'
2200 include '**/com/android/tools/r8/DiagnosticsHandler.java'
Ian Zernyef028f52018-01-08 14:23:17 +01002201 include '**/com/android/tools/r8/DirectoryClassFileProvider.java'
2202 include '**/com/android/tools/r8/OutputMode.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002203 include '**/com/android/tools/r8/ProgramConsumer.java'
2204 include '**/com/android/tools/r8/ProgramResource.java'
2205 include '**/com/android/tools/r8/ProgramResourceProvider.java'
Mads Ager418d1ca2017-05-22 09:35:49 +02002206 include '**/com/android/tools/r8/Resource.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002207 include '**/com/android/tools/r8/ResourceException.java'
2208 include '**/com/android/tools/r8/StringConsumer.java'
2209 include '**/com/android/tools/r8/StringResource.java'
2210 include '**/com/android/tools/r8/Version.java'
2211 include '**/com/android/tools/r8/origin/*.java'
2212}
2213
2214task javadocR8(type: Javadoc) {
2215 title "R8 API"
2216 classpath = sourceSets.main.compileClasspath
2217 source = sourceSets.main.allJava
2218 include '**/com/android/tools/r8/ArchiveClassFileProvider.java'
2219 include '**/com/android/tools/r8/ArchiveProgramResourceProvider.java'
2220 include '**/com/android/tools/r8/BaseCommand.java'
2221 include '**/com/android/tools/r8/BaseCompilerCommand.java'
2222 include '**/com/android/tools/r8/ClassFileConsumer.java'
2223 include '**/com/android/tools/r8/ClassFileResourceProvider.java'
2224 include '**/com/android/tools/r8/CompilationFailedException.java'
2225 include '**/com/android/tools/r8/CompilationMode.java'
2226 include '**/com/android/tools/r8/R8.java'
2227 include '**/com/android/tools/r8/R8Command.java'
2228 include '**/com/android/tools/r8/DexIndexedConsumer.java'
2229 include '**/com/android/tools/r8/Diagnostic.java'
2230 include '**/com/android/tools/r8/DiagnosticsHandler.java'
Ian Zernyef028f52018-01-08 14:23:17 +01002231 include '**/com/android/tools/r8/DirectoryClassFileProvider.java'
2232 include '**/com/android/tools/r8/OutputMode.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002233 include '**/com/android/tools/r8/ProgramConsumer.java'
2234 include '**/com/android/tools/r8/ProgramResource.java'
2235 include '**/com/android/tools/r8/ProgramResourceProvider.java'
2236 include '**/com/android/tools/r8/Resource.java'
2237 include '**/com/android/tools/r8/ResourceException.java'
2238 include '**/com/android/tools/r8/StringConsumer.java'
2239 include '**/com/android/tools/r8/StringResource.java'
2240 include '**/com/android/tools/r8/Version.java'
Yohann Roussel078c9942017-11-28 15:55:46 +01002241 include '**/com/android/tools/r8/origin/*.java'
Mads Ager418d1ca2017-05-22 09:35:49 +02002242}
Søren Gjesse39a909a2017-10-12 09:49:20 +02002243
2244task copyMavenDeps(type: Copy) {
2245 from configurations.compile into "$buildDir/deps"
Morten Krogh-Jespersen75773302019-01-07 09:45:08 +01002246 from configurations.compileClasspath into "$buildDir/deps"
Søren Gjesse39a909a2017-10-12 09:49:20 +02002247 from configurations.testCompile into "$buildDir/deps"
2248}
Mikaël Peltier61633d42017-10-13 16:51:06 +02002249
Rico Wind23a05112019-03-27 08:00:44 +01002250task printMavenDeps {
2251 // Only actually print to stdout when we are updating.
2252 if (project.hasProperty('updatemavendeps')) {
2253 for (Configuration config : configurations) {
2254 if (!config.isCanBeResolved()) {
2255 continue
2256 }
2257 def componentIds = config.incoming.resolutionResult.allDependencies.collect {
2258 it.selected.id
2259 }
2260 def result = dependencies.createArtifactResolutionQuery()
2261 .forComponents(componentIds)
2262 .withArtifacts(MavenModule, MavenPomArtifact)
2263 .execute()
2264 for (component in result.resolvedComponents) {
2265 component.getArtifacts(MavenPomArtifact).each {
2266 println "POM: ${it.file} ${component.id}"
2267 }
2268 }
2269 config.each {
2270 println "JAR: ${it}"
2271 }
2272 }
2273 }
2274}