aboutsummaryrefslogtreecommitdiff
path: root/build.gradle.kts
diff options
context:
space:
mode:
Diffstat (limited to 'build.gradle.kts')
-rw-r--r--build.gradle.kts248
1 files changed, 248 insertions, 0 deletions
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 00000000..f564d88a
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,248 @@
+import aQute.bnd.gradle.BundleTaskConvention
+import com.diffplug.gradle.spotless.SpotlessExtension
+import com.vanniktech.maven.publish.MavenPublishBaseExtension
+import com.vanniktech.maven.publish.SonatypeHost
+import groovy.util.Node
+import groovy.util.NodeList
+import java.nio.charset.StandardCharsets
+import org.gradle.api.tasks.testing.logging.TestExceptionFormat
+import org.gradle.api.tasks.testing.logging.TestLogEvent.FAILED
+import org.gradle.api.tasks.testing.logging.TestLogEvent.PASSED
+import org.gradle.api.tasks.testing.logging.TestLogEvent.SKIPPED
+import org.gradle.api.tasks.testing.logging.TestLogEvent.STARTED
+import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
+import org.jetbrains.dokka.gradle.DokkaTask
+import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
+import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
+import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+ id("build-support").apply(false)
+}
+
+buildscript {
+ dependencies {
+ classpath(libs.android.gradle.plugin)
+ classpath(libs.dokka)
+ classpath(libs.jmh.gradle.plugin)
+ classpath(libs.binaryCompatibilityValidator)
+ classpath(libs.spotless)
+ classpath(libs.bnd)
+ classpath(libs.vanniktech.publish.plugin)
+ }
+
+ repositories {
+ mavenCentral()
+ gradlePluginPortal()
+ google()
+ }
+}
+
+apply(plugin = "com.vanniktech.maven.publish.base")
+
+// When scripts are applied the buildscript classes are not accessible directly therefore we save
+// the class here to make it accessible.
+ext.set("bndBundleTaskConventionClass", BundleTaskConvention::class.java)
+
+allprojects {
+ group = project.property("GROUP") as String
+ version = project.property("VERSION_NAME") as String
+
+ repositories {
+ mavenCentral()
+ google()
+ }
+
+ tasks.withType<DokkaTask>().configureEach {
+ dokkaSourceSets.configureEach {
+ reportUndocumented.set(false)
+ skipDeprecated.set(true)
+ jdkVersion.set(8)
+ perPackageOption {
+ matchingRegex.set("com\\.squareup.okio.*")
+ suppress.set(true)
+ }
+ perPackageOption {
+ matchingRegex.set("okio\\.internal.*")
+ suppress.set(true)
+ }
+ }
+
+ if (name == "dokkaHtml") {
+ outputDirectory.set(file("${rootDir}/docs/3.x/${project.name}"))
+ pluginsMapConfiguration.set(
+ mapOf(
+ "org.jetbrains.dokka.base.DokkaBase" to """
+ {
+ "customStyleSheets": [
+ "${rootDir.toString().replace('\\', '/')}/docs/css/dokka-logo.css"
+ ],
+ "customAssets" : [
+ "${rootDir.toString().replace('\\', '/')}/docs/images/icon-square.png"
+ ]
+ }
+ """.trimIndent()
+ )
+ )
+ }
+ }
+
+ plugins.withId("com.vanniktech.maven.publish.base") {
+ configure<PublishingExtension> {
+ repositories {
+ /**
+ * Want to push to an internal repository for testing? Set the following properties in
+ * `~/.gradle/gradle.properties`.
+ *
+ * internalMavenUrl=YOUR_INTERNAL_MAVEN_REPOSITORY_URL
+ * internalMavenUsername=YOUR_USERNAME
+ * internalMavenPassword=YOUR_PASSWORD
+ */
+ val internalUrl = providers.gradleProperty("internalUrl")
+ if (internalUrl.isPresent) {
+ maven {
+ name = "internal"
+ setUrl(internalUrl)
+ credentials(PasswordCredentials::class)
+ }
+ }
+ }
+ }
+ val publishingExtension = extensions.getByType(PublishingExtension::class.java)
+ configure<MavenPublishBaseExtension> {
+ publishToMavenCentral(SonatypeHost.S01, automaticRelease = true)
+ signAllPublications()
+ pom {
+ description.set("A modern I/O library for Android, Java, and Kotlin Multiplatform.")
+ name.set(project.name)
+ url.set("https://github.com/square/okio/")
+ licenses {
+ license {
+ name.set("The Apache Software License, Version 2.0")
+ url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
+ distribution.set("repo")
+ }
+ }
+ scm {
+ url.set("https://github.com/square/okio/")
+ connection.set("scm:git:git://github.com/square/okio.git")
+ developerConnection.set("scm:git:ssh://git@github.com/square/okio.git")
+ }
+ developers {
+ developer {
+ id.set("square")
+ name.set("Square, Inc.")
+ }
+ }
+ }
+
+ // Configure the kotlinMultiplatform artifact to depend on the JVM artifact in pom.xml only.
+ // This hack allows Maven users to continue using our original Okio artifact names (like
+ // com.squareup.okio:okio:3.x.y) even though we changed that artifact from JVM-only to Kotlin
+ // Multiplatform. Note that module.json doesn't need this hack.
+ val mavenPublications = publishingExtension.publications.withType<MavenPublication>()
+ mavenPublications.configureEach {
+ if (name != "jvm") return@configureEach
+ val jvmPublication = this
+ val kmpPublication = mavenPublications.getByName("kotlinMultiplatform")
+ kmpPublication.pom.withXml {
+ val root = asNode()
+ val dependencies = (root["dependencies"] as NodeList).firstOrNull() as Node?
+ ?: root.appendNode("dependencies")
+ for (child in dependencies.children().toList()) {
+ dependencies.remove(child as Node)
+ }
+ dependencies.appendNode("dependency").apply {
+ appendNode("groupId", jvmPublication.groupId)
+ appendNode("artifactId", jvmPublication.artifactId)
+ appendNode("version", jvmPublication.version)
+ appendNode("scope", "compile")
+ }
+ }
+ }
+ }
+ }
+}
+
+subprojects {
+ apply(plugin = "com.diffplug.spotless")
+ configure<SpotlessExtension> {
+ kotlin {
+ target("**/*.kt")
+ ktlint(libs.versions.ktlint.get())
+ }
+ }
+
+ tasks.withType<KotlinCompile>().configureEach {
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_1_8.toString()
+ @Suppress("SuspiciousCollectionReassignment")
+ freeCompilerArgs += "-Xjvm-default=all"
+ }
+ }
+
+ tasks.withType<JavaCompile> {
+ options.encoding = StandardCharsets.UTF_8.toString()
+ sourceCompatibility = JavaVersion.VERSION_1_8.toString()
+ targetCompatibility = JavaVersion.VERSION_1_8.toString()
+ }
+
+ val testJavaVersion = System.getProperty("test.java.version", "19").toInt()
+ tasks.withType<Test> {
+ val javaToolchains = project.extensions.getByType<JavaToolchainService>()
+ javaLauncher.set(javaToolchains.launcherFor {
+ languageVersion.set(JavaLanguageVersion.of(testJavaVersion))
+ })
+
+ testLogging {
+ events(STARTED, PASSED, SKIPPED, FAILED)
+ exceptionFormat = TestExceptionFormat.FULL
+ showStandardStreams = false
+ }
+
+ if (loomEnabled) {
+ jvmArgs = jvmArgs!! + listOf(
+ "-Djdk.tracePinnedThread=full",
+ "--enable-preview",
+ "-DloomEnabled=true"
+ )
+ }
+ }
+
+ tasks.withType<AbstractArchiveTask>().configureEach {
+ isPreserveFileTimestamps = false
+ isReproducibleFileOrder = true
+ }
+
+ normalization {
+ runtimeClasspath {
+ metaInf {
+ ignoreAttribute("Bnd-LastModified")
+ }
+ }
+ }
+}
+
+/**
+ * Select a NodeJS version with WASI and WASM GC.
+ * https://github.com/Kotlin/kotlin-wasm-examples/blob/main/wasi-example/build.gradle.kts
+ */
+plugins.withType<NodeJsRootPlugin> {
+ extensions.getByType<NodeJsRootExtension>().apply {
+ if (DefaultNativePlatform.getCurrentOperatingSystem().isWindows) {
+ // We're waiting for a Windows build of NodeJS that can do WASM GC + WASI.
+ nodeVersion = "21.4.0"
+ } else {
+ nodeVersion = "21.0.0-v8-canary202309143a48826a08"
+ nodeDownloadBaseUrl = "https://nodejs.org/download/v8-canary"
+ }
+ }
+ // Suppress an error because yarn doesn't like our Node version string.
+ // warning You are using Node "21.0.0-v8-canary202309143a48826a08" which is not supported and
+ // may encounter bugs or unexpected behavior.
+ // error typescript@5.0.4: The engine "node" is incompatible with this module.
+ tasks.withType<KotlinNpmInstallTask>().all {
+ args += "--ignore-engines"
+ }
+}