1 import com.android.tools.metalava.CREATE_ARCHIVE_TASK
2 import com.android.tools.metalava.CREATE_BUILD_INFO_TASK
3 import com.android.tools.metalava.configureBuildInfoTask
4 import com.android.tools.metalava.configurePublishingArchive
5 import org.gradle.api.tasks.testing.logging.TestLogEvent
6 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
7 import java.io.FileInputStream
8 import java.io.FileNotFoundException
9 import java.util.Properties
10
11 buildDir = getBuildDirectory()
12
13 defaultTasks = mutableListOf(
14 "installDist",
15 "test",
16 CREATE_ARCHIVE_TASK,
17 CREATE_BUILD_INFO_TASK,
18 "ktlint"
19 )
20
<lambda>null21 repositories {
22 google()
23 mavenCentral()
24 val lintRepo = project.findProperty("lintRepo") as String?
25 if (lintRepo != null) {
26 logger.warn("Building using custom $lintRepo maven repository")
27 maven {
28 url = uri(lintRepo)
29 }
30 }
31 }
32
<lambda>null33 plugins {
34 alias(libs.plugins.kotlinJvm)
35 id("application")
36 id("java")
37 id("maven-publish")
38 }
39
40 group = "com.android.tools.metalava"
41 version = getMetalavaVersion()
42
<lambda>null43 application {
44 mainClass.set("com.android.tools.metalava.Driver")
45 applicationDefaultJvmArgs = listOf("-ea", "-Xms2g", "-Xmx4g")
46 }
47
<lambda>null48 java {
49 sourceCompatibility = JavaVersion.VERSION_1_8
50 targetCompatibility = JavaVersion.VERSION_1_8
51 }
52
<lambda>null53 tasks.withType(KotlinCompile::class.java) {
54 sourceCompatibility = "1.8"
55 targetCompatibility = "1.8"
56
57 kotlinOptions {
58 jvmTarget = "1.8"
59 apiVersion = "1.6"
60 languageVersion = "1.6"
61 allWarningsAsErrors = true
62 }
63 }
64
65 val customLintVersion = findProperty("lintVersion") as String?
66 val studioVersion: String = if (customLintVersion != null) {
67 logger.warn("Building using custom $customLintVersion version of Android Lint")
68 customLintVersion
69 } else {
70 "30.3.0-alpha08"
71 }
72
<lambda>null73 dependencies {
74 implementation("com.android.tools.external.org-jetbrains:uast:$studioVersion")
75 implementation("com.android.tools.external.com-intellij:kotlin-compiler:$studioVersion")
76 implementation("com.android.tools.external.com-intellij:intellij-core:$studioVersion")
77 implementation("com.android.tools.lint:lint-api:$studioVersion")
78 implementation("com.android.tools.lint:lint-checks:$studioVersion")
79 implementation("com.android.tools.lint:lint-gradle:$studioVersion")
80 implementation("com.android.tools.lint:lint:$studioVersion")
81 implementation("com.android.tools:common:$studioVersion")
82 implementation("com.android.tools:sdk-common:$studioVersion")
83 implementation("com.android.tools:sdklib:$studioVersion")
84 implementation(libs.kotlinStdlib)
85 implementation(libs.kotlinReflect)
86 implementation("org.ow2.asm:asm:8.0")
87 implementation("org.ow2.asm:asm-tree:8.0")
88 implementation("com.google.guava:guava:30.1.1-jre")
89 testImplementation("com.android.tools.lint:lint-tests:$studioVersion")
90 testImplementation("junit:junit:4.13.2")
91 testImplementation("com.google.truth:truth:1.1.3")
92 testImplementation(libs.kotlinTest)
93 }
94
95 val zipTask: TaskProvider<Zip> = project.tasks.register(
96 "zipResultsOf${name.capitalize()}",
97 Zip::class.java
<lambda>null98 ) {
99 destinationDirectory.set(File(getDistributionDirectory(), "host-test-reports"))
100 archiveFileName.set("metalava-tests.zip")
101 }
102
103 val testTask = tasks.named("test", Test::class.java)
<lambda>null104 testTask.configure {
105 maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).takeIf { it > 0 } ?: 1
106 testLogging.events = hashSetOf(
107 TestLogEvent.FAILED,
108 TestLogEvent.PASSED,
109 TestLogEvent.SKIPPED,
110 TestLogEvent.STANDARD_OUT,
111 TestLogEvent.STANDARD_ERROR
112 )
113 if (isBuildingOnServer()) ignoreFailures = true
114 finalizedBy(zipTask)
115 }
<lambda>null116 zipTask.configure {
117 from(testTask.map { it.reports.junitXml.outputLocation.get() })
118 }
119
getMetalavaVersionnull120 fun getMetalavaVersion(): Any {
121 val versionPropertyFile = File(projectDir, "src/main/resources/version.properties")
122 if (versionPropertyFile.canRead()) {
123 val versionProps = Properties()
124 versionProps.load(FileInputStream(versionPropertyFile))
125 val metalavaVersion = versionProps["metalavaVersion"]
126 ?: throw IllegalStateException("metalava version was not set in ${versionPropertyFile.absolutePath}")
127 return if (isBuildingOnServer()) {
128 metalavaVersion
129 } else {
130 // Local builds are not public release candidates.
131 "$metalavaVersion-SNAPSHOT"
132 }
133 } else {
134 throw FileNotFoundException("Could not read ${versionPropertyFile.absolutePath}")
135 }
136 }
137
getBuildDirectorynull138 fun getBuildDirectory(): File {
139 return if (System.getenv("OUT_DIR") != null) {
140 File(System.getenv("OUT_DIR"), "metalava")
141 } else {
142 File(projectDir, "../../out/metalava")
143 }
144 }
145
146 /**
147 * The build server will copy the contents of the distribution directory and make it available for
148 * download.
149 */
getDistributionDirectorynull150 fun getDistributionDirectory(): File {
151 return if (System.getenv("DIST_DIR") != null) {
152 File(System.getenv("DIST_DIR"))
153 } else {
154 File(projectDir, "../../out/dist")
155 }
156 }
157
isBuildingOnServernull158 fun isBuildingOnServer(): Boolean {
159 return System.getenv("OUT_DIR") != null && System.getenv("DIST_DIR") != null
160 }
161
162 /**
163 * @return build id string for current build
164 *
165 * The build server does not pass the build id so we infer it from the last folder of the
166 * distribution directory name.
167 */
getBuildIdnull168 fun getBuildId(): String {
169 return if (System.getenv("DIST_DIR") != null) File(System.getenv("DIST_DIR")).name else "0"
170 }
171
172 // KtLint: https://github.com/pinterest/ktlint
173
Projectnull174 fun Project.getKtlintConfiguration(): Configuration {
175 return configurations.findByName("ktlint") ?: configurations.create("ktlint") {
176 val dependency = project.dependencies.create("com.pinterest:ktlint:0.41.0")
177 dependencies.add(dependency)
178 }
179 }
180
<lambda>null181 tasks.register("ktlint", JavaExec::class.java) {
182 description = "Check Kotlin code style."
183 group = "Verification"
184 classpath = getKtlintConfiguration()
185 mainClass.set("com.pinterest.ktlint.Main")
186 args = listOf("src/**/*.kt", "build.gradle.kts")
187 }
188
<lambda>null189 tasks.register("ktlintFormat", JavaExec::class.java) {
190 description = "Fix Kotlin code style deviations."
191 group = "formatting"
192 classpath = getKtlintConfiguration()
193 mainClass.set("com.pinterest.ktlint.Main")
194 args = listOf("-F", "src/**/*.kt", "build.gradle.kts")
195 }
196
197 val publicationName = "Metalava"
198 val repositoryName = "Dist"
199
<lambda>null200 publishing {
201 publications {
202 create<MavenPublication>(publicationName) {
203 from(components["java"])
204 pom {
205 licenses {
206 license {
207 name.set("The Apache License, Version 2.0")
208 url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
209 }
210 }
211 developers {
212 developer {
213 name.set("The Android Open Source Project")
214 }
215 }
216 scm {
217 connection.set("scm:git:https://android.googlesource.com/platform/tools/metalava")
218 url.set("https://android.googlesource.com/platform/tools/metalava/")
219 }
220 }
221 }
222 }
223
224 repositories {
225 maven {
226 name = repositoryName
227 url = uri("file://${getDistributionDirectory().canonicalPath}/repo/m2repository")
228 }
229 }
230 }
231
232 // Workaround for https://github.com/gradle/gradle/issues/11717
<lambda>null233 tasks.withType(GenerateModuleMetadata::class.java).configureEach {
234 val outDirProvider = project.providers.environmentVariable("DIST_DIR")
235 inputs.property("buildOutputDirectory", outDirProvider).optional(true)
236 doLast {
237 val metadata = outputFile.asFile.get()
238 val text = metadata.readText()
239 val buildId = outDirProvider.orNull?.let { File(it).name } ?: "0"
240 metadata.writeText(
241 text.replace(
242 "\"buildId\": .*".toRegex(),
243 "\"buildId:\": \"${buildId}\""
244 )
245 )
246 }
247 }
248
249 val archiveTaskProvider = configurePublishingArchive(
250 project,
251 publicationName,
252 repositoryName,
253 getBuildId(),
254 getDistributionDirectory()
255 )
256 configureBuildInfoTask(
257 project,
258 isBuildingOnServer(),
259 getDistributionDirectory(),
260 archiveTaskProvider
261 )
262