import java.util.Base64 plugins { // https://github.com/gradle/gradle/issues/20084#issuecomment-1060822638 id(libs.plugins.kotlin.multiplatform.get().pluginId) alias(libs.plugins.dokka) alias(libs.plugins.kotest) id("bip39.kotlin-multiplatform-conventions") id("bip39.dependency-conventions") // https://github.com/gradle/gradle/issues/20084#issuecomment-1060822638 id(libs.plugins.kotlinx.kover.get().pluginId) id("bip39.coverage-conventions") id("maven-publish") id("signing") } val enableNative = project.property("NATIVE_TARGETS_ENABLED").toString().toBoolean() val nativeTargets = if (enableNative) arrayOf( "linuxX64", "macosX64", "macosArm64", "iosArm64", "iosX64", "iosSimulatorArm64", "tvosArm64", "tvosX64", "tvosSimulatorArm64", "watchosArm32", "watchosArm64", "watchosX64", "watchosSimulatorArm64", "mingwX64" ) else arrayOf() kotlin { jvm { testRuns["test"].executionTask.configure { useJUnitPlatform() } } // TODO [#242]: Replace KotlinTargetPreset.createTarget() API // TODO [#242]: https://github.com/Electric-Coin-Company/kotlin-bip39/issues/242 for (target in nativeTargets) { targets.add(presets.getByName(target).createTarget(target)) } sourceSets { val commonMain by getting { dependencies { } } val commonTest by getting { dependencies { implementation(kotlin("test")) implementation(libs.kotest.framework.engine) implementation(libs.kotest.assertion) implementation(libs.kotest.property) } } @Suppress("UnusedPrivateProperty") val jvmMain by getting { dependencies { } } @Suppress("UnusedPrivateProperty") val jvmTest by getting { dependencies { implementation(libs.kotest.runner.junit5) } } // TODO [#243]: Replace dependsOn() API // TODO [#243]: https://github.com/Electric-Coin-Company/kotlin-bip39/issues/243 if (enableNative) { val nonJvmMain by creating { dependsOn(commonMain) dependencies { implementation(libs.com.squareup.okio) } } val mingwMain by creating { dependsOn(nonJvmMain) } val unixMain by creating { dependsOn(nonJvmMain) } for (target in nativeTargets) { when (target) { "mingwX64" -> getByName("${target}Main").dependsOn(mingwMain) else -> getByName("${target}Main").dependsOn(unixMain) } getByName("${target}Test").dependsOn(commonTest) } } } } tasks { val dokkaOutputDir = layout.buildDirectory.dir("dokka").get().asFile dokkaHtml.configure { outputDirectory.set(dokkaOutputDir) } val deleteDokkaOutputDir = register("deleteDokkaOutputDirectory") { delete(dokkaOutputDir) } register("javadocJar") { dependsOn(deleteDokkaOutputDir, dokkaHtml) archiveClassifier.set("javadoc") from(dokkaOutputDir) } } val publicationVariant = "release" val myVersion = project.property("LIBRARY_VERSION").toString() val myArtifactId = "kotlin-bip39" val isSnapshot = project.property("IS_SNAPSHOT").toString().toBoolean() publishing { publications { withType { artifact(tasks.getByName("javadocJar")) // Artifact id is tricky. Gradle uses the project name by default, but Kotlin multiplatform needs to add // platform specific suffixes. Doing a partial replacement is the way to rename the artifact. artifactId = artifactId.replace(project.name, myArtifactId) groupId = "cash.z.ecc.android" version = if (isSnapshot) { "$myVersion-SNAPSHOT" } else { myVersion } pom { name.set("Kotlin BIP-39") description.set("A concise implementation of BIP-0039 in Kotlin.") url.set("https://github.com/zcash/kotlin-bip39/") inceptionYear.set("2020") scm { url.set("https://github.com/zcash/kotlin-bip39/") connection.set("scm:git:git://github.com/zcash/kotlin-bip39.git") developerConnection.set("scm:git:ssh://git@github.com/zcash/kotlin-bip39.git") } developers { developer { id.set("zcash") name.set("Zcash") url.set("https://github.com/zcash/") } } licenses { license { name.set("The MIT License") url.set("https://opensource.org/licenses/MIT") distribution.set("repo") } } } } } repositories { val mavenUrl = if (isSnapshot) { project.property("ZCASH_MAVEN_PUBLISH_SNAPSHOT_URL").toString() } else { project.property("ZCASH_MAVEN_PUBLISH_RELEASE_URL").toString() } val mavenPublishUsername = project.property("ZCASH_MAVEN_PUBLISH_USERNAME").toString() val mavenPublishPassword = project.property("ZCASH_MAVEN_PUBLISH_PASSWORD").toString() mavenLocal { name = "MavenLocal" } maven(mavenUrl) { name = "MavenCentral" credentials { username = mavenPublishUsername password = mavenPublishPassword } } } } signing { // Maven Central requires signing for non-snapshots isRequired = !isSnapshot val signingKey = run { val base64EncodedKey = project.property("ZCASH_ASCII_GPG_KEY").toString() if (base64EncodedKey.isNotEmpty()) { val keyBytes = Base64.getDecoder().decode(base64EncodedKey) String(keyBytes) } else { "" } } if (signingKey.isNotEmpty()) { useInMemoryPgpKeys(signingKey, "") } sign(publishing.publications) } // Workaround for: // - https://youtrack.jetbrains.com/issue/KT-46466 // - https://github.com/gradle/gradle/issues/26091 // A problem was found with the configuration of task ':bip39-lib:signKotlinMultiplatformPublication' (type 'Sign'). // Gradle detected a problem with the following location: // '/home/runner/work/kotlin-bip39/kotlin-bip39/bip39-lib/build/libs/bip39-lib-javadoc.jar.asc'. // Reason: Task ':bip39-lib:publishJvmPublicationToMavenLocalRepository' uses this output of task // ':bip39-lib:signKotlinMultiplatformPublication' without declaring an explicit or implicit // dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. val signingTasks = tasks.withType() tasks.withType().configureEach { dependsOn(signingTasks) }