blob: ac517a19763eda494084498378203d6c3a32e69e [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 Jeon87caee62019-08-16 00:17:26 -070045 kotlinVersion = '1.3.41'
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",
Søren Gjesse70f75b12019-08-22 12:32:02 +0200310 "jsr223-api-1.0",
Søren Gjessef6c0a782019-08-22 12:48:46 +0200311 "rhino-android-1.1.1",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200312 "kotlin",
Ian Zerny23942992019-07-10 14:33:52 +0200313 "kotlin-compiler-1.3.41",
Mathias Rav5285faf2018-03-20 14:16:32 +0100314 "openjdk/openjdk-rt-1.8",
Søren Gjesse952e1d52019-05-28 12:51:30 +0200315 "openjdk/desugar_jdk_libs",
clementbera8dbfeda2019-07-03 11:24:13 +0200316 "openjdk/jdk-11-test",
Rico Windf72fa152018-10-22 15:41:03 +0200317 "proguard/proguard5.2.1",
318 "proguard/proguard6.0.1",
Mathias Rav891831f2018-04-26 14:51:18 +0200319 "r8",
Mads Ager418d1ca2017-05-22 09:35:49 +0200320 ],
321 // All dex-vms have a fixed OS of Linux, as they are only supported on Linux, and will be run in a Docker
322 // container on other platforms where supported.
323 "tools" : [
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200324 "linux/art",
325 "linux/art-5.1.1",
326 "linux/art-6.0.1",
327 "linux/art-7.0.0",
Søren Gjesse1528c022018-11-23 15:14:05 +0100328 "linux/art-8.1.0",
Søren Gjessefe7c0112018-12-03 12:33:12 +0100329 "linux/art-9.0.0",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200330 "linux/dalvik",
Stephan Herhut02f0f9d2018-01-04 10:27:31 +0100331 "linux/dalvik-4.0.4",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200332 "${osString}/dx",
Mads Ager418d1ca2017-05-22 09:35:49 +0200333 ]
334]
335
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100336def cloudSystemDependencies = [
337 linux: [
clementbera81738ec2019-04-11 11:32:31 +0200338 "third_party": ["openjdk/openjdk-9.0.4/linux",
clementberab4fa18d2019-04-12 09:09:40 +0200339 "openjdk/jdk8/linux-x86",
340 "openjdk/jdk-11/Linux"],
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100341 ],
342 osx: [
clementbera81738ec2019-04-11 11:32:31 +0200343 "third_party": ["openjdk/openjdk-9.0.4/osx",
clementberab4fa18d2019-04-12 09:09:40 +0200344 "openjdk/jdk8/darwin-x86",
345 "openjdk/jdk-11/Mac"],
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100346 ],
347 windows: [
clementberab4fa18d2019-04-12 09:09:40 +0200348 "third_party": ["openjdk/openjdk-9.0.4/windows",
349 "openjdk/jdk-11/Windows"],
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100350 ],
351]
352
353if (OperatingSystem.current().isWindows()) {
354 cloudSystemDependencies.windows.each { entry ->
355 cloudDependencies.get(entry.key).addAll(entry.value)
356 }
357} else if (OperatingSystem.current().isLinux()) {
358 cloudSystemDependencies.linux.each { entry ->
359 cloudDependencies.get(entry.key).addAll(entry.value)
360 }
361} else if (OperatingSystem.current().isMacOsX()) {
362 cloudSystemDependencies.osx.each { entry ->
363 cloudDependencies.get(entry.key).addAll(entry.value)
364 }
365} else {
366 println "WARNING: Unsupported system: " + OperatingSystem.current()
367}
368
369def getDownloadDepsTaskName(entryKey, entryFile) {
370 return "download_deps_${entryKey}_${entryFile.replace('/', '_').replace('\\', '_')}"
371}
372
Mads Ager418d1ca2017-05-22 09:35:49 +0200373cloudDependencies.each { entry ->
374 entry.value.each { entryFile ->
Ian Zernyb2d27c42019-02-20 09:09:41 +0100375 task "${getDownloadDepsTaskName(entry.key, entryFile)}"(type: DownloadDependency) {
376 type DownloadDependency.Type.GOOGLE_STORAGE
377 dependency "${entry.key}/${entryFile}"
Mads Ager418d1ca2017-05-22 09:35:49 +0200378 }
379 }
380}
381
382def x20Dependencies = [
383 "third_party": [
Rico Windc346c4a2018-10-23 08:04:16 +0200384 "benchmarks/kotlin-benches",
Jinseong Jeonb0c2dc02019-07-18 11:41:11 -0700385 "chrome/chrome_180917_ffbaa8",
Morten Krogh-Jespersen7bc93dc2019-01-29 09:53:08 +0100386 "classlib",
Morten Krogh-Jespersen480784d2019-02-05 08:10:46 +0100387 "cf_segments",
Rico Windf72fa152018-10-22 15:41:03 +0200388 "desugar/desugar_20180308",
Ian Zernybd2fdcc2019-03-22 13:57:21 +0100389 "internal/issue-127524985",
Rico Windf72fa152018-10-22 15:41:03 +0200390 "framework",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200391 "gmail/gmail_android_170604.16",
Søren Gjesseb552e842018-09-28 12:17:29 +0200392 "gmail/gmail_android_180826.15",
Rico Windf72fa152018-10-22 15:41:03 +0200393 "gmscore/gmscore_v10",
394 "gmscore/gmscore_v9",
395 "gmscore/latest",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200396 "gmscore/v4",
397 "gmscore/v5",
398 "gmscore/v6",
399 "gmscore/v7",
400 "gmscore/v8",
Christoffer Quist Adamsena2a58772018-10-03 09:47:46 +0200401 "nest/nest_20180926_7c6cfb",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200402 "photos/2017-06-06",
Rico Windf72fa152018-10-22 15:41:03 +0200403 "proguard/proguard_internal_159423826",
404 "proguardsettings",
Christoffer Quist Adamsen74288f02019-06-14 12:30:17 +0200405 "proto",
406 "protobuf-lite",
Sebastien Hertzf83b5902017-10-02 11:55:41 +0200407 "youtube/youtube.android_12.10",
408 "youtube/youtube.android_12.17",
409 "youtube/youtube.android_12.22",
Søren Gjessefe2de552018-09-24 16:31:10 +0200410 "youtube/youtube.android_13.37",
Rico Wind5acd2b62019-05-10 08:29:01 +0200411 "youtube/youtube.android_14.19"
Mads Ager418d1ca2017-05-22 09:35:49 +0200412 ],
413]
414
415x20Dependencies.each { entry ->
416 entry.value.each { entryFile ->
Ian Zernyb2d27c42019-02-20 09:09:41 +0100417 task "${getDownloadDepsTaskName(entry.key, entryFile)}"(type: DownloadDependency) {
418 type DownloadDependency.Type.X20
419 dependency "${entry.key}/${entryFile}"
Mads Ager418d1ca2017-05-22 09:35:49 +0200420 }
421 }
422}
423
Rico Wind897bb712017-05-23 10:44:29 +0200424task downloadProguard {
425 cloudDependencies.each { entry ->
426 entry.value.each { entryFile ->
427 if (entryFile.contains("proguard")) {
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100428 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Rico Wind897bb712017-05-23 10:44:29 +0200429 }
430 }
431 }
432}
433
Rico Windf6c74ce2018-12-04 08:50:55 +0100434task downloadOpenJDKrt {
435 cloudDependencies.each { entry ->
436 entry.value.each { entryFile ->
437 if (entryFile.contains("openjdk-rt")) {
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100438 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Rico Windf6c74ce2018-12-04 08:50:55 +0100439 }
440 }
441 }
442}
443
Tamas Kenez427205b2017-06-29 15:57:09 +0200444task downloadDx {
445 cloudDependencies.each { entry ->
446 entry.value.each { entryFile ->
Tamas Kenezcea7c202017-10-13 10:53:32 +0200447 if (entryFile.endsWith("/dx")) {
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100448 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Tamas Kenez427205b2017-06-29 15:57:09 +0200449 }
450 }
451 }
452}
453
Tamas Kenez0e10c562017-06-08 10:00:34 +0200454task downloadAndroidCts {
455 cloudDependencies.each { entry ->
456 entry.value.each { entryFile ->
457 if (entryFile.contains("android_cts_baseline")) {
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100458 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Tamas Kenez0e10c562017-06-08 10:00:34 +0200459 }
460 }
461 }
462}
463
Mads Ager418d1ca2017-05-22 09:35:49 +0200464task downloadDeps {
465 cloudDependencies.each { entry ->
466 entry.value.each { entryFile ->
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100467 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Mads Ager418d1ca2017-05-22 09:35:49 +0200468 }
469 }
470 if (!project.hasProperty('no_internal')) {
471 x20Dependencies.each { entry ->
472 entry.value.each { entryFile ->
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100473 dependsOn "${getDownloadDepsTaskName(entry.key, entryFile)}"
Mads Ager418d1ca2017-05-22 09:35:49 +0200474 }
475 }
476 }
477}
478
Morten Krogh-Jespersenccdb9e42019-09-02 19:45:38 +0200479task downloadMappingFilesForRetraceTests {
480 def hashes = [
481 "82710798b61fd70910d76d23a71e436356becb66",
482 "dab96bbe5948133f0ae6e0a88fc133464421cf47"
483 ]
484 outputs.files hashes.each { hash -> file("${buildDir}/retrace/${hash}-r8lib.jar.map") }
485 hashes.each { hash ->
486 def outputDir = new File("${buildDir}/retrace")
487 outputDir.mkdirs()
488 def output = new File("${buildDir}/retrace/${hash}-r8lib.jar.map")
489 output.createNewFile()
490 new URL("http://storage.googleapis.com/r8-releases/raw/master/${hash}/r8lib.jar.map")
491 .withInputStream { i -> output.withOutputStream { it << i } }
492 }
493}
494
Mads Ager418d1ca2017-05-22 09:35:49 +0200495allprojects {
496 sourceCompatibility = JavaVersion.VERSION_1_8
497 targetCompatibility = JavaVersion.VERSION_1_8
498}
499
Rico Wind266336c2019-02-25 10:11:38 +0100500// TODO(ricow): Remove debug prints
501println("NOTE: Current operating system: " + OperatingSystem.current())
502println("NOTE: Current operating system isWindows: " + OperatingSystem.current().isWindows())
503
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100504// Check if running with the JDK location from tools/jdk.py.
505if (OperatingSystem.current().isWindows()) {
506 println "NOTE: Running with JDK: " + org.gradle.internal.jvm.Jvm.current().javaHome
507} else {
508 def javaHomeOut = new StringBuilder()
509 def javaHomeErr = new StringBuilder()
510 def javaHomeProc = './tools/jdk.py'.execute()
511 javaHomeProc.waitForProcessOutput(javaHomeOut, javaHomeErr)
512 def jdkHome = new File(javaHomeOut.toString().trim())
513 if (!jdkHome.exists()) {
514 println "WARNING: Failed to find the ./tools/jdk.py specified JDK: " + jdkHome
515 } else if (jdkHome != org.gradle.internal.jvm.Jvm.current().javaHome) {
516 println("WARNING: Gradle is running in a non-pinned Java"
517 + ". Gradle Java Home: " + org.gradle.internal.jvm.Jvm.current().javaHome
518 + ". Expected: " + jdkHome)
Rico Wind266336c2019-02-25 10:11:38 +0100519 } else {
520 println("NOTE: Running with jdk from tools/jdk.py: " + jdkHome)
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100521 }
Mads Agerc7d14d32018-09-27 11:09:46 +0200522}
523
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100524sourceSets.configureEach { sourceSet ->
525 tasks.named(sourceSet.compileJavaTaskName).configure {
526 // Default disable errorprone (enabled and setup below).
527 options.errorprone.enabled = false
528 options.compilerArgs << '-Xlint:unchecked'
Ian Zerny09135aa2019-02-12 16:03:34 +0100529 // Run all compilation tasks in a forked subprocess.
530 options.fork = true
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100531 // Javac often runs out of stack space when compiling the tests.
532 // Increase the stack size for the javac process.
Ian Zerny09135aa2019-02-12 16:03:34 +0100533 options.forkOptions.jvmArgs << "-Xss4m"
Ian Zerny26307fb2019-03-06 15:18:17 +0100534 // Test compilation is sometimes hitting the default limit at 1g, increase it.
535 options.forkOptions.jvmArgs << "-Xmx2g"
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100536 // Set the bootclass path so compilation is consistent with 1.8 target compatibility.
537 options.forkOptions.jvmArgs << "-Xbootclasspath/a:third_party/openjdk/openjdk-rt-1.8/rt.jar"
538 }
Mads Ager418d1ca2017-05-22 09:35:49 +0200539}
540
Ian Zernyd3020482019-04-25 07:05:04 +0200541tasks.named(sourceSets.examplesJava9.compileJavaTaskName).get().configure {
542 def jdkDir = 'third_party/openjdk/openjdk-9.0.4/'
clementbera0fe940d2019-04-23 12:45:18 +0200543 options.fork = true
544 options.forkOptions.jvmArgs = []
545 if (OperatingSystem.current().isLinux()) {
Ian Zernyd3020482019-04-25 07:05:04 +0200546 options.forkOptions.javaHome = file(jdkDir + 'linux')
clementbera0fe940d2019-04-23 12:45:18 +0200547 } else if (OperatingSystem.current().isMacOsX()) {
Ian Zernyd3020482019-04-25 07:05:04 +0200548 options.forkOptions.javaHome = file(jdkDir + 'osx')
clementbera0fe940d2019-04-23 12:45:18 +0200549 } else {
Ian Zernyd3020482019-04-25 07:05:04 +0200550 options.forkOptions.javaHome = file(jdkDir + 'windows')
551 }
552 sourceCompatibility = JavaVersion.VERSION_1_9
553 targetCompatibility = JavaVersion.VERSION_1_9
554}
555
clementbera0bdd90f2019-07-06 11:15:23 +0200556def setJava11Compilation(sourceSet) {
557 tasks.named(sourceSet).get().configure {
558 def jdkDir = 'third_party/openjdk/jdk-11/'
559 options.fork = true
560 options.forkOptions.jvmArgs = []
561 if (OperatingSystem.current().isLinux()) {
562 options.forkOptions.javaHome = file(jdkDir + 'Linux')
563 } else if (OperatingSystem.current().isMacOsX()) {
564 options.forkOptions.javaHome = file(jdkDir + 'Mac/Contents/Home')
565 } else {
566 options.forkOptions.javaHome = file(jdkDir + 'Windows')
567 }
568 sourceCompatibility = JavaVersion.VERSION_11
569 targetCompatibility = JavaVersion.VERSION_11
clementbera0fe940d2019-04-23 12:45:18 +0200570 }
clementbera0fe940d2019-04-23 12:45:18 +0200571}
572
clementbera0bdd90f2019-07-06 11:15:23 +0200573setJava11Compilation(sourceSets.examplesJava11.compileJavaTaskName)
clementberaefa10522019-07-11 11:20:46 +0200574setJava11Compilation(sourceSets.examplesTestNGRunner.compileJavaTaskName)
clementbera4f9c2a92019-07-09 08:50:37 +0200575setJava11Compilation(sourceSets.jdk11TimeTests.compileJavaTaskName)
clementbera0bdd90f2019-07-06 11:15:23 +0200576
clementbera0bca05e2019-05-29 14:11:18 +0200577task compileMainWithJava11 (type: JavaCompile) {
578 def jdkDir = 'third_party/openjdk/jdk-11/'
579 options.fork = true
580 options.forkOptions.jvmArgs = []
581 if (OperatingSystem.current().isLinux()) {
582 options.forkOptions.javaHome = file(jdkDir + 'Linux')
583 } else if (OperatingSystem.current().isMacOsX()) {
Jake Whartona5204f32019-06-26 08:29:21 -0400584 options.forkOptions.javaHome = file(jdkDir + 'Mac/Contents/Home')
clementbera0bca05e2019-05-29 14:11:18 +0200585 } else {
586 options.forkOptions.javaHome = file(jdkDir + 'Windows')
587 }
588 source = sourceSets.main.allSource
589 destinationDir = file(java11ClassFiles)
590 sourceCompatibility = JavaVersion.VERSION_11
591 targetCompatibility = JavaVersion.VERSION_11
592 classpath = sourceSets.main.compileClasspath
593}
clementbera0fe940d2019-04-23 12:45:18 +0200594
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100595if (!project.hasProperty('without_error_prone') &&
596 // Don't enable error prone on Java 8 as the plugin setup does not support it.
597 !org.gradle.internal.jvm.Jvm.current().javaVersion.java8) {
Mikaël Peltierc9c1e8f2017-10-17 15:45:42 +0200598 compileJava {
599 // Enable error prone for D8/R8 sources.
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100600 options.errorprone.enabled = true
601 options.errorprone.disableAllChecks = true
602 options.errorprone.check('ClassCanBeStatic', CheckSeverity.ERROR)
603 options.errorprone.check('OperatorPrecedence', CheckSeverity.ERROR)
604 options.errorprone.check('RemoveUnusedImports', CheckSeverity.ERROR)
605 options.errorprone.check('MissingOverride', CheckSeverity.ERROR)
606 options.errorprone.check('IntLongMath', CheckSeverity.ERROR)
607 options.errorprone.check('EqualsHashCode', CheckSeverity.ERROR)
608 options.errorprone.check('InconsistentOverloads', CheckSeverity.ERROR)
609 options.errorprone.check('ArrayHashCode', CheckSeverity.ERROR)
610 options.errorprone.check('EqualsIncompatibleType', CheckSeverity.ERROR)
611 options.errorprone.check('NonOverridingEquals', CheckSeverity.ERROR)
612 options.errorprone.check('FallThrough', CheckSeverity.ERROR)
613 options.errorprone.check('MissingCasesInEnumSwitch', CheckSeverity.ERROR)
614 options.errorprone.check('MissingDefault', CheckSeverity.ERROR)
615 options.errorprone.check('MultipleTopLevelClasses', CheckSeverity.ERROR)
616 options.errorprone.check('NarrowingCompoundAssignment', CheckSeverity.ERROR)
617 options.errorprone.check('BoxedPrimitiveConstructor', CheckSeverity.ERROR)
618 options.errorprone.check('LogicalAssignment', CheckSeverity.ERROR)
619 options.errorprone.check('FloatCast', CheckSeverity.ERROR)
620 options.errorprone.check('ReturnValueIgnored', CheckSeverity.ERROR)
Mikaël Peltierc9c1e8f2017-10-17 15:45:42 +0200621 }
622}
623
Mads Ager418d1ca2017-05-22 09:35:49 +0200624compileJctfCommonJava {
625 dependsOn 'copyAdditionalJctfCommonFiles'
626 options.compilerArgs = ['-Xlint:none']
627}
628
629compileJctfTestsJava {
630 dependsOn 'jctfCommonClasses'
631 options.compilerArgs = ['-Xlint:none']
632}
633
Yohann Roussel7f47c032017-09-14 12:19:06 +0200634task consolidatedLicense {
Yohann Roussel7f47c032017-09-14 12:19:06 +0200635 def license = new File(new File(buildDir, 'generatedLicense'), 'LICENSE')
Mads Agerd1d0da92018-12-10 13:56:50 +0100636
Yohann Roussel7f47c032017-09-14 12:19:06 +0200637 inputs.files files('LICENSE', 'LIBRARY-LICENSE') + fileTree(dir: 'library-licensing')
Mads Agerd1d0da92018-12-10 13:56:50 +0100638 def runtimeClasspath = configurations.findByName("runtimeClasspath")
639 inputs.files { runtimeClasspath.getResolvedConfiguration().files }
640
Yohann Roussel7f47c032017-09-14 12:19:06 +0200641 outputs.files license
Mads Agerd1d0da92018-12-10 13:56:50 +0100642
Yohann Roussel7f47c032017-09-14 12:19:06 +0200643 doLast {
Mads Agerd1d0da92018-12-10 13:56:50 +0100644 def dependencies = []
645 runtimeClasspath.resolvedConfiguration.resolvedArtifacts.each {
646 def identifier = (ModuleComponentIdentifier) it.id.componentIdentifier
647 dependencies.add("${identifier.group}:${identifier.module}")
648 }
649 def libraryLicenses = file('LIBRARY-LICENSE').text
650 dependencies.each {
651 if (!libraryLicenses.contains("- artifact: $it")) {
652 throw new GradleException("No license for $it in LIBRARY_LICENSE")
653 }
654 }
655
Yohann Roussel7f47c032017-09-14 12:19:06 +0200656 license.getParentFile().mkdirs()
657 license.createNewFile()
658 license.text = "This file lists all licenses for code distributed.\n"
659 license.text += "All non-library code has the following 3-Clause BSD license.\n"
660 license.text += "\n"
661 license.text += "\n"
662 license.text += file('LICENSE').text
663 license.text += "\n"
664 license.text += "\n"
665 license.text += "Summary of distributed libraries:\n"
666 license.text += "\n"
Mads Agerd1d0da92018-12-10 13:56:50 +0100667 license.text += libraryLicenses
Yohann Roussel7f47c032017-09-14 12:19:06 +0200668 license.text += "\n"
669 license.text += "\n"
670 license.text += "Licenses details:\n"
671 fileTree(dir: 'library-licensing').getFiles().stream().sorted().forEach { file ->
672 license.text += "\n"
673 license.text += "\n"
674 license.text += file.text
675 }
676 }
677}
678
Morten Krogh-Jespersen00699af2018-10-09 10:54:42 +0200679static mergeServiceFiles(ShadowJar task) {
Jinseong Jeon40ceab02018-07-09 14:25:31 -0700680 // Everything under META-INF is not included by default.
681 // Should include before 'relocate' so that the service file path and its content
682 // are properly relocated as well.
683 task.mergeServiceFiles {
684 include 'META-INF/services/*'
685 }
Morten Krogh-Jespersen00699af2018-10-09 10:54:42 +0200686}
687
688static configureRelocations(ShadowJar task) {
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000689 task.relocate('com.google.common', 'com.android.tools.r8.com.google.common')
Mads Ager48dd79e2018-05-15 09:13:55 +0200690 task.relocate('com.google.gson', 'com.android.tools.r8.com.google.gson')
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000691 task.relocate('com.google.thirdparty', 'com.android.tools.r8.com.google.thirdparty')
692 task.relocate('joptsimple', 'com.android.tools.r8.joptsimple')
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000693 task.relocate('org.objectweb.asm', 'com.android.tools.r8.org.objectweb.asm')
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000694 task.relocate('it.unimi.dsi.fastutil', 'com.android.tools.r8.it.unimi.dsi.fastutil')
Søren Gjesse7c560852018-06-20 16:27:21 +0200695 task.relocate('kotlin', 'com.android.tools.r8.jetbrains.kotlin')
696 task.relocate('kotlinx', 'com.android.tools.r8.jetbrains.kotlinx')
697 task.relocate('org.jetbrains', 'com.android.tools.r8.org.jetbrains')
Søren Gjesse06ed1322018-06-21 11:15:07 +0200698 task.relocate('org.intellij', 'com.android.tools.r8.org.intellij')
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000699}
700
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100701task repackageDepsNoRelocate(type: ShadowJar) {
702 configurations = [project.configurations.runtimeClasspath]
703 mergeServiceFiles(it)
704 exclude { it.getRelativePath().getPathString() == "module-info.class" }
705 exclude { it.getRelativePath().getPathString().startsWith("META-INF/maven/") }
Morten Krogh-Jespersen54f196e2019-01-14 16:10:08 +0100706 baseName 'deps-not-relocated'
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100707}
708
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000709task repackageDeps(type: ShadowJar) {
Mads Ager64772812018-12-10 14:21:10 +0100710 configurations = [project.configurations.runtimeClasspath]
Morten Krogh-Jespersen00699af2018-10-09 10:54:42 +0200711 mergeServiceFiles(it)
712 if (!project.hasProperty('lib_no_relocate')) {
713 configureRelocations(it)
714 }
Ivan Gavrilovic2afc0cc2018-07-09 14:31:55 +0100715 exclude { it.getRelativePath().getPathString() == "module-info.class" }
Jinseong Jeon40ceab02018-07-09 14:25:31 -0700716 exclude { it.getRelativePath().getPathString().startsWith("META-INF/maven/") }
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000717 baseName 'deps'
718}
719
720task repackageSources(type: ShadowJar) {
Mads Ager418d1ca2017-05-22 09:35:49 +0200721 from sourceSets.main.output
Morten Krogh-Jespersen00699af2018-10-09 10:54:42 +0200722 mergeServiceFiles(it)
723 if (!project.hasProperty('lib_no_relocate')) {
724 configureRelocations(it)
725 }
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000726 baseName 'sources'
727}
728
clementbera0bca05e2019-05-29 14:11:18 +0200729task repackageSources11(type: ShadowJar) {
730 dependsOn compileMainWithJava11
731 from file(java11ClassFiles)
732 mergeServiceFiles(it)
733 if (!project.hasProperty('lib_no_relocate')) {
734 configureRelocations(it)
735 }
clementbera55e84822019-06-06 16:08:11 +0200736 baseName 'sources11'
clementbera0bca05e2019-05-29 14:11:18 +0200737}
738
Morten Krogh-Jespersen764f23a2018-12-10 15:47:11 +0100739task r8WithRelocatedDeps(type: ShadowJar) {
Morten Krogh-Jespersene47021f2018-10-10 11:08:23 +0200740 from consolidatedLicense.outputs.files
Morten Krogh-Jespersen764f23a2018-12-10 15:47:11 +0100741 baseName 'r8_with_relocated_deps'
Morten Krogh-Jespersene47021f2018-10-10 11:08:23 +0200742 classifier = null
743 version = null
744 manifest {
745 attributes 'Main-Class': 'com.android.tools.r8.SwissArmyKnife'
746 }
747 from repackageSources.outputs.files
Morten Krogh-Jespersen764f23a2018-12-10 15:47:11 +0100748 from repackageDeps.outputs.files
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100749 configureRelocations(it)
Ian Zerny80533c92019-01-24 10:32:09 +0100750 exclude "META-INF/*.kotlin_module"
Søren Gjesse09516862019-07-03 14:38:40 +0200751 exclude "**/*.kotlin_metadata"
Morten Krogh-Jespersene47021f2018-10-10 11:08:23 +0200752}
753
clementbera0bca05e2019-05-29 14:11:18 +0200754task r8WithRelocatedDeps11(type: ShadowJar) {
755 from consolidatedLicense.outputs.files
756 baseName 'r8_with_relocated_deps_11'
757 classifier = null
758 version = null
759 manifest {
760 attributes 'Main-Class': 'com.android.tools.r8.SwissArmyKnife'
761 }
762 from repackageSources11.outputs.files
763 from repackageDeps.outputs.files
764 configureRelocations(it)
765 exclude "META-INF/*.kotlin_module"
Søren Gjesse09516862019-07-03 14:38:40 +0200766 exclude "**/*.kotlin_metadata"
clementbera0bca05e2019-05-29 14:11:18 +0200767}
768
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100769task r8WithoutDeps(type: ShadowJar) {
770 from consolidatedLicense.outputs.files
771 baseName 'r8_without_deps'
772 classifier = null
773 version = null
774 manifest {
775 attributes 'Main-Class': 'com.android.tools.r8.SwissArmyKnife'
776 }
777 from sourceSets.main.output
778}
779
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000780task R8(type: ShadowJar) {
Yohann Roussel7f47c032017-09-14 12:19:06 +0200781 from consolidatedLicense.outputs.files
Mads Ager418d1ca2017-05-22 09:35:49 +0200782 baseName 'r8'
Mikaël Peltiere5e54722017-08-18 12:01:59 +0200783 classifier = null
784 version = null
Mads Ager418d1ca2017-05-22 09:35:49 +0200785 manifest {
Mathias Ravdd6a6de2018-05-18 10:18:33 +0200786 attributes 'Main-Class': 'com.android.tools.r8.SwissArmyKnife'
Mads Ager418d1ca2017-05-22 09:35:49 +0200787 }
788 // In order to build without dependencies, pass the exclude_deps property using:
789 // gradle -Pexclude_deps R8
790 if (!project.hasProperty('exclude_deps')) {
Gautam Korlamad356f22017-12-04 21:45:30 -0800791 from repackageSources.outputs.files
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000792 from repackageDeps.outputs.files
Gautam Korlamad356f22017-12-04 21:45:30 -0800793 } else {
794 from sourceSets.main.output
Mads Ager418d1ca2017-05-22 09:35:49 +0200795 }
Ian Zerny80533c92019-01-24 10:32:09 +0100796 exclude "META-INF/*.kotlin_module"
Søren Gjesse09516862019-07-03 14:38:40 +0200797 exclude "**/*.kotlin_metadata"
Mads Ager418d1ca2017-05-22 09:35:49 +0200798}
799
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100800task R8NoManifestNoDeps(type: ShadowJar) {
801 from consolidatedLicense.outputs.files
802 baseName 'r8nomanifest-exclude-deps'
803 classifier = null
804 version = null
805 from sourceSets.main.output
806}
807
Tamas Kenez8224fbc2018-12-10 09:57:56 +0100808task R8NoManifest(type: ShadowJar) {
809 from consolidatedLicense.outputs.files
810 baseName 'r8nomanifest'
811 classifier = null
812 version = null
813 // In order to build without dependencies, pass the exclude_deps property using:
814 // gradle -Pexclude_deps R8
815 if (!project.hasProperty('exclude_deps')) {
816 from repackageSources.outputs.files
817 from repackageDeps.outputs.files
818 } else {
819 from sourceSets.main.output
820 }
Ian Zerny80533c92019-01-24 10:32:09 +0100821 exclude "META-INF/*.kotlin_module"
Søren Gjesse09516862019-07-03 14:38:40 +0200822 exclude "**/*.kotlin_metadata"
Tamas Kenez8224fbc2018-12-10 09:57:56 +0100823}
824
Ivan Gavrilovic4876d2a2017-11-30 18:57:48 +0000825task D8(type: ShadowJar) {
Mathias Ravdd6a6de2018-05-18 10:18:33 +0200826 from R8.outputs.files
Mads Ager418d1ca2017-05-22 09:35:49 +0200827 baseName 'd8'
828 manifest {
mikaelpeltier80939312017-08-17 15:00:09 +0200829 attributes 'Main-Class': 'com.android.tools.r8.D8'
Mads Ager418d1ca2017-05-22 09:35:49 +0200830 }
Mads Ager418d1ca2017-05-22 09:35:49 +0200831}
832
Mathias Ravdd6a6de2018-05-18 10:18:33 +0200833task CompatDx(type: ShadowJar) {
834 from R8.outputs.files
Mads Ager418d1ca2017-05-22 09:35:49 +0200835 baseName 'compatdx'
836 manifest {
837 attributes 'Main-Class': 'com.android.tools.r8.compatdx.CompatDx'
838 }
Mads Ager418d1ca2017-05-22 09:35:49 +0200839}
840
Mathias Ravdd6a6de2018-05-18 10:18:33 +0200841task CompatProguard(type: ShadowJar) {
842 from R8.outputs.files
Søren Gjesse1d21da72017-09-01 12:05:38 +0200843 baseName 'compatproguard'
844 manifest {
845 attributes 'Main-Class': 'com.android.tools.r8.compatproguard.CompatProguard'
846 }
Lars Bak44cef522017-08-10 16:02:39 +0200847}
848
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100849def baseR8CommandLine(args = []) {
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100850 // Execute r8 commands against a stable r8 with relocated dependencies.
Morten Krogh-Jespersen4849e792019-08-20 13:27:13 +0200851 // TODO(b/139725780): See if we can remove or lower the heap size (-Xmx6g).
Rico Windcfb65512019-02-27 12:57:34 +0100852 return [org.gradle.internal.jvm.Jvm.current().getJavaExecutable(),
Morten Krogh-Jespersen4849e792019-08-20 13:27:13 +0200853 "-Xmx6g", "-ea", "-jar", r8WithRelocatedDeps.outputs.files[0]] + args
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100854}
855
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200856def r8CfCommandLine(input, output, pgConfs = [], args = ["--release"], libs = []) {
857 def allArgs = [
858 "--classfile",
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100859 input,
860 "--output", output,
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100861 "--pg-map-output", output + ".map",
862 "--lib", "third_party/openjdk/openjdk-rt-1.8/rt.jar"
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200863 ] + args + libs.collectMany { ["--lib", it] } + pgConfs.collectMany { ["--pg-conf", it] }
864 return baseR8CommandLine(allArgs)
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100865}
866
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200867def r8LibCreateTask(name, pgConfs = [], r8Task, output, args = ["--release"], libs = []) {
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100868 return tasks.create("r8Lib${name}", Exec) {
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200869 inputs.files ([pgConfs, r8WithRelocatedDeps.outputs, r8Task.outputs, libs])
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100870 outputs.file output
871 dependsOn downloadOpenJDKrt
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100872 dependsOn r8WithRelocatedDeps
873 dependsOn r8Task
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200874 commandLine r8CfCommandLine(r8Task.outputs.files[0], output, pgConfs, args, libs)
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +0100875 workingDir = projectDir
876 }
877}
878
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100879task testJar(type: ShadowJar, dependsOn: testClasses) {
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100880 baseName = "r8tests"
881 from sourceSets.test.output
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200882 // We only want to include tests that use R8 when generating keep rules for applymapping.
883 include "com/android/tools/r8/**"
884 include "dalvik/**"
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100885}
886
887def generateR8LibKeepRules(name, r8Source, testSource, output) {
888 return tasks.create("generateR8LibKeepRules_" + name, Exec) {
889 doFirst {
890 standardOutput new FileOutputStream(output)
891 }
892 dependsOn r8WithRelocatedDeps
893 dependsOn r8Source
894 dependsOn testSource
895 dependsOn downloadOpenJDKrt
896 inputs.files ([r8WithRelocatedDeps.outputs, r8Source.outputs, testSource.outputs])
897 outputs.file output
898 commandLine baseR8CommandLine([
899 "printuses",
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200900 "--keeprules-allowobfuscation",
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100901 "third_party/openjdk/openjdk-rt-1.8/rt.jar",
902 r8Source.outputs.files[0],
903 testSource.outputs.files[0]])
904 workingDir = projectDir
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100905 }
Morten Krogh-Jespersen4aa109f2018-12-21 13:27:51 +0100906}
907
Morten Krogh-Jespersencc5c7d02019-01-10 19:57:15 +0100908task R8LibApiOnly {
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200909 dependsOn r8LibCreateTask("Api", ["src/main/keep.txt"], R8NoManifest, r8LibPath)
Morten Krogh-Jespersencc5c7d02019-01-10 19:57:15 +0100910 outputs.file r8LibPath
911}
912
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +0100913task R8Lib {
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100914 def genRulesTask = generateR8LibKeepRules(
915 "Main",
916 R8NoManifest,
917 testJar,
918 r8LibGeneratedKeepRulesPath)
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100919 dependsOn r8LibCreateTask(
920 "Main",
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200921 ["src/main/keep.txt", "src/main/keep-applymapping.txt", genRulesTask.outputs.files[0]],
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +0100922 R8NoManifest,
923 r8LibPath,
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100924 ).dependsOn(genRulesTask)
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +0100925 outputs.file r8LibPath
Tamas Kenezf960e9c2018-12-03 16:13:29 +0100926}
927
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100928task R8LibNoDeps {
929 def genRulesTask = generateR8LibKeepRules(
930 "NoDeps",
931 R8NoManifestNoDeps,
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200932 testJar,
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100933 r8LibGeneratedKeepRulesExcludeDepsPath
934 )
935 dependsOn r8LibCreateTask(
936 "NoDeps",
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200937 ["src/main/keep.txt", "src/main/keep-applymapping.txt", genRulesTask.outputs.files[0]],
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100938 R8NoManifestNoDeps,
939 r8LibExludeDepsPath,
Søren Gjesse92992fe2019-08-30 14:04:22 +0200940 "--release",
Morten Krogh-Jespersencae32a72019-01-11 11:02:19 +0100941 repackageDepsNoRelocate.outputs.files
942 ).dependsOn(repackageDepsNoRelocate, genRulesTask)
943 outputs.file r8LibExludeDepsPath
944}
945
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +0100946task CompatDxLib {
947 dependsOn r8LibCreateTask(
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200948 "CompatDx", ["src/main/keep-compatdx.txt"], CompatDx, "build/libs/compatdxlib.jar")
Tamas Kenezf960e9c2018-12-03 16:13:29 +0100949}
950
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +0100951task CompatProguardLib {
952 dependsOn r8LibCreateTask(
953 "CompatPg",
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +0200954 ["src/main/keep-compatproguard.txt"],
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +0100955 CompatProguard,
956 "build/libs/compatproguardlib.jar")
Tamas Kenezf960e9c2018-12-03 16:13:29 +0100957}
958
Mads Ager418d1ca2017-05-22 09:35:49 +0200959task sourceJar(type: Jar, dependsOn: classes) {
960 classifier = 'src'
961 from sourceSets.main.allSource
962}
963
964task jctfCommonJar(type: Jar) {
965 from sourceSets.jctfCommon.output
966 baseName 'jctfCommon'
967}
968
969artifacts {
970 archives sourceJar
971}
972
973task createArtTests(type: Exec) {
974 def outputDir = "build/generated/test/java/com/android/tools/r8/art"
Mads Ager7e5bd722017-05-24 07:17:27 +0200975 def createArtTestsScript = "tools/create_art_tests.py"
Ian Zerny5fffb0a2019-02-11 13:54:22 +0100976 inputs.files files("tests/2017-10-04/art.tar.gz", createArtTestsScript)
Mads Ager418d1ca2017-05-22 09:35:49 +0200977 outputs.dir outputDir
978 dependsOn downloadDeps
Mads Ager677e3002017-05-24 07:54:51 +0200979 commandLine "python", createArtTestsScript
Mads Ager418d1ca2017-05-22 09:35:49 +0200980 workingDir = projectDir
981}
982
983task createJctfTests(type: Exec) {
Stephan Herhutea6ee582017-05-23 13:14:34 +0200984 def outputDir = "build/generated/test/java/com/android/tools/r8/jctf"
Tamas Kenez25a99e92017-05-29 10:15:30 +0200985 def script = "tools/create_jctf_tests.py"
Mads Ager418d1ca2017-05-22 09:35:49 +0200986 inputs.file script
987 outputs.dir outputDir
988 dependsOn downloadDeps
Tamas Kenez25a99e92017-05-29 10:15:30 +0200989 commandLine "python", script
Mads Ager418d1ca2017-05-22 09:35:49 +0200990 workingDir = projectDir
991}
992
993compileTestJava {
994 dependsOn createArtTests
995 dependsOn createJctfTests
996}
997
Morten Krogh-Jespersen7bc93dc2019-01-29 09:53:08 +0100998task buildCfSegments(type: Jar, dependsOn: downloadDeps) {
999 from sourceSets.cfSegments.output
1000 baseName 'cf_segments'
1001 destinationDir file('build/libs')
1002}
1003
Ian Zernyee23a172018-01-03 09:08:48 +01001004task buildD8ApiUsageSample(type: Jar) {
1005 from sourceSets.apiUsageSample.output
1006 baseName 'd8_api_usage_sample'
1007 destinationDir file('tests')
1008}
1009
Ian Zerny923a0c12018-01-03 10:59:18 +01001010task buildR8ApiUsageSample(type: Jar) {
1011 from sourceSets.apiUsageSample.output
1012 baseName 'r8_api_usage_sample'
1013 destinationDir file('tests')
1014}
1015
Yohann Roussel548ae942018-01-05 11:13:28 +01001016task buildApiSampleJars {
Yohann Roussel548ae942018-01-05 11:13:28 +01001017 dependsOn buildD8ApiUsageSample
1018 dependsOn buildR8ApiUsageSample
1019}
1020
Mads Ager418d1ca2017-05-22 09:35:49 +02001021task buildDebugInfoExamplesDex {
1022 def examplesDir = file("src/test/java")
1023 def hostJar = "debuginfo_examples.jar"
1024 def hostDexJar = "debuginfo_examples_dex.jar"
1025 task "compile_debuginfo_examples"(type: JavaCompile) {
1026 source = fileTree(dir: examplesDir, include: "com/android/tools/r8/debuginfo/*Test.java")
1027 destinationDir = file("build/test/debuginfo_examples/classes")
1028 classpath = sourceSets.main.compileClasspath
1029 sourceCompatibility = JavaVersion.VERSION_1_7
1030 targetCompatibility = JavaVersion.VERSION_1_7
1031 options.compilerArgs += ["-Xlint:-options"]
1032 }
1033 task "jar_debuginfo_examples"(type: Jar, dependsOn: "compile_debuginfo_examples") {
1034 archiveName = hostJar
1035 destinationDir = file("build/test/")
1036 from "build/test/debuginfo_examples/classes"
1037 include "**/*.class"
1038 }
1039 task "dex_debuginfo_examples"(type: Exec,
1040 dependsOn: ["jar_debuginfo_examples", "downloadDeps"]) {
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001041 if (OperatingSystem.current().isWindows()) {
1042 executable file("tools/windows/dx/bin/dx.bat")
Jinseong Jeon35a1eff2017-09-24 23:28:08 -07001043 } else if (OperatingSystem.current().isMacOsX()) {
1044 executable file("tools/mac/dx/bin/dx");
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001045 } else {
1046 executable file("tools/linux/dx/bin/dx");
1047 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001048 args "--dex"
1049 args "--output=build/test/${hostDexJar}"
1050 args "build/test/${hostJar}"
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001051 inputs.files files("build/test/${hostJar}")
Mads Ager418d1ca2017-05-22 09:35:49 +02001052 outputs.file file("build/test/${hostDexJar}")
1053 }
1054 dependsOn dex_debuginfo_examples
1055}
1056
1057task buildDebugTestResourcesJars {
Mads Ager418d1ca2017-05-22 09:35:49 +02001058 def resourcesDir = file("src/test/debugTestResources")
1059 def hostJar = "debug_test_resources.jar"
1060 task "compile_debugTestResources"(type: JavaCompile) {
1061 source = fileTree(dir: resourcesDir, include: '**/*.java')
1062 destinationDir = file("build/test/debugTestResources/classes")
1063 classpath = sourceSets.main.compileClasspath
1064 sourceCompatibility = JavaVersion.VERSION_1_7
1065 targetCompatibility = JavaVersion.VERSION_1_7
1066 options.compilerArgs += ["-g", "-Xlint:-options"]
1067 }
1068 task "jar_debugTestResources"(type: Jar, dependsOn: "compile_debugTestResources") {
1069 archiveName = hostJar
1070 destinationDir = file("build/test/")
1071 from "build/test/debugTestResources/classes"
1072 include "**/*.class"
1073 }
Sebastien Hertz964c5c22017-05-23 15:22:23 +02001074 def java8ResourcesDir = file("src/test/debugTestResourcesJava8")
1075 def java8HostJar = "debug_test_resources_java8.jar"
1076 task "compile_debugTestResourcesJava8"(type: JavaCompile) {
1077 source = fileTree(dir: java8ResourcesDir, include: '**/*.java')
1078 destinationDir = file("build/test/debugTestResourcesJava8/classes")
1079 classpath = sourceSets.main.compileClasspath
1080 sourceCompatibility = JavaVersion.VERSION_1_8
1081 targetCompatibility = JavaVersion.VERSION_1_8
1082 options.compilerArgs += ["-g", "-Xlint:-options"]
1083 }
1084 task "jar_debugTestResourcesJava8"(type: Jar, dependsOn: "compile_debugTestResourcesJava8") {
1085 archiveName = java8HostJar
1086 destinationDir = file("build/test/")
1087 from "build/test/debugTestResourcesJava8/classes"
1088 include "**/*.class"
1089 }
Sebastien Hertz1d7702b2017-08-18 09:07:27 +02001090 def kotlinResourcesDir = file("src/test/debugTestResourcesKotlin")
Sebastien Hertz2ac9bac2018-01-15 16:33:44 +00001091 def kotlinHostJar = "debug_test_resources_kotlin.jar"
1092 task "jar_debugTestResourcesKotlin"(type: kotlin.Kotlinc) {
1093 source = fileTree(dir: kotlinResourcesDir, include: '**/*.kt')
1094 destination = file("build/test/${kotlinHostJar}")
Sebastien Hertz1d7702b2017-08-18 09:07:27 +02001095 }
Sebastien Hertz964c5c22017-05-23 15:22:23 +02001096 dependsOn downloadDeps
Mads Ager418d1ca2017-05-22 09:35:49 +02001097 dependsOn jar_debugTestResources
Sebastien Hertz964c5c22017-05-23 15:22:23 +02001098 dependsOn jar_debugTestResourcesJava8
Sebastien Hertz2ac9bac2018-01-15 16:33:44 +00001099 dependsOn jar_debugTestResourcesKotlin
Mads Ager418d1ca2017-05-22 09:35:49 +02001100}
1101
Søren Gjesse5b4ee0a2018-01-30 13:46:39 +01001102// Examples used by tests, where Android specific APIs are used.
1103task buildExampleAndroidApi(type: JavaCompile) {
1104 source = fileTree(dir: file("src/test/examplesAndroidApi"), include: "**/*.java")
1105 destinationDir = file("build/test/examplesAndroidApi/classes")
1106 classpath = files("third_party/android_jar/lib-v26/android.jar")
1107 sourceCompatibility = JavaVersion.VERSION_1_8
1108 targetCompatibility = JavaVersion.VERSION_1_8
1109}
1110
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001111task buildExampleKotlinJars {
1112 def kotlinSrcDir = file("src/test/examplesKotlin")
1113 kotlinSrcDir.eachDir { dir ->
Sebastien Hertz2ac9bac2018-01-15 16:33:44 +00001114 def name = dir.getName();
1115 dependsOn "compile_example_kotlin_${name}"
1116 task "compile_example_kotlin_${name}"(type: kotlin.Kotlinc) {
1117 source = fileTree(dir: file("src/test/examplesKotlin/${name}"), include: '**/*.kt')
1118 destination = file("build/test/examplesKotlin/${name}.jar")
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001119 }
1120 }
1121}
1122
Christoffer Quist Adamsen74288f02019-06-14 12:30:17 +02001123task buildProtoGeneratedSources {
1124 def examplesProtoDir = file("src/test/examplesProto")
1125 examplesProtoDir.eachDir { dir ->
1126 def name = dir.getName()
1127 task "compile_proto_generated_source_${name}"(type: JavaCompile) {
1128 source = {
1129 file('third_party/proto').listFiles()
1130 .findAll { it.name.startsWith(name) && it.name.endsWith('-src.jar') }
1131 .collect { zipTree(it) }
1132 }
1133 destinationDir = file("build/generated/test/proto/${name}_classes")
1134 classpath = files("third_party/protobuf-lite/libprotobuf_lite.jar")
1135 sourceCompatibility = JavaVersion.VERSION_1_8
1136 targetCompatibility = JavaVersion.VERSION_1_8
1137 }
1138 task "jar_proto_generated_source_${name}"(type: Jar, dependsOn: "compile_proto_generated_source_${name}") {
1139 archiveName = "${name}.jar"
1140 destinationDir = file("build/generated/test/proto")
1141 from "build/generated/test/proto/${name}_classes"
1142 include "/**/*.class"
1143 }
1144 dependsOn "jar_proto_generated_source_${name}"
1145 }
1146}
1147
1148task buildExamplesProto {
1149 def examplesProtoDir = file("src/test/examplesProto")
1150 def examplesProtoOutputDir = file("build/test/examplesProto");
1151 dependsOn buildProtoGeneratedSources
1152 task "compile_examples_proto"(type: JavaCompile) {
1153 source = fileTree(dir: examplesProtoDir, include: "**/*.java")
1154 destinationDir = file("build/test/examplesProto/classes")
Christoffer Quist Adamsen5d398fe2019-06-14 15:00:14 +02001155 classpath = files("third_party/protobuf-lite/libprotobuf_lite.jar")
1156 classpath += fileTree(dir: "build/generated/test/proto", include: "*.jar")
Christoffer Quist Adamsen74288f02019-06-14 12:30:17 +02001157 sourceCompatibility = JavaVersion.VERSION_1_8
1158 targetCompatibility = JavaVersion.VERSION_1_8
1159 }
1160 examplesProtoDir.eachDir { dir ->
1161 def name = dir.getName()
1162 task "jar_examples_proto_${name}"(type: Jar, dependsOn: "compile_examples_proto") {
1163 archiveName = "${name}.jar"
1164 destinationDir = examplesProtoOutputDir
1165 from "build/test/examplesProto/classes"
1166 include name + "/**/*.class"
1167 }
1168 dependsOn "jar_examples_proto_${name}"
1169 }
1170}
1171
Lars Bakc91e87e2017-08-18 08:53:10 +02001172// Proto lite generated code yields warnings when compiling with javac.
1173// We change the options passed to javac to ignore it.
1174compileExamplesJava.options.compilerArgs = ["-Xlint:none"]
1175
Søren Gjesse7320ce52018-05-07 15:45:22 +02001176
Mads Ager418d1ca2017-05-22 09:35:49 +02001177task buildExampleJars {
Rico Wind897bb712017-05-23 10:44:29 +02001178 dependsOn downloadProguard
Mads Ager418d1ca2017-05-22 09:35:49 +02001179 def examplesDir = file("src/test/examples")
Jean-Marie Henaff872e4422017-06-13 10:26:20 +02001180 def proguardScript
1181 if (OperatingSystem.current().isWindows()) {
1182 proguardScript = "third_party/proguard/proguard5.2.1/bin/proguard.bat"
1183 } else {
1184 proguardScript = "third_party/proguard/proguard5.2.1/bin/proguard.sh"
1185 }
Stephan Herhut417a72a2017-07-18 10:38:30 +02001186 task extractExamplesRuntime(type: Sync) {
1187 dependsOn configurations.examplesRuntime
Ivan Gavrilovic635c7e52017-12-01 15:10:45 +00001188 from { configurations.examplesRuntime.collect { zipTree(it) } }
Stephan Herhut417a72a2017-07-18 10:38:30 +02001189 include "**/*.class"
1190 includeEmptyDirs false
1191 into "$buildDir/runtime/examples/"
1192 }
1193
Søren Gjesse7320ce52018-05-07 15:45:22 +02001194 task "copy_examples_resources"(type: org.gradle.api.tasks.Copy) {
1195 from examplesDir
1196 exclude "**/*.java"
1197 exclude "**/keep-rules*.txt"
1198 into file("build/test/examples/classes")
1199 }
1200
1201 task "compile_examples"(type: JavaCompile) {
Søren Gjesse7320ce52018-05-07 15:45:22 +02001202 dependsOn "copy_examples_resources"
Rico Wind40fd2c12018-09-12 12:14:44 +02001203 source examplesDir
Stephan Herhut417a72a2017-07-18 10:38:30 +02001204 include "**/*.java"
Mads Ager418d1ca2017-05-22 09:35:49 +02001205 destinationDir = file("build/test/examples/classes")
Stephan Herhut417a72a2017-07-18 10:38:30 +02001206 classpath = sourceSets.examples.compileClasspath
Mads Ager418d1ca2017-05-22 09:35:49 +02001207 sourceCompatibility = JavaVersion.VERSION_1_7
1208 targetCompatibility = JavaVersion.VERSION_1_7
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001209 options.compilerArgs = ["-g:source,lines", "-Xlint:none"]
1210 }
Rico Wind40fd2c12018-09-12 12:14:44 +02001211 task "compile_examples_debuginfo_all"(type: JavaCompile) {
1212 source examplesDir
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001213 include "**/*.java"
1214 destinationDir = file("build/test/examples/classes_debuginfo_all")
1215 classpath = sourceSets.examples.compileClasspath
1216 sourceCompatibility = JavaVersion.VERSION_1_7
1217 targetCompatibility = JavaVersion.VERSION_1_7
1218 options.compilerArgs = ["-g", "-Xlint:none"]
1219 }
Rico Wind40fd2c12018-09-12 12:14:44 +02001220 task "compile_examples_debuginfo_none"(type: JavaCompile) {
1221 source examplesDir
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001222 include "**/*.java"
1223 destinationDir = file("build/test/examples/classes_debuginfo_none")
1224 classpath = sourceSets.examples.compileClasspath
1225 sourceCompatibility = JavaVersion.VERSION_1_7
1226 targetCompatibility = JavaVersion.VERSION_1_7
1227 options.compilerArgs = ["-g:none", "-Xlint:none"]
Mads Ager418d1ca2017-05-22 09:35:49 +02001228 }
1229 examplesDir.eachDir { dir ->
1230 def name = dir.getName();
1231 def exampleOutputDir = file("build/test/examples");
1232 def jarName = "${name}.jar"
1233 dependsOn "jar_example_${name}"
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001234 dependsOn "jar_example_${name}_debuginfo_all"
1235 dependsOn "jar_example_${name}_debuginfo_none"
Stephan Herhut417a72a2017-07-18 10:38:30 +02001236 dependsOn "extractExamplesRuntime"
1237 def runtimeDependencies = copySpec { }
Mads Ager418d1ca2017-05-22 09:35:49 +02001238 // The "throwing" test verifies debugging/stack info on the post-proguarded output.
1239 def proguardConfigPath = "${dir}/proguard.cfg"
1240 if (new File(proguardConfigPath).exists()) {
1241 task "pre_proguard_example_${name}"(type: Jar, dependsOn: "compile_examples") {
1242 archiveName = "${name}_pre_proguard.jar"
1243 destinationDir = exampleOutputDir
1244 from "build/test/examples/classes"
Stephan Herhut417a72a2017-07-18 10:38:30 +02001245 include name + "/**/*.class"
1246 with runtimeDependencies
1247 includeEmptyDirs false
Mads Ager418d1ca2017-05-22 09:35:49 +02001248 }
1249 def jarPath = files(tasks.getByPath("pre_proguard_example_${name}")).files.first();
1250 def proguardJarPath = "${exampleOutputDir}/${jarName}"
1251 def proguardMapPath = "${exampleOutputDir}/${name}/${name}.map"
1252 task "jar_example_${name}"(type: Exec, dependsOn: "pre_proguard_example_${name}") {
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001253 inputs.files files(
1254 tasks.getByPath("pre_proguard_example_${name}"),
1255 proguardConfigPath)
Mads Ager418d1ca2017-05-22 09:35:49 +02001256 // Enable these to get stdout and stderr redirected to files...
1257 // standardOutput = new FileOutputStream('proguard.stdout')
1258 // errorOutput = new FileOutputStream('proguard.stderr')
Jean-Marie Henaff872e4422017-06-13 10:26:20 +02001259 def proguardArguments = "-verbose -dontwarn java.** -injars ${jarPath}" +
Mads Ager418d1ca2017-05-22 09:35:49 +02001260 " -outjars ${proguardJarPath}" +
1261 " -include ${proguardConfigPath}" +
Jean-Marie Henaff872e4422017-06-13 10:26:20 +02001262 " -printmapping ${proguardMapPath}"
1263 if (OperatingSystem.current().isWindows()) {
1264 executable "${proguardScript}"
1265 args "${proguardArguments}"
1266 } else {
1267 executable "bash"
1268 args "-c", "${proguardScript} '${proguardArguments}'"
1269 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001270 outputs.file proguardJarPath
1271 }
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001272 // TODO: Consider performing distinct proguard compilations.
1273 task "jar_example_${name}_debuginfo_all"(type: Copy, dependsOn: "jar_example_${name}") {
1274 from "${exampleOutputDir}/${name}.jar"
Tamas Kenez925cb642017-09-19 10:41:15 +02001275 into "${exampleOutputDir}"
1276 rename(".*", "${name}_debuginfo_all.jar")
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001277 }
1278 task "jar_example_${name}_debuginfo_none"(type: Copy, dependsOn: "jar_example_${name}") {
1279 from "${exampleOutputDir}/${name}.jar"
Tamas Kenez925cb642017-09-19 10:41:15 +02001280 into "${exampleOutputDir}"
1281 rename(".*", "${name}_debuginfo_none.jar")
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001282 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001283 } else {
1284 task "jar_example_${name}"(type: Jar, dependsOn: "compile_examples") {
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001285 archiveName = "${name}.jar"
Mads Ager418d1ca2017-05-22 09:35:49 +02001286 destinationDir = exampleOutputDir
1287 from "build/test/examples/classes"
Søren Gjesse7320ce52018-05-07 15:45:22 +02001288 include name + "/**/*"
Stephan Herhut417a72a2017-07-18 10:38:30 +02001289 with runtimeDependencies
Søren Gjesse7320ce52018-05-07 15:45:22 +02001290 includeEmptyDirs true
Mads Ager418d1ca2017-05-22 09:35:49 +02001291 }
Tamas Kenezc5163ed2017-09-19 09:27:37 +02001292 task "jar_example_${name}_debuginfo_all"(type: Jar, dependsOn: "compile_examples_debuginfo_all") {
1293 archiveName = "${name}_debuginfo_all.jar"
1294 destinationDir = exampleOutputDir
1295 from "build/test/examples/classes_debuginfo_all"
1296 include name + "/**/*.class"
1297 with runtimeDependencies
1298 includeEmptyDirs false
1299 }
1300 task "jar_example_${name}_debuginfo_none"(type: Jar, dependsOn: "compile_examples_debuginfo_none") {
1301 archiveName = "${name}_debuginfo_none.jar"
1302 destinationDir = exampleOutputDir
1303 from "build/test/examples/classes_debuginfo_none"
1304 include name + "/**/*.class"
1305 with runtimeDependencies
1306 includeEmptyDirs false
1307 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001308 }
1309 }
1310}
1311
1312task buildExampleAndroidNJars {
1313 dependsOn downloadDeps
1314 def examplesDir = file("src/test/examplesAndroidN")
1315 task "compile_examplesAndroidN"(type: JavaCompile) {
1316 source = fileTree(dir: examplesDir, include: '**/*.java')
1317 destinationDir = file("build/test/examplesAndroidN/classes")
1318 classpath = sourceSets.main.compileClasspath
1319 sourceCompatibility = JavaVersion.VERSION_1_8
1320 targetCompatibility = JavaVersion.VERSION_1_8
1321 options.compilerArgs += ["-Xlint:-options"]
1322 }
1323 examplesDir.eachDir { dir ->
1324 def name = dir.getName();
1325 def exampleOutputDir = file("build/test/examplesAndroidN");
1326 def jarName = "${name}.jar"
1327 dependsOn "jar_examplesAndroidN_${name}"
1328 task "jar_examplesAndroidN_${name}"(type: Jar, dependsOn: "compile_examplesAndroidN") {
1329 archiveName = jarName
1330 destinationDir = exampleOutputDir
1331 from "build/test/examplesAndroidN/classes"
1332 include "**/" + name + "/**/*.class"
1333 }
1334 }
1335}
1336
1337
1338task buildExampleAndroidOJars {
1339 dependsOn downloadDeps
1340 def examplesDir = file("src/test/examplesAndroidO")
1341 // NOTE: we want to enable a scenario when test needs to reference some
1342 // classes generated by legacy (1.6) Java compiler to test some specific
1343 // behaviour. To do so we compile all the java files located in sub-directory
1344 // called 'legacy' with Java 1.6, then compile the rest of the files with
1345 // Java 1.8 and a reference to previously generated 1.6 classes.
1346
1347 // Compiling all classes in dirs 'legacy' with old Java version.
1348 task "compile_examplesAndroidO_Legacy"(type: JavaCompile) {
1349 source = fileTree(dir: examplesDir, include: '**/legacy/**/*.java')
1350 destinationDir = file("build/test/examplesAndroidOLegacy/classes")
1351 classpath = sourceSets.main.compileClasspath
1352 sourceCompatibility = JavaVersion.VERSION_1_6
1353 targetCompatibility = JavaVersion.VERSION_1_6
1354 options.compilerArgs += ["-Xlint:-options", "-parameters"]
1355 }
1356 // Compiling the rest of the files as Java 1.8 code.
1357 task "compile_examplesAndroidO"(type: JavaCompile) {
1358 dependsOn "compile_examplesAndroidO_Legacy"
1359 source = fileTree(dir: examplesDir, include: '**/*.java', exclude: '**/legacy/**/*.java')
1360 destinationDir = file("build/test/examplesAndroidO/classes")
1361 classpath = sourceSets.main.compileClasspath
1362 classpath += files("build/test/examplesAndroidOLegacy/classes")
1363 sourceCompatibility = JavaVersion.VERSION_1_8
1364 targetCompatibility = JavaVersion.VERSION_1_8
1365 options.compilerArgs += ["-Xlint:-options", "-parameters"]
1366 }
1367 examplesDir.eachDir { dir ->
1368 def name = dir.getName();
1369 def destinationDir = file("build/test/examplesAndroidO/classes");
1370 if (file("src/test/examplesAndroidO/" + name + "/TestGenerator.java").isFile()) {
1371 task "generate_examplesAndroidO_${name}"(type: JavaExec,
1372 dependsOn: "compile_examplesAndroidO") {
1373 main = name + ".TestGenerator"
1374 classpath = files(destinationDir, sourceSets.main.compileClasspath)
1375 args destinationDir
1376 }
1377 } else {
1378 task "generate_examplesAndroidO_${name}" () {}
1379 }
1380 }
1381 examplesDir.eachDir { dir ->
1382 def name = dir.getName();
1383 def exampleOutputDir = file("build/test/examplesAndroidO");
1384 def jarName = "${name}.jar"
1385 dependsOn "jar_examplesAndroidO_${name}"
1386 task "jar_examplesAndroidO_${name}"(type: Jar, dependsOn: ["compile_examplesAndroidO",
1387 "generate_examplesAndroidO_${name}"]) {
1388 archiveName = jarName
1389 destinationDir = exampleOutputDir
1390 from "build/test/examplesAndroidO/classes" // Java 1.8 classes
1391 from "build/test/examplesAndroidOLegacy/classes" // Java 1.6 classes
1392 include "**/" + name + "/**/*.class"
1393 // Do not include generator into the test runtime jar, it is not useful.
1394 // Otherwise, shrinking will need ASM jars.
1395 exclude "**/TestGenerator*"
1396 }
1397 }
1398}
1399
Mikaël Peltier7b7b53a2017-10-09 13:33:21 +02001400task buildExampleAndroidPJars {
1401 dependsOn downloadDeps
1402 def examplesDir = file("src/test/examplesAndroidP")
1403
1404 task "compile_examplesAndroidP"(type: JavaCompile) {
1405 source = fileTree(dir: examplesDir, include: '**/*.java')
1406 destinationDir = file("build/test/examplesAndroidP/classes")
1407 classpath = sourceSets.main.compileClasspath
1408 sourceCompatibility = JavaVersion.VERSION_1_8
1409 targetCompatibility = JavaVersion.VERSION_1_8
1410 options.compilerArgs += ["-Xlint:-options"]
1411 }
1412 examplesDir.eachDir { dir ->
1413 def name = dir.getName();
1414 def destinationDir = file("build/test/examplesAndroidP/classes");
1415 if (file("src/test/examplesAndroidP/" + name + "/TestGenerator.java").isFile()) {
1416 task "generate_examplesAndroidP_${name}"(type: JavaExec,
1417 dependsOn: "compile_examplesAndroidP") {
1418 main = name + ".TestGenerator"
1419 classpath = files(destinationDir, sourceSets.main.compileClasspath)
1420 args destinationDir
1421 }
1422 } else {
1423 task "generate_examplesAndroidP_${name}" () {}
1424 }
1425 }
1426 examplesDir.eachDir { dir ->
1427 def name = dir.getName();
1428 def exampleOutputDir = file("build/test/examplesAndroidP");
1429 def jarName = "${name}.jar"
1430 dependsOn "jar_examplesAndroidP_${name}"
1431 task "jar_examplesAndroidP_${name}"(type: Jar,
1432 dependsOn: ["compile_examplesAndroidP",
1433 "generate_examplesAndroidP_${name}"]) {
1434 archiveName = jarName
1435 destinationDir = exampleOutputDir
1436 from "build/test/examplesAndroidP/classes" // Java 1.8 classes
1437 include "**/" + name + "/**/*.class"
1438 // Do not include generator into the test runtime jar, it is not useful.
1439 // Otherwise, shrinking will need ASM jars.
1440 exclude "**/TestGenerator*"
1441 }
1442 }
1443}
1444
Mikaël Peltier61633d42017-10-13 16:51:06 +02001445task buildExampleJava9Jars {
1446 def examplesDir = file("src/test/examplesJava9")
1447 examplesDir.eachDir { dir ->
1448 def name = dir.getName();
1449 def exampleOutputDir = file("build/test/examplesJava9");
1450 def jarName = "${name}.jar"
1451 dependsOn "jar_examplesJava9_${name}"
1452 task "jar_examplesJava9_${name}"(type: Jar) {
1453 archiveName = jarName
1454 destinationDir = exampleOutputDir
Ian Zernyd3020482019-04-25 07:05:04 +02001455 from sourceSets.examplesJava9.output
Mikaël Peltier61633d42017-10-13 16:51:06 +02001456 include "**/" + name + "/**/*.class"
1457 }
1458 }
1459}
1460
clementberad7ab1dd2019-04-16 16:05:00 +02001461task buildExampleJava11Jars {
1462 def examplesDir = file("src/test/examplesJava11")
1463 examplesDir.eachDir { dir ->
1464 def name = dir.getName();
1465 def exampleOutputDir = file("build/test/examplesJava11");
1466 def jarName = "${name}.jar"
1467 dependsOn "jar_examplesJava11_${name}"
1468 task "jar_examplesJava11_${name}"(type: Jar) {
1469 archiveName = jarName
1470 destinationDir = exampleOutputDir
Ian Zernyd3020482019-04-25 07:05:04 +02001471 from sourceSets.examplesJava11.output
clementberad7ab1dd2019-04-16 16:05:00 +02001472 include "**/" + name + "/**/*.class"
1473 }
1474 }
1475}
1476
clementberaa92e3cd2019-07-12 14:13:22 +02001477task provideArtFrameworksDependencies {
1478 cloudDependencies.tools.forEach({ art ->
1479 if (art.contains("art")) {
1480 def taskName = art.replace('/','_')
1481 dependsOn "patch_${taskName}"
1482 task "patch_${taskName}"(type: org.gradle.api.tasks.Copy){
1483 from "tools/${art}/framework"
1484 include "**.jar"
1485 into file("tools/${art}/out/host/linux-x86/framework")
1486 }
1487 }
1488 })
1489}
1490
clementbera4f9c2a92019-07-09 08:50:37 +02001491task provideJdk11TestsDependencies(type: org.gradle.api.tasks.Copy) {
1492 from sourceSets.jdk11TimeTests.compileClasspath
1493 include "**/**.jar"
1494 into file("build/test/jdk11Tests")
1495}
1496
1497task buildJdk11TimeTestsJar {
1498 def exampleOutputDir = file("build/test/jdk11Tests");
1499 def jarName = "jdk11TimeTests.jar"
1500 dependsOn "jar_jdk11TimeTests"
1501 dependsOn provideJdk11TestsDependencies
1502 task "jar_jdk11TimeTests"(type: Jar) {
1503 archiveName = jarName
1504 destinationDir = exampleOutputDir
clementberaefa10522019-07-11 11:20:46 +02001505 from sourceSets.examplesTestNGRunner.output
clementbera4f9c2a92019-07-09 08:50:37 +02001506 include "**.class"
1507 from sourceSets.jdk11TimeTests.output
1508 include "**.class"
1509 include "**/**.class"
1510 }
1511}
1512
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001513task buildExamplesKotlin {
1514 if (OperatingSystem.current().isMacOsX() || OperatingSystem.current().isWindows()) {
1515 logger.lifecycle("WARNING: Testing (including building kotlin examples) is only partially" +
1516 " supported on your platform (" + OperatingSystem.current().getName() + ").")
1517 } else if (!OperatingSystem.current().isLinux()) {
1518 logger.lifecycle("WARNING: Testing (including building kotlin examples) is not supported " +
1519 "on your platform. It is fully supported on Linux and partially supported on " +
1520 "Mac OS and Windows")
1521 return;
1522 }
1523 def examplesDir = file("src/test/examplesKotlin")
1524 examplesDir.eachDir { dir ->
Sebastien Hertz2ac9bac2018-01-15 16:33:44 +00001525 def name = dir.getName();
1526 dependsOn "dex_example_kotlin_${name}"
1527 def exampleOutputDir = file("build/test/examplesKotlin/" + name);
1528 def dexPath = file("${exampleOutputDir}")
1529 task "dex_example_kotlin_${name}"(type: dx.Dx,
1530 dependsOn: "compile_example_kotlin_${name}") {
1531 doFirst {
1532 if (!dexPath.exists()) {
1533 dexPath.mkdirs()
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001534 }
1535 }
Sebastien Hertz2ac9bac2018-01-15 16:33:44 +00001536 source = files(tasks.getByPath("compile_example_kotlin_${name}")).asFileTree
1537 destination = dexPath
1538 debug = false
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001539 }
1540 }
1541}
1542
Sebastien Hertzd3313772018-01-16 14:12:37 +01001543task buildKotlinR8TestResources {
1544 def examplesDir = file("src/test/kotlinR8TestResources")
1545 examplesDir.eachDir { dir ->
Sebastien Hertzfe97a712018-02-13 12:08:59 +01001546 kotlin.Kotlinc.KotlinTargetVersion.values().each { kotlinTargetVersion ->
1547 def name = dir.getName()
1548 def taskName = "jar_kotlinR8TestResources_${name}_${kotlinTargetVersion}"
Morten Krogh-Jespersen6c1f2fa2019-01-04 13:23:13 +00001549 def outputFile = "build/test/kotlinR8TestResources/${kotlinTargetVersion}/${name}.jar"
1550 def javaOutput = "build/test/kotlinR8TestResources/${kotlinTargetVersion}/${name}/java"
Denis Vnukovc22da842018-03-14 12:57:20 -07001551 def javaOutputJarName = "${name}.java.jar"
Morten Krogh-Jespersen6c1f2fa2019-01-04 13:23:13 +00001552 def javaOutputJarDir = "build/test/kotlinR8TestResources/${kotlinTargetVersion}"
Denis Vnukovc22da842018-03-14 12:57:20 -07001553 task "${taskName}Kotlin"(type: kotlin.Kotlinc) {
1554 source = fileTree(dir: file("${examplesDir}/${name}"),
1555 include: ['**/*.kt', '**/*.java'])
Sebastien Hertzfe97a712018-02-13 12:08:59 +01001556 destination = file(outputFile)
1557 targetVersion = kotlinTargetVersion
1558 }
Denis Vnukovc22da842018-03-14 12:57:20 -07001559 task "${taskName}Java"(type: JavaCompile) {
1560 source = fileTree(dir: file("${examplesDir}/${name}"), include: '**/*.java')
1561 destinationDir = file(javaOutput)
1562 classpath = sourceSets.main.compileClasspath
1563 sourceCompatibility = JavaVersion.VERSION_1_6
1564 targetCompatibility = JavaVersion.VERSION_1_6
1565 options.compilerArgs += ["-g", "-Xlint:-options"]
1566 }
1567 task "${taskName}JavaJar"(type: Jar, dependsOn: "${taskName}Java") {
1568 archiveName = javaOutputJarName
1569 destinationDir = file(javaOutputJarDir)
1570 from javaOutput
1571 include "**/*.class"
1572 }
1573 dependsOn "${taskName}Kotlin", "${taskName}JavaJar"
Sebastien Hertzd3313772018-01-16 14:12:37 +01001574 }
Sebastien Hertzd3313772018-01-16 14:12:37 +01001575 }
1576}
1577
Mads Ager418d1ca2017-05-22 09:35:49 +02001578task buildExamples {
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001579 if (OperatingSystem.current().isMacOsX() || OperatingSystem.current().isWindows()) {
1580 logger.lifecycle("WARNING: Testing (including building examples) is only partially supported on your " +
1581 "platform (" + OperatingSystem.current().getName() + ").")
Mads Ager418d1ca2017-05-22 09:35:49 +02001582 } else if (!OperatingSystem.current().isLinux()) {
1583 logger.lifecycle("WARNING: Testing (including building examples) is not supported on your platform. " +
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001584 "It is fully supported on Linux and partially supported on Mac OS and Windows")
Mads Ager418d1ca2017-05-22 09:35:49 +02001585 return;
1586 }
1587 dependsOn buildDebugTestResourcesJars
1588 dependsOn buildExampleJars
1589 dependsOn buildExampleAndroidNJars
1590 dependsOn buildExampleAndroidOJars
Mikaël Peltier7b7b53a2017-10-09 13:33:21 +02001591 dependsOn buildExampleAndroidPJars
Mikaël Peltier61633d42017-10-13 16:51:06 +02001592 dependsOn buildExampleJava9Jars
clementberad7ab1dd2019-04-16 16:05:00 +02001593 dependsOn buildExampleJava11Jars
Søren Gjesse5b4ee0a2018-01-30 13:46:39 +01001594 dependsOn buildExampleAndroidApi
Mads Ager418d1ca2017-05-22 09:35:49 +02001595 def examplesDir = file("src/test/examples")
Yohann Rousself820a572017-05-31 20:25:51 +02001596 def noDexTests = [
1597 "multidex",
1598 "multidex002",
1599 "multidex004",
1600 ]
Mads Ager418d1ca2017-05-22 09:35:49 +02001601 examplesDir.eachDir { dir ->
1602 def name = dir.getName();
Yohann Rousself820a572017-05-31 20:25:51 +02001603 if (!(name in noDexTests)) {
1604 dependsOn "dex_example_${name}"
1605 def exampleOutputDir = file("build/test/examples/" + name);
1606 def dexPath = file("${exampleOutputDir}")
1607 def debug = (name == "throwing")
1608 if (!dexPath.exists()) {
1609 dexPath.mkdirs()
1610 }
1611 task "dex_example_${name}"(type: dx.Dx, dependsOn: "jar_example_${name}") {
1612 source = files(tasks.getByPath("jar_example_${name}")).asFileTree
1613 destination = dexPath
1614 debug = debug
1615 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001616 }
1617 }
1618}
1619
1620task buildSmali {
1621 def smaliDir = file("src/test/smali")
1622 smaliDir.eachDirRecurse() { dir ->
1623 def name = dir.getName();
1624 def relativeDir = smaliDir.toPath().relativize(dir.toPath());
1625 def smaliOutputDir = file("build/test/smali/" + relativeDir);
1626 smaliOutputDir.mkdirs()
1627 outputs.dir smaliOutputDir
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001628 def taskName = "smali_build_${relativeDir.toString().replace('/', '_').replace('\\', '_')}"
Mads Ager418d1ca2017-05-22 09:35:49 +02001629 def smaliFiles = fileTree(dir: dir, include: '*.smali')
1630 def javaFiles = fileTree(dir: dir, include: '*.java')
1631 def destDir = smaliOutputDir;
1632 def destFile = destDir.toPath().resolve("${name}.dex").toFile()
1633 def intermediateFileName = "${name}-intermediate.dex";
1634 def intermediateFile = destDir.toPath().resolve(intermediateFileName).toFile()
1635 if (javaFiles.empty) {
1636 if (!smaliFiles.empty) {
1637 dependsOn "${taskName}_smali"
1638 task "${taskName}_smali"(type: smali.Smali) {
1639 source = smaliFiles
1640 destination = destFile
1641 }
1642 }
1643 } else {
1644 dependsOn "${taskName}_dexmerger"
1645 task "${taskName}_smali"(type: smali.Smali) {
1646 source = smaliFiles
1647 destination = intermediateFile
1648 }
1649 task "${taskName}_java"(type: JavaCompile) {
1650 source = javaFiles
1651 destinationDir destDir
1652 classpath = sourceSets.main.compileClasspath
1653 sourceCompatibility = JavaVersion.VERSION_1_7
1654 targetCompatibility = JavaVersion.VERSION_1_7
1655 options.compilerArgs += ["-Xlint:-options"]
1656 }
1657 task "${taskName}_jar"(type: Jar, dependsOn: "${taskName}_java") {
1658 archiveName = "Test.jar"
1659 destinationDir = destDir
1660 from fileTree(dir: destDir, include: 'Test.class')
1661 }
1662 task "${taskName}_dx"(type: dx.Dx, dependsOn: "${taskName}_jar") {
1663 source = fileTree(dir: destDir, include: 'Test.jar')
1664 destination = destDir
1665 }
1666 task "${taskName}_dexmerger"(
1667 type: dx.DexMerger, dependsOn: ["${taskName}_dx", "${taskName}_smali"]) {
1668 source = fileTree(dir: destDir, include: ["classes.dex", intermediateFileName])
1669 destination = destFile
1670 }
1671 }
1672 }
1673}
1674
1675tasks.withType(Test) {
Rico Windc56f21c2019-03-12 07:29:57 +01001676 println("NOTE: Number of processors " + Runtime.runtime.availableProcessors())
Mads Ager418d1ca2017-05-22 09:35:49 +02001677 def userDefinedCoresPerFork = System.getenv('R8_GRADLE_CORES_PER_FORK')
1678 def coresPerFork = userDefinedCoresPerFork ? userDefinedCoresPerFork.toInteger() : 3
1679 // See https://docs.gradle.org/current/dsl/org.gradle.api.tasks.testing.Test.html.
Rico Wind3defc8d2019-03-27 08:07:31 +01001680 maxParallelForks = (Runtime.runtime.availableProcessors().intdiv(coresPerFork) ?: 1) + 1
Rico Windc56f21c2019-03-12 07:29:57 +01001681 println("NOTE: Max parallel forks " + maxParallelForks)
Mads Ager418d1ca2017-05-22 09:35:49 +02001682 forkEvery = 0
Søren Gjesseaf1c5e22017-06-15 12:24:03 +02001683 if (project.hasProperty('disable_assertions')) {
1684 enableAssertions = false
1685 }
Ian Zerny16c2f2d2019-02-19 07:25:11 +01001686 // TODO(b/124091860): Increase the max heap size to avoid OOM when running tests.
Rico Wind97b0a992019-08-30 11:09:15 +02001687 if (project.hasProperty('test_xmx')) {
1688 maxHeapSize = project.property('test_xmx')
1689 } else {
1690 maxHeapSize = "4G"
1691 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001692}
1693
1694task buildPreNJdwpTestsJar(type: Jar) {
1695 baseName = 'jdwp-tests-preN'
1696 from zipTree('third_party/jdwp-tests/apache-harmony-jdwp-tests-host.jar')
1697 // Exclude the classes containing java8
1698 exclude 'org/apache/harmony/jpda/tests/jdwp/InterfaceType/*.class'
1699 exclude 'org/apache/harmony/jpda/tests/jdwp/ObjectReference/InvokeMethodDefault*.class'
1700 includeEmptyDirs = false
1701}
1702
Ian Zerny74143162017-11-24 13:46:35 +01001703task buildPreNJdwpTestsDex(type: Exec, dependsOn: "buildPreNJdwpTestsJar") {
1704 def inFile = buildPreNJdwpTestsJar.archivePath
1705 def outFile = new File(buildPreNJdwpTestsJar.destinationDir, buildPreNJdwpTestsJar.baseName + '-dex.jar')
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001706 inputs.files files(inFile)
Ian Zerny74143162017-11-24 13:46:35 +01001707 outputs.file outFile
1708 if (OperatingSystem.current().isWindows()) {
1709 executable file("tools/windows/dx/bin/dx.bat")
1710 } else if (OperatingSystem.current().isMacOsX()) {
1711 executable file("tools/mac/dx/bin/dx");
1712 } else {
1713 executable file("tools/linux/dx/bin/dx");
1714 }
1715 args "--dex"
1716 args "--output=${outFile}"
1717 args inFile
1718}
1719
Ivan Gavrilovic635c7e52017-12-01 15:10:45 +00001720task getJarsFromSupportLibs(type: GetJarsFromConfiguration) {
1721 setConfiguration(configurations.supportLibs)
Yohann Roussel126f6872017-08-03 16:25:32 +02001722}
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +02001723def getR8LibSourceTask() {
1724 if (project.hasProperty('r8lib')) {
1725 return R8NoManifest
1726 } else if (project.hasProperty('r8lib_no_deps')) {
1727 return R8NoManifestNoDeps
1728 }
1729 return null
1730}
Yohann Roussel126f6872017-08-03 16:25:32 +02001731
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001732def getR8LibTask() {
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +01001733 if (project.hasProperty('r8lib')) {
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001734 return R8Lib
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +01001735 } else if (project.hasProperty('r8lib_no_deps')) {
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001736 return R8LibNoDeps
Morten Krogh-Jespersenb39fbe52018-12-17 14:58:48 +01001737 }
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001738 return null
1739}
1740
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +02001741task generateR8TestKeepRules {
1742 def path = "build/generated/r8tests-keep.txt"
1743 outputs.file path
1744 if (getR8LibTask() != null) {
1745 dependsOn getR8LibTask()
1746 doLast {
1747 file(path).write """-keep class ** { *; }
1748-dontshrink
1749-dontoptimize
1750-keepattributes *
1751-applymapping ${getR8LibTask().outputs.files[0]}.map
1752"""
1753 }
1754 }
1755}
1756
1757task buildR8LibCfTestDeps(type: Exec) {
1758 if (getR8LibTask() == null) {
1759 return
1760 }
1761 def outputPath = "build/libs/r8libtestdeps-cf.jar"
1762 dependsOn downloadDeps
1763 dependsOn getR8LibTask()
1764 dependsOn getR8LibSourceTask()
1765 dependsOn generateR8TestKeepRules
1766 dependsOn testJar
1767 // Take all .jar files as libraries and append the generated test classes in classes/java/test.
1768 def addedLibraries = sourceSets.test.runtimeClasspath.findAll { pkg ->
1769 return pkg.toString().endsWith(".jar")
1770 } + ["${buildDir}/classes/java/test"]
1771 inputs.files testJar.outputs.files +
1772 generateR8TestKeepRules.outputs.files +
1773 getR8LibTask().outputs
1774 commandLine = r8CfCommandLine(
1775 testJar.outputs.files[0],
1776 outputPath,
1777 [generateR8TestKeepRules.outputs.files[0]],
1778 ["--debug", "--classpath", getR8LibSourceTask().outputs.files[0]],
1779 getR8LibSourceTask().outputs.files + addedLibraries)
1780 workingDir = projectDir
1781 outputs.file outputPath
1782}
1783
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001784task configureTestForR8Lib(type: Copy) {
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +01001785 dependsOn testJar
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +02001786 inputs.files buildR8LibCfTestDeps.outputs
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001787 if (getR8LibTask() != null) {
Morten Krogh-Jespersene0616982019-01-03 12:42:36 +01001788 dependsOn getR8LibTask()
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +01001789 delete r8LibTestPath
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +02001790 from zipTree(buildR8LibCfTestDeps.outputs.files[0])
1791 def examplesDir = file("build/test")
1792 examplesDir.eachDir { dir ->
1793 from ("${buildDir}/test/${dir.getName()}/classes")
1794 }
1795 from ("${buildDir}/runtime/examples")
Morten Krogh-Jespersene28db462019-01-09 13:32:15 +01001796 into r8LibTestPath
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001797 }
1798 outputs.dir r8LibTestPath
Morten Krogh-Jespersen807b15f2018-12-17 14:24:22 +01001799}
1800
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001801def printStackTrace(TestResult result) {
1802 if (project.hasProperty('r8lib') || project.hasProperty('r8lib_no_deps')) {
1803 def out = new StringBuffer()
1804 def err = new StringBuffer()
Rico Windacc291f2019-03-06 11:36:33 +01001805 def command = "python tools/retrace.py"
Morten Krogh-Jespersen046b18e2019-01-17 15:40:14 +01001806 def header = "RETRACED STACKTRACE";
1807 if (System.getenv('BUILDBOT_BUILDERNAME') != null
1808 && !System.getenv('BUILDBOT_BUILDERNAME').endsWith("_release")) {
1809 header += ": (${command} --commit_hash ${System.getenv('BUILDBOT_REVISION')})";
1810 }
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001811 out.append("\n--------------------------------------\n")
Morten Krogh-Jespersen046b18e2019-01-17 15:40:14 +01001812 out.append("${header}\n")
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001813 out.append("--------------------------------------\n")
1814 Process process = command.execute()
1815 def processIn = new PrintStream(process.getOut())
1816 process.consumeProcessOutput(out, err)
1817 result.exception.printStackTrace(processIn)
1818 processIn.flush()
1819 processIn.close()
1820 process.waitFor()
1821 out.append("\n\n--------------------------------------\n")
1822 out.append("OBFUSCATED STACKTRACE\n")
1823 out.append("--------------------------------------\n")
1824 result.exceptions.add(0, new Exception(out.toString()))
1825 } else {
1826 result.exception.printStackTrace()
1827 }
1828}
1829
Mads Ager418d1ca2017-05-22 09:35:49 +02001830test {
Jean-Marie Henaff7a64eec2018-05-31 15:30:35 +02001831 if (project.hasProperty('generate_golden_files_to')) {
1832 systemProperty 'generate_golden_files_to', project.property('generate_golden_files_to')
1833 assert project.hasProperty('HEAD_sha1')
1834 systemProperty 'test_git_HEAD_sha1', project.property('HEAD_sha1')
1835 }
1836
1837 if (project.hasProperty('use_golden_files_in')) {
1838 systemProperty 'use_golden_files_in', project.property('use_golden_files_in')
1839 assert project.hasProperty('HEAD_sha1')
1840 systemProperty 'test_git_HEAD_sha1', project.property('HEAD_sha1')
1841 }
Ian Zerny4b0de282019-06-28 09:32:24 +02001842
Ivan Gavrilovic635c7e52017-12-01 15:10:45 +00001843 dependsOn getJarsFromSupportLibs
Morten Krogh-Jespersen75c38f72018-10-05 09:02:11 +02001844 // R8.jar is required for running bootstrap tests.
1845 dependsOn R8
Mads Ager418d1ca2017-05-22 09:35:49 +02001846 testLogging.exceptionFormat = 'full'
1847 if (project.hasProperty('print_test_stdout')) {
1848 testLogging.showStandardStreams = true
1849 }
Tamas Kenez0cad51c2017-08-21 14:42:01 +02001850 if (project.hasProperty('dex_vm') && project.property('dex_vm') != 'default') {
Ian Zerny324d7612019-03-20 10:52:28 +01001851 println "NOTE: Running with non default vm: " + project.property('dex_vm')
Mads Ager418d1ca2017-05-22 09:35:49 +02001852 systemProperty 'dex_vm', project.property('dex_vm')
Mads Ager418d1ca2017-05-22 09:35:49 +02001853 }
Tamas Kenez0cad51c2017-08-21 14:42:01 +02001854
Ian Zerny324d7612019-03-20 10:52:28 +01001855 // Forward runtime configurations for test parameters.
1856 if (project.hasProperty('runtimes')) {
1857 println "NOTE: Running with runtimes: " + project.property('runtimes')
1858 systemProperty 'runtimes', project.property('runtimes')
Ian Zerny4dfd5a52019-03-12 07:56:11 +01001859 }
1860
Christoffer Quist Adamsen748e4662019-08-23 14:53:49 +02001861 if (project.hasProperty('slow_tests')) {
1862 systemProperty 'slow_tests', project.property('slow_tests')
1863 }
1864
Mads Ager418d1ca2017-05-22 09:35:49 +02001865 if (project.hasProperty('one_line_per_test')) {
1866 beforeTest { desc ->
1867 println "Start executing test ${desc.name} [${desc.className}]"
1868 }
1869 afterTest { desc, result ->
Rico Windf88b6be2018-12-11 15:14:05 +01001870 if (result.resultType == TestResult.ResultType.FAILURE) {
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001871 printStackTrace(result)
Rico Windf88b6be2018-12-11 15:14:05 +01001872 }
Rico Windda6836e2018-12-07 12:32:03 +01001873 if (project.hasProperty('update_test_timestamp')) {
1874 file(project.getProperty('update_test_timestamp')).text = new Date().getTime()
1875 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001876 println "Done executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
1877 }
Rico Windf88b6be2018-12-11 15:14:05 +01001878 } else {
1879 afterTest { desc, result ->
1880 if (result.resultType == TestResult.ResultType.FAILURE) {
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001881 printStackTrace(result)
Rico Windf88b6be2018-12-11 15:14:05 +01001882 }
1883 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001884 }
1885 if (project.hasProperty('no_internal')) {
1886 exclude "com/android/tools/r8/internal/**"
Christoffer Quist Adamsen74288f02019-06-14 12:30:17 +02001887 } else {
1888 dependsOn buildExamplesProto
Mads Ager418d1ca2017-05-22 09:35:49 +02001889 }
1890 if (project.hasProperty('only_internal')) {
1891 include "com/android/tools/r8/internal/**"
1892 }
Rico Wind4e218292019-03-07 12:44:49 +01001893
Mads Ager418d1ca2017-05-22 09:35:49 +02001894 if (project.hasProperty('tool')) {
1895 if (project.property('tool') == 'r8') {
Rico Windf02167a2019-03-15 12:27:03 +01001896 exclude "com/android/tools/r8/jctf/**"
Tamas Kenezcfb2c052018-10-12 11:03:57 +02001897 } else if (project.property('tool') == 'd8') {
Rico Windf02167a2019-03-15 12:27:03 +01001898 if (project.hasProperty('only_jctf')) {
1899 include "com/android/tools/r8/jctf/d8/**"
1900 } else {
Rico Wind819f7c52019-03-20 09:44:27 +01001901 // Don't run anything, deprecated
1902 println "Running with deprecated tool d8, not running any tests"
1903 include ""
Rico Windf02167a2019-03-15 12:27:03 +01001904 }
Tamas Kenezcfb2c052018-10-12 11:03:57 +02001905 } else {
1906 assert(project.property('tool') == 'r8cf')
Rico Windf02167a2019-03-15 12:27:03 +01001907 assert(project.hasProperty('only_jctf'))
1908 include "com/android/tools/r8/jctf/r8cf/**"
Mads Ager418d1ca2017-05-22 09:35:49 +02001909 }
1910 }
1911 if (!project.hasProperty('all_tests')) {
1912 exclude "com/android/tools/r8/art/dx/**"
Mads Ager418d1ca2017-05-22 09:35:49 +02001913 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001914 if (!project.hasProperty('jctf') && !project.hasProperty('only_jctf')) {
Stephan Herhutea6ee582017-05-23 13:14:34 +02001915 exclude "com/android/tools/r8/jctf/**"
Mads Ager418d1ca2017-05-22 09:35:49 +02001916 }
Rico Wind8e2f7e42019-02-21 10:13:21 +01001917 if (project.hasProperty('shard_count') ) {
1918 assert project.hasProperty('shard_number')
1919 int shard_count = project.getProperty('shard_count') as Integer
1920 int shard_number = project.getProperty('shard_number') as Integer
1921 assert shard_count < 65536
1922 assert shard_number < shard_count
1923 exclude {
1924 entry ->
1925 // Don't leave out directories. Leaving out a directory means all entries below.
1926 if (entry.file.isDirectory()) {
1927 return false
1928 }
1929 def first4 = entry.getRelativePath().toString().md5().substring(0, 4)
1930 int hash = Integer.parseInt(first4, 16)
1931 return hash % shard_count != shard_number
1932 }
1933 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001934 if (project.hasProperty('jctf_compile_only')) {
1935 println "JCTF: compiling only"
1936 systemProperty 'jctf_compile_only', '1'
1937 }
Tamas Kenezb77b7d82017-08-17 14:05:16 +02001938 if (project.hasProperty('test_dir')) {
1939 systemProperty 'test_dir', project.property('test_dir')
1940 }
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001941 if (project.hasProperty('r8lib') || project.hasProperty('r8lib_no_deps')) {
1942 dependsOn configureTestForR8Lib
Morten Krogh-Jespersenf0f528d2019-08-19 19:25:03 +02001943 // R8lib should be used instead of the main output and all the tests in r8 should be mapped
1944 // and exists in r8LibtestPath.
1945 classpath = sourceSets.test.runtimeClasspath.filter {
1946 !it.getAbsolutePath().contains("/build/")
1947 }
1948 classpath += files([r8LibPath, r8LibTestPath])
Ian Zerny5fffb0a2019-02-11 13:54:22 +01001949 testClassesDirs = files(r8LibTestPath)
Morten Krogh-Jespersen7df24322018-12-21 13:39:54 +01001950 }
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001951 if (OperatingSystem.current().isLinux()
1952 || OperatingSystem.current().isMacOsX()
1953 || OperatingSystem.current().isWindows()) {
Mads Ager418d1ca2017-05-22 09:35:49 +02001954 if (OperatingSystem.current().isMacOsX()) {
1955 logger.lifecycle("WARNING: Testing in only partially supported on Mac OS. " +
1956 "Art only runs on Linux and tests requiring Art runs in a Docker container, which must be present. " +
1957 "See tools/docker/README.md for details.")
1958 }
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001959 if (OperatingSystem.current().isWindows()) {
1960 logger.lifecycle("WARNING: Testing in only partially supported on Windows. " +
1961 "Art only runs on Linux and tests requiring Art will be skipped")
1962 }
Mads Ager418d1ca2017-05-22 09:35:49 +02001963 dependsOn downloadDeps
Morten Krogh-Jespersen9ea26ed2019-09-02 19:45:54 +02001964 dependsOn downloadMappingFilesForRetraceTests
Mads Ager418d1ca2017-05-22 09:35:49 +02001965 dependsOn buildExamples
Mikaël Peltier3c8b6ea2017-12-12 13:00:21 +01001966 dependsOn buildExamplesKotlin
Sebastien Hertzd3313772018-01-16 14:12:37 +01001967 dependsOn buildKotlinR8TestResources
Mads Ager418d1ca2017-05-22 09:35:49 +02001968 dependsOn buildSmali
1969 dependsOn jctfCommonJar
1970 dependsOn jctfTestsClasses
1971 dependsOn buildDebugInfoExamplesDex
1972 dependsOn buildPreNJdwpTestsJar
Mathias Ravcd795072018-03-22 12:47:32 +01001973 dependsOn buildPreNJdwpTestsDex
clementbera4f9c2a92019-07-09 08:50:37 +02001974 dependsOn buildJdk11TimeTestsJar
clementberaa92e3cd2019-07-12 14:13:22 +02001975 dependsOn provideArtFrameworksDependencies
Mads Ager418d1ca2017-05-22 09:35:49 +02001976 } else {
1977 logger.lifecycle("WARNING: Testing in not supported on your platform. Testing is only fully supported on " +
Jean-Marie Henaff39587a82017-06-08 15:20:13 +02001978 "Linux and partially supported on Mac OS and Windows. Art does not run on other platforms.")
Mads Ager418d1ca2017-05-22 09:35:49 +02001979 }
1980}
1981
1982// The Art tests we use for R8 are pre-build and downloaded from Google Cloud Storage.
1983//
1984// To build and upload a new set of the Art tests for use with R8 follow these steps:
1985//
1986// First of all an Android checkout is required. Currently it must be located
1987// in $HOME/android/master.
1988//
1989// TODO(ricow): simplify this
1990//
1991// Before: update the checked in art, see scripts/update-host-art.sh
1992//
1993// 1. Get an android checkout in $HOME/android/master and apply the patch from
1994// https://android-review.googlesource.com/#/c/294187/
1995//
1996// 2. run the following commands in the Android checkout directory:
1997//
1998// source build/envsetup.sh
Søren Gjesse34b77732017-07-07 13:56:21 +02001999// lunch aosp_angler-userdebug # or lunch aosp_angler-eng
2000// m desugar
2001// m -j30 test-art-host
2002// DESUGAR=false ANDROID_COMPILE_WITH_JACK=false art/test.py --host -t 001-HelloWorld
2003//
2004// Without running the test.py command the classes.jar file used by desugar in
2005// $HOME/android/master/out/host/common/obj/JAVA_LIBRARIES/core-oj-hostdex_intermediates/
2006// seems to be missing - there is probably also a make target to build it more directly
Mads Ager418d1ca2017-05-22 09:35:49 +02002007//
2008// 3. In the R8 project root directory, make sure we have a clean state before starting:
2009// tools/gradle.py downloadDeps
2010// tools/gradle.py clean
2011// rm -rf tests/art
2012//
2013// 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 +02002014// Make sure you have smali on your path, please use the build binary in the
2015// out/host/linux-x86/bin directory of the android checkout. Currently this is version pre 2.2.1,
2016// if that is updated the call to smali in "task "${smaliToDexTask}"(type: Exec)" below might
2017// 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 +02002018// After Android O, Jack is no longer alive, do not forget to uncomment call to buildArtTest for
2019// Jack if you build an android version using Jack.
Mads Ager418d1ca2017-05-22 09:35:49 +02002020//
Søren Gjesse34b77732017-07-07 13:56:21 +02002021// PATH=$HOME/android/master/out/host/linux-x86/bin:$PATH tools/gradle.py -Pandroid_source buildArtTests
Mads Ager418d1ca2017-05-22 09:35:49 +02002022//
2023// 4a. If any failures are produced in step 4, figure out what went wrong and add an entry in
2024// skippedTests with an explanation. Rerun from step 3.
2025//
2026// 5. Run the tests:
2027// tools/gradle.py clean
2028// tools/test.py
2029//
Søren Gjesse34b77732017-07-07 13:56:21 +02002030// 5a. If any more tests fail, either fix the issue or add them to the failuresToTriage list (note
2031// that you need to change "_" to "-" from stdout). Rerun from step 5 if anything was added to
2032// failuresToTriage.
Mads Ager418d1ca2017-05-22 09:35:49 +02002033//
Søren Gjesse34b77732017-07-07 13:56:21 +02002034// 6. To upload a new version to Google Cloud Storage:
Mads Ager418d1ca2017-05-22 09:35:49 +02002035// cd tests
2036// upload_to_google_storage.py -a --bucket r8-deps art
Søren Gjesse34b77732017-07-07 13:56:21 +02002037//
2038// 7. Update the manifest file describing the Android repo used:
2039// repo manifest -o <r8-checkout-root>/tools/linux/aosp_master_manifest.xml -r
Mads Ager418d1ca2017-05-22 09:35:49 +02002040
Mads Ager418d1ca2017-05-22 09:35:49 +02002041def androidCheckoutDir = file("${System.env.HOME}/android/master")
Mads Ager418d1ca2017-05-22 09:35:49 +02002042
2043def artTestDir = file("${androidCheckoutDir}/art/test")
2044
2045if (project.hasProperty('android_source')) {
2046 task buildArtTests {
2047 outputs.upToDateWhen { false }
2048 def toBeTriaged = [
2049 "903-hello-tagging",
2050 "904-object-allocation",
2051 "905-object-free",
2052 "906-iterate-heap",
2053 "907-get-loaded-classes",
2054 "908-gc-start-finish",
2055 "954-invoke-polymorphic-verifier",
2056 "955-methodhandles-smali",
2057 "596-monitor-inflation",
2058 ]
2059 def skippedTests = toBeTriaged + [
2060 // This test produces no jar.
2061 "000-nop",
2062 // This does not build, as it tests the error when the application exceeds more
2063 // than 65536 methods
2064 "089-many-methods",
2065 // Requires some jack beta jar
2066 "956-methodhandles",
2067 ]
2068
2069 def skippedTestsDx = [
2070 // Tests with custom build scripts, where javac is not passed the options
2071 // -source 1.7 -target 1.7.
2072 "462-checker-inlining-across-dex-files",
2073 "556-invoke-super",
2074 "569-checker-pattern-replacement",
2075 // These tests use jack even when --build-with-javac-dx is specified.
2076 "004-JniTest",
2077 "048-reflect-v8",
2078 "146-bad-interface",
2079 "563-checker-invoke-super",
2080 "580-checker-string-fact-intrinsics", // java.lang.StringFactory
2081 "604-hot-static-interface",
2082 "957-methodhandle-transforms",
2083 "958-methodhandle-emulated-stackframe",
2084 "959-invoke-polymorphic-accessors",
2085 "961-default-iface-resolution-gen",
2086 "962-iface-static",
2087 "963-default-range-smali",
2088 "964-default-iface-init-gen",
2089 "965-default-verify",
2090 "966-default-conflict",
2091 "967-default-ame",
2092 "968-default-partial-compile-gen",
2093 "969-iface-super",
2094 "970-iface-super-resolution-gen",
2095 "971-iface-super",
2096 // These tests does not build with --build-with-javac-dx
2097 "004-NativeAllocations", // Javac error
2098 "031-class-attributes",
2099 "138-duplicate-classes-check",
2100 "157-void-class", // Javac error
2101 "580-checker-string-factory-intrinsics",
2102 "612-jit-dex-cache",
2103 "613-inlining-dex-cache",
2104 "900-hello-plugin", // --experimental agents
2105 "901-hello-ti-agent", // --experimental agents
2106 "902-hello-transformation", // --experimental agents
2107 "909-attach-agent", // --experimental agents
2108 "946-obsolete-throw", // -source 1.7 -target 1.7, but use lambda
2109 "950-redefine-intrinsic", // -source 1.7 -target 1.7, but use method references
2110 "951-threaded-obsolete", // -source 1.7 -target 1.7, but use lambda
2111 "960-default-smali", // --experimental default-methods
2112 // These tests force the build to use jack
2113 "953-invoke-polymorphic-compiler",
2114 "958-methodhandle-stackframe",
2115 ]
2116
2117 def artTestBuildDir = file("${projectDir}/tests/art")
2118
2119 if (androidCheckoutDir.exists()) {
2120 dependsOn downloadDeps
2121 artTestBuildDir.mkdirs()
Mads Ager418d1ca2017-05-22 09:35:49 +02002122 artTestDir.eachDir { dir ->
2123 def name = dir.getName();
2124 def markerFile = dir.toPath().resolve("info.txt").toFile();
2125 if (markerFile.exists() && !(name in skippedTests)) {
2126 if (!(name in skippedTestsDx)) {
Rico Windde2af6c2019-03-26 15:21:08 +01002127 dependsOn buildArtTest(androidCheckoutDir, artTestBuildDir, dir);
Mads Ager418d1ca2017-05-22 09:35:49 +02002128 }
Mads Ager418d1ca2017-05-22 09:35:49 +02002129 }
2130 }
2131 }
2132 doFirst {
2133 if (!androidCheckoutDir.exists()) {
2134 throw new InvalidUserDataException(
2135 "This task requires an Android checkout in ${androidCheckoutDir}");
Mads Ager418d1ca2017-05-22 09:35:49 +02002136 }
2137 }
2138 doLast {
2139 copy {
2140 from file("${androidCheckoutDir}/out/host/linux-x86/nativetest64")
2141 into file("${artTestBuildDir}/lib64")
2142 include 'lib*.so'
2143 }
2144 copy {
2145 from file("${androidCheckoutDir}/out/host/linux-x86/lib64")
2146 into file("${artTestBuildDir}/lib64")
2147 include 'libart.so'
2148 include 'libbacktrace.so'
2149 include 'libbase.so'
2150 include 'libc++.so'
2151 include 'libcutils.so'
2152 include 'liblz4.so'
2153 include 'liblzma.so'
2154 include 'libnativebridge.so'
2155 include 'libnativeloader.so'
2156 include 'libsigchain.so'
2157 include 'libunwind.so'
2158 include 'libziparchive.so'
2159 }
2160 copy {
2161 from file("${androidCheckoutDir}/out/host/linux-x86/nativetest")
2162 into file("${artTestBuildDir}/lib")
2163 include 'lib*.so'
2164 }
2165 copy {
2166 from file("${androidCheckoutDir}/out/host/linux-x86/lib")
2167 into file("${artTestBuildDir}/lib")
2168 include 'libart.so'
2169 include 'libbacktrace.so'
2170 include 'libbase.so'
2171 include 'libc++.so'
2172 include 'libcutils.so'
2173 include 'liblz4.so'
2174 include 'liblzma.so'
2175 include 'libnativebridge.so'
2176 include 'libnativeloader.so'
2177 include 'libsigchain.so'
2178 include 'libunwind.so'
2179 include 'libziparchive.so'
2180 }
2181 }
2182 }
2183}
2184
Rico Windde2af6c2019-03-26 15:21:08 +01002185def buildArtTest(androidCheckoutDir, artTestBuildDir, dir) {
Mads Ager418d1ca2017-05-22 09:35:49 +02002186 def artTestDir = file("${androidCheckoutDir}/art/test")
2187 def artRunTestScript = file("${artTestDir}/run-test")
2188 def dxExecutable = new File("tools/linux/dx/bin/dx");
Jean-Marie Henaff34d85f72017-06-14 10:32:04 +02002189 def dexMergerExecutable = Utils.dexMergerExecutable()
Mads Ager418d1ca2017-05-22 09:35:49 +02002190
Søren Gjesse34b77732017-07-07 13:56:21 +02002191 def name = dir.getName()
Rico Windde2af6c2019-03-26 15:21:08 +01002192 def buildTask = "build_art_test_dx_${name}"
2193 def sanitizeTask = "sanitize_art_test_dx_${name}"
2194 def copyCheckTask = "copy_check_art_test_dx_${name}"
2195 def smaliToDexTask = "smali_to_dex_dx_${name}"
Mads Ager418d1ca2017-05-22 09:35:49 +02002196
2197 def buildInputs = fileTree(dir: dir, include: '**/*')
Rico Windde2af6c2019-03-26 15:21:08 +01002198 def testDir = file("${artTestBuildDir}/dx/${name}")
Mads Ager418d1ca2017-05-22 09:35:49 +02002199 def outputJar = testDir.toPath().resolve("${name}.jar").toFile()
2200 testDir.mkdirs()
Rico Windde2af6c2019-03-26 15:21:08 +01002201 task "$buildTask"(type: Exec) {
2202 outputs.upToDateWhen { false }
2203 inputs.file buildInputs
2204 executable "${artRunTestScript}"
2205 args "--host"
2206 args "--build-only"
2207 args "--build-with-javac-dx"
2208 args "--output-path", "${testDir}"
2209 args "${name}"
2210 environment DX: "${dxExecutable.absolutePath}"
2211 environment DXMERGER: "${dexMergerExecutable.absolutePath}"
2212 environment ANDROID_BUILD_TOP: "${androidCheckoutDir}"
2213 outputs.file outputJar
Mads Ager418d1ca2017-05-22 09:35:49 +02002214 }
2215 task "${sanitizeTask}"(type: Exec, dependsOn: buildTask) {
2216 outputs.upToDateWhen { false }
2217 executable "/bin/bash"
2218 args "-c"
2219 args "rm -rf ${testDir}/smali_*.dex ${testDir}/*-ex.dex ${testDir}/*-ex.jar" +
2220 " ${testDir}/classes-ex ${testDir}/check"
2221 }
2222
2223 task "${smaliToDexTask}"(type: Exec) {
Mikaël Peltiere116cb62017-10-05 10:50:30 +02002224 // Directory that contains smali files is either smali, or smali/art
2225 def smali_dir = file("${dir}/smali/art")
2226 if (smali_dir.exists()) {
2227 workingDir "${testDir}/smali/art"
2228 } else {
2229 workingDir "${testDir}/smali"
2230 }
Mads Ager418d1ca2017-05-22 09:35:49 +02002231 executable "/bin/bash"
Søren Gjesse34b77732017-07-07 13:56:21 +02002232 // This is the command line options for smali prior to 2.2.1, where smali got a new
2233 // command line interface.
2234 args "-c", "smali a *.smali"
2235 // This is the command line options for smali 2.2.1 and later.
2236 // args "-c", "smali -o out.dex *.smali"
Mads Ager418d1ca2017-05-22 09:35:49 +02002237 }
2238
2239 task "${copyCheckTask}"(type: Copy, dependsOn: sanitizeTask) {
2240 def smali_dir = file("${dir}/smali")
2241 outputs.upToDateWhen { false }
Rico Windde2af6c2019-03-26 15:21:08 +01002242 if (smali_dir.exists()) {
Mads Ager418d1ca2017-05-22 09:35:49 +02002243 dependsOn smaliToDexTask
2244 }
2245 from("${artTestDir}/${name}") {
2246 include 'check'
2247 }
2248 into testDir
2249 }
2250
2251 return copyCheckTask
2252}
2253
2254task javadocD8(type: Javadoc) {
Ian Zerny850f13d2018-01-04 11:25:38 +01002255 title "D8 API"
Mads Ager418d1ca2017-05-22 09:35:49 +02002256 classpath = sourceSets.main.compileClasspath
2257 source = sourceSets.main.allJava
Yohann Rousselb16d0f62017-10-09 16:08:09 +02002258 include '**/com/android/tools/r8/ArchiveClassFileProvider.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002259 include '**/com/android/tools/r8/ArchiveProgramResourceProvider.java'
Mads Ager418d1ca2017-05-22 09:35:49 +02002260 include '**/com/android/tools/r8/BaseCommand.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002261 include '**/com/android/tools/r8/BaseCompilerCommand.java'
Yohann Rousselb16d0f62017-10-09 16:08:09 +02002262 include '**/com/android/tools/r8/ClassFileResourceProvider.java'
Yohann Roussel078c9942017-11-28 15:55:46 +01002263 include '**/com/android/tools/r8/CompilationFailedException.java'
Mads Ager418d1ca2017-05-22 09:35:49 +02002264 include '**/com/android/tools/r8/CompilationMode.java'
2265 include '**/com/android/tools/r8/D8.java'
2266 include '**/com/android/tools/r8/D8Command.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002267 include '**/com/android/tools/r8/DexIndexedConsumer.java'
2268 include '**/com/android/tools/r8/DexFilePerClassFileConsumer.java'
Yohann Roussel078c9942017-11-28 15:55:46 +01002269 include '**/com/android/tools/r8/Diagnostic.java'
2270 include '**/com/android/tools/r8/DiagnosticsHandler.java'
Ian Zernyef028f52018-01-08 14:23:17 +01002271 include '**/com/android/tools/r8/DirectoryClassFileProvider.java'
2272 include '**/com/android/tools/r8/OutputMode.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002273 include '**/com/android/tools/r8/ProgramConsumer.java'
2274 include '**/com/android/tools/r8/ProgramResource.java'
2275 include '**/com/android/tools/r8/ProgramResourceProvider.java'
Mads Ager418d1ca2017-05-22 09:35:49 +02002276 include '**/com/android/tools/r8/Resource.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002277 include '**/com/android/tools/r8/ResourceException.java'
2278 include '**/com/android/tools/r8/StringConsumer.java'
2279 include '**/com/android/tools/r8/StringResource.java'
2280 include '**/com/android/tools/r8/Version.java'
2281 include '**/com/android/tools/r8/origin/*.java'
2282}
2283
2284task javadocR8(type: Javadoc) {
2285 title "R8 API"
2286 classpath = sourceSets.main.compileClasspath
2287 source = sourceSets.main.allJava
2288 include '**/com/android/tools/r8/ArchiveClassFileProvider.java'
2289 include '**/com/android/tools/r8/ArchiveProgramResourceProvider.java'
2290 include '**/com/android/tools/r8/BaseCommand.java'
2291 include '**/com/android/tools/r8/BaseCompilerCommand.java'
2292 include '**/com/android/tools/r8/ClassFileConsumer.java'
2293 include '**/com/android/tools/r8/ClassFileResourceProvider.java'
2294 include '**/com/android/tools/r8/CompilationFailedException.java'
2295 include '**/com/android/tools/r8/CompilationMode.java'
2296 include '**/com/android/tools/r8/R8.java'
2297 include '**/com/android/tools/r8/R8Command.java'
2298 include '**/com/android/tools/r8/DexIndexedConsumer.java'
2299 include '**/com/android/tools/r8/Diagnostic.java'
2300 include '**/com/android/tools/r8/DiagnosticsHandler.java'
Ian Zernyef028f52018-01-08 14:23:17 +01002301 include '**/com/android/tools/r8/DirectoryClassFileProvider.java'
2302 include '**/com/android/tools/r8/OutputMode.java'
Ian Zerny850f13d2018-01-04 11:25:38 +01002303 include '**/com/android/tools/r8/ProgramConsumer.java'
2304 include '**/com/android/tools/r8/ProgramResource.java'
2305 include '**/com/android/tools/r8/ProgramResourceProvider.java'
2306 include '**/com/android/tools/r8/Resource.java'
2307 include '**/com/android/tools/r8/ResourceException.java'
2308 include '**/com/android/tools/r8/StringConsumer.java'
2309 include '**/com/android/tools/r8/StringResource.java'
2310 include '**/com/android/tools/r8/Version.java'
Yohann Roussel078c9942017-11-28 15:55:46 +01002311 include '**/com/android/tools/r8/origin/*.java'
Mads Ager418d1ca2017-05-22 09:35:49 +02002312}
Søren Gjesse39a909a2017-10-12 09:49:20 +02002313
2314task copyMavenDeps(type: Copy) {
2315 from configurations.compile into "$buildDir/deps"
Morten Krogh-Jespersen75773302019-01-07 09:45:08 +01002316 from configurations.compileClasspath into "$buildDir/deps"
Søren Gjesse39a909a2017-10-12 09:49:20 +02002317 from configurations.testCompile into "$buildDir/deps"
2318}
Mikaël Peltier61633d42017-10-13 16:51:06 +02002319
Rico Wind23a05112019-03-27 08:00:44 +01002320task printMavenDeps {
2321 // Only actually print to stdout when we are updating.
2322 if (project.hasProperty('updatemavendeps')) {
2323 for (Configuration config : configurations) {
2324 if (!config.isCanBeResolved()) {
2325 continue
2326 }
2327 def componentIds = config.incoming.resolutionResult.allDependencies.collect {
2328 it.selected.id
2329 }
2330 def result = dependencies.createArtifactResolutionQuery()
2331 .forComponents(componentIds)
2332 .withArtifacts(MavenModule, MavenPomArtifact)
2333 .execute()
2334 for (component in result.resolvedComponents) {
2335 component.getArtifacts(MavenPomArtifact).each {
2336 println "POM: ${it.file} ${component.id}"
2337 }
2338 }
2339 config.each {
2340 println "JAR: ${it}"
2341 }
2342 }
2343 }
2344}