• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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