Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KMP integration with Android and JVM #106

Merged
merged 15 commits into from
Jan 28, 2025
Prev Previous commit
Next Next commit
syncing
matheus-corregiari committed Jan 27, 2025
commit 2af2d36ad665d5d3699dd351b557054091ca836b
Original file line number Diff line number Diff line change
@@ -26,11 +26,6 @@ internal class ToolkitTestPlugin : Plugin<Project> {
disable()
}
}
// with(target.koverReport) {
// defaults { reports ->
// reports.mergeWith("debug")
// }
// }

// Kover configuration
with(target.jacoco) { toolVersion = target.libs.version("jacoco") }
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.toolkit.plugin.android

import com.toolkit.plugin.util.attachAllTasksIntoAssembleRelease
import com.toolkit.plugin.util.configurePom
import com.toolkit.plugin.util.createLocalPathRepository
import com.toolkit.plugin.util.createSonatypeRepository
@@ -68,6 +69,9 @@ internal class ToolkitPublishPlugin : Plugin<Project> {
}
}

// Attach all needed tasks into assembleRelease task
target.attachAllTasksIntoAssembleRelease()

// Setup Signing
if (target.missing("signing.keyId", "signing.password", "signing.secretKeyRingFile")) {
println("Missing env variables")
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.toolkit.plugin.multiplatform

import com.toolkit.plugin.util.attachAllTasksIntoAssembleRelease
import com.toolkit.plugin.util.createLocalPathRepository
import com.toolkit.plugin.util.createSonatypeRepository
import com.toolkit.plugin.util.missing
@@ -55,6 +56,9 @@ internal class ToolkitPublishPlugin : Plugin<Project> {
}
}

// Attach all needed tasks into assembleRelease task
target.attachAllTasksIntoAssembleRelease()

