diff options
Diffstat (limited to 'build.gradle.kts')
-rw-r--r-- | build.gradle.kts | 248 |
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" + } +} |