1 /*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
<lambda>null17 plugins {
18 id("application")
19 id("org.jetbrains.kotlin.jvm")
20 id("maven-publish")
21 id("metalava-build-plugin")
22 }
23
<lambda>null24 application {
25 mainClass.set("com.android.tools.metalava.Driver")
26 applicationDefaultJvmArgs = listOf("-ea", "-Xms2g", "-Xmx4g")
27 }
28
<lambda>null29 dependencies {
30 implementation(project(":metalava-model"))
31 implementation(project(":metalava-model-psi"))
32 implementation(project(":metalava-model-source"))
33 implementation(project(":metalava-model-text"))
34 implementation(project(":metalava-reporter"))
35 implementation(libs.androidToolsExternalUast)
36 implementation(libs.androidToolsExternalKotlinCompiler)
37 implementation(libs.androidToolsExternalIntellijCore)
38 implementation(libs.androidLintApi)
39 implementation(libs.androidLintChecks)
40 implementation(libs.androidLintGradle)
41 implementation(libs.androidLint)
42 implementation(libs.androidToolsCommon)
43 implementation(libs.androidToolsSdkCommon)
44 implementation(libs.androidToolsSdklib)
45 implementation(libs.clikt)
46 implementation(libs.kotlinStdlib)
47 implementation(libs.asm)
48 implementation(libs.asmTree)
49 implementation(libs.gson)
50 implementation(libs.jacksonDataformatXml)
51 implementation(libs.jacksonModuleKotlin)
52
53 testImplementation(project(":metalava-model-turbine"))
54 testImplementation(project(":metalava-testing"))
55 testImplementation(testFixtures(project(":metalava-model")))
56 testImplementation(testFixtures(project(":metalava-model-text")))
57 testImplementation(libs.androidLintTests)
58 testImplementation(libs.junit4)
59 testImplementation(libs.truth)
60 testImplementation(libs.kotlinTest)
61 }
62
63 /** The location into which a fake representation of the prebuilts/sdk directory will be written. */
64 val testPrebuiltsSdkDir = layout.buildDirectory.dir("prebuilts/sdk")
65
66 val testDataDir = layout.projectDirectory.dir("src/testdata")
67
68 /**
69 * Register tasks to emulate parts of the prebuilts/sdk repository using source from this directory.
70 *
71 * [sourceDir] is the path to the root directory of code that is compiled into a jar that
72 * corresponds to the jar specified by [destJar].
73 *
74 * [destJar] is the path to a jar within prebuilts/sdk. The fake jar created from [sourceDir] is
75 * copied to getBuildDirectory()/prebuilts/sdk/$destJar.
76 *
77 * The jars created by this can be accessed by tests via the `METALAVA_TEST_PREBUILTS_SDK_ROOT`
78 * environment variable which is set to point to getBuildDirectory()/prebuilts/sdk; see [testTask].
79 */
registerTestPrebuiltsSdkTasksnull80 fun registerTestPrebuiltsSdkTasks(sourceDir: String, destJar: String): TaskProvider<Jar> {
81 val basename = sourceDir.replace("/", "-")
82 val javaCompileTaskName = "$basename.classes"
83 val jarTaskName = "$basename.jar"
84
85 val compileTask =
86 project.tasks.register(javaCompileTaskName, JavaCompile::class) {
87 options.compilerArgs = listOf("--patch-module", "java.base=" + file(sourceDir))
88 source = fileTree(sourceDir)
89 classpath = project.files()
90 destinationDirectory.set(layout.buildDirectory.dir(javaCompileTaskName))
91 }
92
93 val destJarFile = File(destJar)
94 val dir = destJarFile.parent
95 val filename = destJarFile.name
96 if (dir == ".") {
97 throw IllegalArgumentException("bad destJar argument '$destJar'")
98 }
99
100 val jarTask =
101 project.tasks.register(jarTaskName, Jar::class) {
102 from(compileTask.flatMap { it.destinationDirectory })
103 archiveFileName.set(filename)
104 destinationDirectory.set(testPrebuiltsSdkDir.map { it.dir(dir) })
105 }
106
107 return jarTask
108 }
109
110 val testPrebuiltsSdkApi30 =
111 registerTestPrebuiltsSdkTasks("src/testdata/prebuilts-sdk-test/30", "30/public/android.jar")
112 val testPrebuiltsSdkApi31 =
113 registerTestPrebuiltsSdkTasks("src/testdata/prebuilts-sdk-test/31", "31/public/android.jar")
114 val testPrebuiltsSdkExt1 =
115 registerTestPrebuiltsSdkTasks(
116 "src/testdata/prebuilts-sdk-test/extensions/1",
117 "extensions/1/public/framework-ext.jar"
118 )
119 val testPrebuiltsSdkExt2 =
120 registerTestPrebuiltsSdkTasks(
121 "src/testdata/prebuilts-sdk-test/extensions/2",
122 "extensions/2/public/framework-ext.jar"
123 )
124 val testPrebuiltsSdkExt3 =
125 registerTestPrebuiltsSdkTasks(
126 "src/testdata/prebuilts-sdk-test/extensions/3",
127 "extensions/3/public/framework-ext.jar"
128 )
129
<lambda>null130 project.tasks.register("test-sdk-extensions-info.xml", Copy::class) {
131 from("src/testdata/prebuilts-sdk-test/sdk-extensions-info.xml")
132 into(testPrebuiltsSdkDir)
133 }
134
<lambda>null135 project.tasks.register("test-prebuilts-sdk") {
136 dependsOn(testPrebuiltsSdkApi30)
137 dependsOn(testPrebuiltsSdkApi31)
138 dependsOn(testPrebuiltsSdkExt1)
139 dependsOn(testPrebuiltsSdkExt2)
140 dependsOn(testPrebuiltsSdkExt3)
141 dependsOn("test-sdk-extensions-info.xml")
142 }
143
<lambda>null144 tasks.named<Test>("test").configure {
145 dependsOn("test-prebuilts-sdk")
146
147 // Add some additional environment variables to pass in some directories needed by the test.
148 environment.putAll(
149 mapOf(
150 "METALAVA_TEST_PREBUILTS_SDK_ROOT" to testPrebuiltsSdkDir.get().asFile.absolutePath,
151 "METALAVA_TESTDATA_DIR" to testDataDir.asFile.absolutePath,
152 )
153 )
154 }
155
156 // Copy the version.properties from the root project into its own directory.
157 val copyVersion =
<lambda>null158 tasks.register("copyVersion", Copy::class.java) {
159 from("${rootProject.projectDir}/version.properties")
160 into(project.layout.buildDirectory.dir("version"))
161 }
162
163 // Add the version directory to the directories from which the jar is built.
164 sourceSets.getByName("main").output.dir(copyVersion)
165