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