xref: /aosp_15_r20/external/okio/build.gradle.kts (revision f9742813c14b702d71392179818a9e591da8620c)
1*f9742813SAndroid Build Coastguard Worker import aQute.bnd.gradle.BundleTaskConvention
2*f9742813SAndroid Build Coastguard Worker import com.diffplug.gradle.spotless.SpotlessExtension
3*f9742813SAndroid Build Coastguard Worker import com.vanniktech.maven.publish.MavenPublishBaseExtension
4*f9742813SAndroid Build Coastguard Worker import com.vanniktech.maven.publish.SonatypeHost
5*f9742813SAndroid Build Coastguard Worker import groovy.util.Node
6*f9742813SAndroid Build Coastguard Worker import groovy.util.NodeList
7*f9742813SAndroid Build Coastguard Worker import java.nio.charset.StandardCharsets
8*f9742813SAndroid Build Coastguard Worker import org.gradle.api.tasks.testing.logging.TestExceptionFormat
9*f9742813SAndroid Build Coastguard Worker import org.gradle.api.tasks.testing.logging.TestLogEvent.FAILED
10*f9742813SAndroid Build Coastguard Worker import org.gradle.api.tasks.testing.logging.TestLogEvent.PASSED
11*f9742813SAndroid Build Coastguard Worker import org.gradle.api.tasks.testing.logging.TestLogEvent.SKIPPED
12*f9742813SAndroid Build Coastguard Worker import org.gradle.api.tasks.testing.logging.TestLogEvent.STARTED
13*f9742813SAndroid Build Coastguard Worker import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
14*f9742813SAndroid Build Coastguard Worker import org.jetbrains.dokka.gradle.DokkaTask
15*f9742813SAndroid Build Coastguard Worker import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
16*f9742813SAndroid Build Coastguard Worker import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
17*f9742813SAndroid Build Coastguard Worker import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
18*f9742813SAndroid Build Coastguard Worker import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
19*f9742813SAndroid Build Coastguard Worker 
20*f9742813SAndroid Build Coastguard Worker plugins {
21*f9742813SAndroid Build Coastguard Worker   id("build-support").apply(false)
22*f9742813SAndroid Build Coastguard Worker }
23*f9742813SAndroid Build Coastguard Worker 
24*f9742813SAndroid Build Coastguard Worker buildscript {
25*f9742813SAndroid Build Coastguard Worker   dependencies {
26*f9742813SAndroid Build Coastguard Worker     classpath(libs.android.gradle.plugin)
27*f9742813SAndroid Build Coastguard Worker     classpath(libs.dokka)
28*f9742813SAndroid Build Coastguard Worker     classpath(libs.jmh.gradle.plugin)
29*f9742813SAndroid Build Coastguard Worker     classpath(libs.binaryCompatibilityValidator)
30*f9742813SAndroid Build Coastguard Worker     classpath(libs.spotless)
31*f9742813SAndroid Build Coastguard Worker     classpath(libs.bnd)
32*f9742813SAndroid Build Coastguard Worker     classpath(libs.vanniktech.publish.plugin)
33*f9742813SAndroid Build Coastguard Worker   }
34*f9742813SAndroid Build Coastguard Worker 
35*f9742813SAndroid Build Coastguard Worker   repositories {
36*f9742813SAndroid Build Coastguard Worker     mavenCentral()
37*f9742813SAndroid Build Coastguard Worker     gradlePluginPortal()
38*f9742813SAndroid Build Coastguard Worker     google()
39*f9742813SAndroid Build Coastguard Worker   }
40*f9742813SAndroid Build Coastguard Worker }
41*f9742813SAndroid Build Coastguard Worker 
42*f9742813SAndroid Build Coastguard Worker apply(plugin = "com.vanniktech.maven.publish.base")
43*f9742813SAndroid Build Coastguard Worker 
44*f9742813SAndroid Build Coastguard Worker // When scripts are applied the buildscript classes are not accessible directly therefore we save
45*f9742813SAndroid Build Coastguard Worker // the class here to make it accessible.
46*f9742813SAndroid Build Coastguard Worker ext.set("bndBundleTaskConventionClass", BundleTaskConvention::class.java)
47*f9742813SAndroid Build Coastguard Worker 
48*f9742813SAndroid Build Coastguard Worker allprojects {
49*f9742813SAndroid Build Coastguard Worker   group = project.property("GROUP") as String
50*f9742813SAndroid Build Coastguard Worker   version = project.property("VERSION_NAME") as String
51*f9742813SAndroid Build Coastguard Worker 
52*f9742813SAndroid Build Coastguard Worker   repositories {
53*f9742813SAndroid Build Coastguard Worker     mavenCentral()
54*f9742813SAndroid Build Coastguard Worker     google()
55*f9742813SAndroid Build Coastguard Worker   }
56*f9742813SAndroid Build Coastguard Worker 
57*f9742813SAndroid Build Coastguard Worker   tasks.withType<DokkaTask>().configureEach {
58*f9742813SAndroid Build Coastguard Worker     dokkaSourceSets.configureEach {
59*f9742813SAndroid Build Coastguard Worker       reportUndocumented.set(false)
60*f9742813SAndroid Build Coastguard Worker       skipDeprecated.set(true)
61*f9742813SAndroid Build Coastguard Worker       jdkVersion.set(8)
62*f9742813SAndroid Build Coastguard Worker       perPackageOption {
63*f9742813SAndroid Build Coastguard Worker         matchingRegex.set("com\\.squareup.okio.*")
64*f9742813SAndroid Build Coastguard Worker         suppress.set(true)
65*f9742813SAndroid Build Coastguard Worker       }
66*f9742813SAndroid Build Coastguard Worker       perPackageOption {
67*f9742813SAndroid Build Coastguard Worker         matchingRegex.set("okio\\.internal.*")
68*f9742813SAndroid Build Coastguard Worker         suppress.set(true)
69*f9742813SAndroid Build Coastguard Worker       }
70*f9742813SAndroid Build Coastguard Worker     }
71*f9742813SAndroid Build Coastguard Worker 
72*f9742813SAndroid Build Coastguard Worker     if (name == "dokkaHtml") {
73*f9742813SAndroid Build Coastguard Worker       outputDirectory.set(file("${rootDir}/docs/3.x/${project.name}"))
74*f9742813SAndroid Build Coastguard Worker       pluginsMapConfiguration.set(
75*f9742813SAndroid Build Coastguard Worker         mapOf(
76*f9742813SAndroid Build Coastguard Worker           "org.jetbrains.dokka.base.DokkaBase" to """
77*f9742813SAndroid Build Coastguard Worker           {
78*f9742813SAndroid Build Coastguard Worker             "customStyleSheets": [
79*f9742813SAndroid Build Coastguard Worker               "${rootDir.toString().replace('\\', '/')}/docs/css/dokka-logo.css"
80*f9742813SAndroid Build Coastguard Worker             ],
81*f9742813SAndroid Build Coastguard Worker             "customAssets" : [
82*f9742813SAndroid Build Coastguard Worker               "${rootDir.toString().replace('\\', '/')}/docs/images/icon-square.png"
83*f9742813SAndroid Build Coastguard Worker             ]
84*f9742813SAndroid Build Coastguard Worker           }
85*f9742813SAndroid Build Coastguard Worker           """.trimIndent()
86*f9742813SAndroid Build Coastguard Worker         )
87*f9742813SAndroid Build Coastguard Worker       )
88*f9742813SAndroid Build Coastguard Worker     }
89*f9742813SAndroid Build Coastguard Worker   }
90*f9742813SAndroid Build Coastguard Worker 
91*f9742813SAndroid Build Coastguard Worker   plugins.withId("com.vanniktech.maven.publish.base") {
92*f9742813SAndroid Build Coastguard Worker     configure<PublishingExtension> {
93*f9742813SAndroid Build Coastguard Worker       repositories {
94*f9742813SAndroid Build Coastguard Worker         /**
95*f9742813SAndroid Build Coastguard Worker          * Want to push to an internal repository for testing? Set the following properties in
96*f9742813SAndroid Build Coastguard Worker          * `~/.gradle/gradle.properties`.
97*f9742813SAndroid Build Coastguard Worker          *
98*f9742813SAndroid Build Coastguard Worker          * internalMavenUrl=YOUR_INTERNAL_MAVEN_REPOSITORY_URL
99*f9742813SAndroid Build Coastguard Worker          * internalMavenUsername=YOUR_USERNAME
100*f9742813SAndroid Build Coastguard Worker          * internalMavenPassword=YOUR_PASSWORD
101*f9742813SAndroid Build Coastguard Worker          */
102*f9742813SAndroid Build Coastguard Worker         val internalUrl = providers.gradleProperty("internalUrl")
103*f9742813SAndroid Build Coastguard Worker         if (internalUrl.isPresent) {
104*f9742813SAndroid Build Coastguard Worker           maven {
105*f9742813SAndroid Build Coastguard Worker             name = "internal"
106*f9742813SAndroid Build Coastguard Worker             setUrl(internalUrl)
107*f9742813SAndroid Build Coastguard Worker             credentials(PasswordCredentials::class)
108*f9742813SAndroid Build Coastguard Worker           }
109*f9742813SAndroid Build Coastguard Worker         }
110*f9742813SAndroid Build Coastguard Worker       }
111*f9742813SAndroid Build Coastguard Worker     }
112*f9742813SAndroid Build Coastguard Worker     val publishingExtension = extensions.getByType(PublishingExtension::class.java)
113*f9742813SAndroid Build Coastguard Worker     configure<MavenPublishBaseExtension> {
114*f9742813SAndroid Build Coastguard Worker       publishToMavenCentral(SonatypeHost.S01, automaticRelease = true)
115*f9742813SAndroid Build Coastguard Worker       signAllPublications()
116*f9742813SAndroid Build Coastguard Worker       pom {
117*f9742813SAndroid Build Coastguard Worker         description.set("A modern I/O library for Android, Java, and Kotlin Multiplatform.")
118*f9742813SAndroid Build Coastguard Worker         name.set(project.name)
119*f9742813SAndroid Build Coastguard Worker         url.set("https://github.com/square/okio/")
120*f9742813SAndroid Build Coastguard Worker         licenses {
121*f9742813SAndroid Build Coastguard Worker           license {
122*f9742813SAndroid Build Coastguard Worker             name.set("The Apache Software License, Version 2.0")
123*f9742813SAndroid Build Coastguard Worker             url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
124*f9742813SAndroid Build Coastguard Worker             distribution.set("repo")
125*f9742813SAndroid Build Coastguard Worker           }
126*f9742813SAndroid Build Coastguard Worker         }
127*f9742813SAndroid Build Coastguard Worker         scm {
128*f9742813SAndroid Build Coastguard Worker           url.set("https://github.com/square/okio/")
129*f9742813SAndroid Build Coastguard Worker           connection.set("scm:git:git://github.com/square/okio.git")
130*f9742813SAndroid Build Coastguard Worker           developerConnection.set("scm:git:ssh://[email protected]/square/okio.git")
131*f9742813SAndroid Build Coastguard Worker         }
132*f9742813SAndroid Build Coastguard Worker         developers {
133*f9742813SAndroid Build Coastguard Worker           developer {
134*f9742813SAndroid Build Coastguard Worker             id.set("square")
135*f9742813SAndroid Build Coastguard Worker             name.set("Square, Inc.")
136*f9742813SAndroid Build Coastguard Worker           }
137*f9742813SAndroid Build Coastguard Worker         }
138*f9742813SAndroid Build Coastguard Worker       }
139*f9742813SAndroid Build Coastguard Worker 
140*f9742813SAndroid Build Coastguard Worker       // Configure the kotlinMultiplatform artifact to depend on the JVM artifact in pom.xml only.
141*f9742813SAndroid Build Coastguard Worker       // This hack allows Maven users to continue using our original Okio artifact names (like
142*f9742813SAndroid Build Coastguard Worker       // com.squareup.okio:okio:3.x.y) even though we changed that artifact from JVM-only to Kotlin
143*f9742813SAndroid Build Coastguard Worker       // Multiplatform. Note that module.json doesn't need this hack.
144*f9742813SAndroid Build Coastguard Worker       val mavenPublications = publishingExtension.publications.withType<MavenPublication>()
145*f9742813SAndroid Build Coastguard Worker       mavenPublications.configureEach {
146*f9742813SAndroid Build Coastguard Worker         if (name != "jvm") return@configureEach
147*f9742813SAndroid Build Coastguard Worker         val jvmPublication = this
148*f9742813SAndroid Build Coastguard Worker         val kmpPublication = mavenPublications.getByName("kotlinMultiplatform")
149*f9742813SAndroid Build Coastguard Worker         kmpPublication.pom.withXml {
150*f9742813SAndroid Build Coastguard Worker           val root = asNode()
151*f9742813SAndroid Build Coastguard Worker           val dependencies = (root["dependencies"] as NodeList).firstOrNull() as Node?
152*f9742813SAndroid Build Coastguard Worker             ?: root.appendNode("dependencies")
153*f9742813SAndroid Build Coastguard Worker           for (child in dependencies.children().toList()) {
154*f9742813SAndroid Build Coastguard Worker             dependencies.remove(child as Node)
155*f9742813SAndroid Build Coastguard Worker           }
156*f9742813SAndroid Build Coastguard Worker           dependencies.appendNode("dependency").apply {
157*f9742813SAndroid Build Coastguard Worker             appendNode("groupId", jvmPublication.groupId)
158*f9742813SAndroid Build Coastguard Worker             appendNode("artifactId", jvmPublication.artifactId)
159*f9742813SAndroid Build Coastguard Worker             appendNode("version", jvmPublication.version)
160*f9742813SAndroid Build Coastguard Worker             appendNode("scope", "compile")
161*f9742813SAndroid Build Coastguard Worker           }
162*f9742813SAndroid Build Coastguard Worker         }
163*f9742813SAndroid Build Coastguard Worker       }
164*f9742813SAndroid Build Coastguard Worker     }
165*f9742813SAndroid Build Coastguard Worker   }
166*f9742813SAndroid Build Coastguard Worker }
167*f9742813SAndroid Build Coastguard Worker 
168*f9742813SAndroid Build Coastguard Worker subprojects {
169*f9742813SAndroid Build Coastguard Worker   apply(plugin = "com.diffplug.spotless")
170*f9742813SAndroid Build Coastguard Worker   configure<SpotlessExtension> {
171*f9742813SAndroid Build Coastguard Worker     kotlin {
172*f9742813SAndroid Build Coastguard Worker       target("**/*.kt")
173*f9742813SAndroid Build Coastguard Worker       ktlint(libs.versions.ktlint.get())
174*f9742813SAndroid Build Coastguard Worker     }
175*f9742813SAndroid Build Coastguard Worker   }
176*f9742813SAndroid Build Coastguard Worker 
177*f9742813SAndroid Build Coastguard Worker   tasks.withType<KotlinCompile>().configureEach {
178*f9742813SAndroid Build Coastguard Worker     kotlinOptions {
179*f9742813SAndroid Build Coastguard Worker       jvmTarget = JavaVersion.VERSION_1_8.toString()
180*f9742813SAndroid Build Coastguard Worker       @Suppress("SuspiciousCollectionReassignment")
181*f9742813SAndroid Build Coastguard Worker       freeCompilerArgs += "-Xjvm-default=all"
182*f9742813SAndroid Build Coastguard Worker     }
183*f9742813SAndroid Build Coastguard Worker   }
184*f9742813SAndroid Build Coastguard Worker 
185*f9742813SAndroid Build Coastguard Worker   tasks.withType<JavaCompile> {
186*f9742813SAndroid Build Coastguard Worker     options.encoding = StandardCharsets.UTF_8.toString()
187*f9742813SAndroid Build Coastguard Worker     sourceCompatibility = JavaVersion.VERSION_1_8.toString()
188*f9742813SAndroid Build Coastguard Worker     targetCompatibility = JavaVersion.VERSION_1_8.toString()
189*f9742813SAndroid Build Coastguard Worker   }
190*f9742813SAndroid Build Coastguard Worker 
191*f9742813SAndroid Build Coastguard Worker   val testJavaVersion = System.getProperty("test.java.version", "19").toInt()
192*f9742813SAndroid Build Coastguard Worker   tasks.withType<Test> {
193*f9742813SAndroid Build Coastguard Worker     val javaToolchains = project.extensions.getByType<JavaToolchainService>()
194*f9742813SAndroid Build Coastguard Worker     javaLauncher.set(javaToolchains.launcherFor {
195*f9742813SAndroid Build Coastguard Worker       languageVersion.set(JavaLanguageVersion.of(testJavaVersion))
196*f9742813SAndroid Build Coastguard Worker     })
197*f9742813SAndroid Build Coastguard Worker 
198*f9742813SAndroid Build Coastguard Worker     testLogging {
199*f9742813SAndroid Build Coastguard Worker       events(STARTED, PASSED, SKIPPED, FAILED)
200*f9742813SAndroid Build Coastguard Worker       exceptionFormat = TestExceptionFormat.FULL
201*f9742813SAndroid Build Coastguard Worker       showStandardStreams = false
202*f9742813SAndroid Build Coastguard Worker     }
203*f9742813SAndroid Build Coastguard Worker 
204*f9742813SAndroid Build Coastguard Worker     if (loomEnabled) {
205*f9742813SAndroid Build Coastguard Worker       jvmArgs = jvmArgs!! + listOf(
206*f9742813SAndroid Build Coastguard Worker         "-Djdk.tracePinnedThread=full",
207*f9742813SAndroid Build Coastguard Worker         "--enable-preview",
208*f9742813SAndroid Build Coastguard Worker         "-DloomEnabled=true"
209*f9742813SAndroid Build Coastguard Worker       )
210*f9742813SAndroid Build Coastguard Worker     }
211*f9742813SAndroid Build Coastguard Worker   }
212*f9742813SAndroid Build Coastguard Worker 
213*f9742813SAndroid Build Coastguard Worker   tasks.withType<AbstractArchiveTask>().configureEach {
214*f9742813SAndroid Build Coastguard Worker     isPreserveFileTimestamps = false
215*f9742813SAndroid Build Coastguard Worker     isReproducibleFileOrder = true
216*f9742813SAndroid Build Coastguard Worker   }
217*f9742813SAndroid Build Coastguard Worker 
218*f9742813SAndroid Build Coastguard Worker   normalization {
219*f9742813SAndroid Build Coastguard Worker     runtimeClasspath {
220*f9742813SAndroid Build Coastguard Worker       metaInf {
221*f9742813SAndroid Build Coastguard Worker         ignoreAttribute("Bnd-LastModified")
222*f9742813SAndroid Build Coastguard Worker       }
223*f9742813SAndroid Build Coastguard Worker     }
224*f9742813SAndroid Build Coastguard Worker   }
225*f9742813SAndroid Build Coastguard Worker }
226*f9742813SAndroid Build Coastguard Worker 
227*f9742813SAndroid Build Coastguard Worker /**
228*f9742813SAndroid Build Coastguard Worker  * Select a NodeJS version with WASI and WASM GC.
229*f9742813SAndroid Build Coastguard Worker  * https://github.com/Kotlin/kotlin-wasm-examples/blob/main/wasi-example/build.gradle.kts
230*f9742813SAndroid Build Coastguard Worker  */
231*f9742813SAndroid Build Coastguard Worker plugins.withType<NodeJsRootPlugin> {
232*f9742813SAndroid Build Coastguard Worker   extensions.getByType<NodeJsRootExtension>().apply {
233*f9742813SAndroid Build Coastguard Worker     if (DefaultNativePlatform.getCurrentOperatingSystem().isWindows) {
234*f9742813SAndroid Build Coastguard Worker       // We're waiting for a Windows build of NodeJS that can do WASM GC + WASI.
235*f9742813SAndroid Build Coastguard Worker       nodeVersion = "21.4.0"
236*f9742813SAndroid Build Coastguard Worker     } else {
237*f9742813SAndroid Build Coastguard Worker       nodeVersion = "21.0.0-v8-canary202309143a48826a08"
238*f9742813SAndroid Build Coastguard Worker       nodeDownloadBaseUrl = "https://nodejs.org/download/v8-canary"
239*f9742813SAndroid Build Coastguard Worker     }
240*f9742813SAndroid Build Coastguard Worker   }
241*f9742813SAndroid Build Coastguard Worker   // Suppress an error because yarn doesn't like our Node version string.
242*f9742813SAndroid Build Coastguard Worker   //   warning You are using Node "21.0.0-v8-canary202309143a48826a08" which is not supported and
243*f9742813SAndroid Build Coastguard Worker   //   may encounter bugs or unexpected behavior.
244*f9742813SAndroid Build Coastguard Worker   //   error [email protected]: The engine "node" is incompatible with this module.
245*f9742813SAndroid Build Coastguard Worker   tasks.withType<KotlinNpmInstallTask>().all {
246*f9742813SAndroid Build Coastguard Worker     args += "--ignore-engines"
247*f9742813SAndroid Build Coastguard Worker   }
248*f9742813SAndroid Build Coastguard Worker }
249