// Setup Signing
if (target.missing("signing.keyId", "signing.password", "signing.secretKeyRingFile")) {
println("Missing env variables")
Original file line number Diff line number Diff line change
@@ -1,71 +1,32 @@
package com.toolkit.plugin.util

import org.gradle.api.Project
import org.gradle.api.tasks.javadoc.Javadoc
import org.gradle.jvm.tasks.Jar
import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.dokka.gradle.DokkaTask

internal fun Project.setupJavadocAndSources() {
return
val sourcesJar = setupSources()
val javadocJar = setupJavadoc()
setupArtifacts(javadocJar, sourcesJar)

tasks.whenTaskAdded {
when (it.name) {
"assembleRelease" -> {
it.finalizedBy(sourcesJar, javadocJar)
}

"signJvmPublication" -> {
it.finalizedBy(sourcesJar, javadocJar)
}

"signToolkitPublication" -> {
it.dependsOn(sourcesJar, javadocJar)
}

"signKotlinMultiplatformPublication" -> {
it.dependsOn(sourcesJar, javadocJar)
}
}
}
}

private fun Project.setupJavadoc(): Jar {
configurations.maybeCreate("jacocoDeps")

val javadoc = tasks.register("javadoc", Javadoc::class.java) {
val list = ArrayList<java.io.File>()
androidLibrary2.sourceSets.forEach { set -> list.addAll(set.java.srcDirs) }

it.isFailOnError = false
it.setExcludes(listOf("**/*.kt", "**/*.java"))
it.source(list)
it.classpath += files(androidLibrary2.bootClasspath.joinToString(separator = File.separator))
it.classpath += configurations.named("jacocoDeps").get()
}.get()

return tasks.register("javadocJar", Jar::class.java) {
it.dependsOn(javadoc)
it.archiveClassifier.set("javadoc")
it.from(javadoc.destinationDir)
}.get()
setupSources()
setupJavadoc()
}

private fun Project.setupSources() = if (tasks.findByName("sourcesJar") == null) {
tasks.register("sourcesJar", Jar::class.java) {
val mainSource = androidLibrary2.sourceSets.named("main").get().java.srcDirs
it.from(mainSource)
it.archiveClassifier.set("sources")
private fun Project.setupJavadoc() {
applyPlugins("jetbrains-dokka")
tasks.register("javadocJar", Jar::class.java) { task ->
task.group = "documentation"
val dokka = task.project.tasks.named("dokkaHtml", DokkaTask::class.java)
task.dependsOn(dokka)
task.from(dokka.flatMap(DokkaTask::outputDirectory))
task.archiveClassifier.set("javadoc")
task.archiveFileName.set("${task.project.name}-release-javadoc.jar")
}.get()
} else {
tasks.named("sourcesJar", Jar::class.java).get()
}

private fun Project.setupArtifacts(javadoc: Jar, sources: Jar) {
artifacts {
it.add("archives", javadoc)
it.add("archives", sources)
private fun Project.setupSources() {
tasks.whenTaskAdded { task ->
if (task !is Jar) return@whenTaskAdded
when (task.name) {
"releaseSourcesJar" -> task.archiveFileName.set("${task.project.name}-release-sources.jar")
"debugSourcesJar" -> task.archiveFileName.set("${task.project.name}-debug-sources.jar")
}
}
}
Original file line number Diff line number Diff line change
@@ -7,16 +7,17 @@ import com.android.build.api.variant.LibraryAndroidComponentsExtension
import com.android.build.gradle.BaseExtension
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import kotlinx.kover.gradle.plugin.dsl.KoverProjectExtension
//import kotlinx.kover.gradle.plugin.dsl.KoverReportExtension
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalog
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.tasks.javadoc.Javadoc
import org.gradle.jvm.tasks.Jar
import org.gradle.plugins.signing.Sign
import org.gradle.plugins.signing.SigningExtension
import org.gradle.testing.jacoco.plugins.JacocoPluginExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jlleitschuh.gradle.ktlint.KtlintExtension
import com.android.build.gradle.LibraryExtension as LibraryExtension2

internal val Project.libs: VersionCatalog
@Throws(IllegalStateException::class)
@@ -50,21 +51,11 @@ internal val Project.kover: KoverProjectExtension
get() = extensions.findByType(KoverProjectExtension::class.java)
?: error("Project do not implement kover plugin!")

//internal val Project.koverReport: KoverReportExtension
// @Throws(IllegalStateException::class)
// get() = extensions.findByType(KoverReportExtension::class.java)
// ?: error("Project do not implement kover plugin!")

internal val Project.androidLibrary: LibraryExtension
@Throws(IllegalStateException::class)
get() = extensions.findByType(LibraryExtension::class.java)
?: error("Project do not implement android-library plugin!")

internal val Project.androidLibrary2: LibraryExtension2
@Throws(IllegalStateException::class)
get() = extensions.findByType(LibraryExtension2::class.java)
?: error("Project do not implement android-library plugin!")

internal val Project.androidApplication: ApplicationExtension
@Throws(IllegalStateException::class)
get() = extensions.findByType(ApplicationExtension::class.java)
@@ -95,11 +86,22 @@ internal val Project.sign: SigningExtension
get() = extensions.findByType(SigningExtension::class.java)
?: error("Project do not implement signing plugin!")

internal fun Project.applyPlugins(vararg id: String) {
id.forEach {
plugins.apply(libs.findPlugin(it).get().get().pluginId)
}
}
internal fun Project.applyPlugins(vararg id: String) =
id.forEach { plugins.apply(libs.findPlugin(it).get().get().pluginId) }

internal fun Project.hasPlugins(vararg id: String) =
id.all { plugins.hasPlugin(libs.findPlugin(it).get().get().pluginId) }

internal fun Project.attachAllTasksIntoAssembleRelease() = afterEvaluate { project ->
val all = project.tasks.filter { task ->
when (task) {
is Jar, is Sign, is Javadoc -> when {
task.name.contains("debug", true) -> false
else -> true
}

else -> false
}
}.map { project.tasks.named(it.name) }
project.tasks.findByName("assembleRelease")?.dependsOn(all)
}
31 changes: 19 additions & 12 deletions toolkit/multi/splinter/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
plugins {
id("toolkit-android-library")
id("toolkit-publish")
id("toolkit-multiplatform-library")
id("toolkit-multiplatform-publish")
}

android.namespace = "br.com.arch.toolkit.splinter"
android.buildFeatures.androidResources = false
android.buildFeatures.buildConfig = false

dependencies {
// Other Modules
implementation(project(":toolkit:multi:event-observer"))

kotlin {
// Libraries
compileOnly(libs.jetbrains.stdlib.jdk8)
compileOnly(libs.jetbrains.coroutines.core)
compileOnly(libs.jetbrains.coroutines.android)
compileOnly(libs.androidx.lifecycle.livedata)
compileOnly(libs.square.retrofit.main)
compileOnly(libs.square.timber)
sourceSets.commonMain.dependencies {
implementation(project(":toolkit:multi:event-observer"))

implementation(libs.jetbrains.coroutines.core)
implementation(libs.androidx.lifecycle.runtime)
implementation(libs.androidx.annotation)
}
sourceSets.androidMain.dependencies {
implementation(libs.androidx.lifecycle.livedata)
implementation(libs.jetbrains.coroutines.android)
implementation(libs.square.timber)
compileOnly(libs.square.okhttp.core)
compileOnly(libs.square.retrofit.main)
}
}