diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4241397..a447c18 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,7 +20,8 @@ gradle-api = "dev.gradleplugins:gradle-api:8.8" gratatouille-gradle-plugin = "com.gradleup.gratatouille:com.gradleup.gratatouille.gradle.plugin:0.2.2" jsonpath = "com.eygraber:jsonpathkt-kotlinx:3.0.2" jsonpathkt = "com.eygraber:jsonpathkt-kotlinx:3.0.2" -kgp-compile-only = "org.jetbrains.kotlin:kotlin-gradle-plugin:2.3.20" +kgp220 = "org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.0" +kgp2320 = "org.jetbrains.kotlin:kotlin-gradle-plugin:2.3.20" kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kgp" } ksp-gradle-plugin = "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:2.3.3" librarian-gradle-plugin = "com.gradleup.librarian:librarian-gradle-plugin:0.2.2-SNAPSHOT-c2127df7d03b2946fc025bf67d31cac3e2c5a397" diff --git a/librarian-gradle-plugin/build.gradle.kts b/librarian-gradle-plugin/build.gradle.kts index ab8520a..5fa57c7 100644 --- a/librarian-gradle-plugin/build.gradle.kts +++ b/librarian-gradle-plugin/build.gradle.kts @@ -1,4 +1,5 @@ import com.gradleup.librarian.gradle.Librarian +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation plugins { id("org.jetbrains.kotlin.jvm") @@ -32,9 +33,37 @@ dependencies { compileOnly(libs.gradle.api) compileOnly(libs.agp) - compileOnly(libs.kgp.compile.only) + compileOnly(libs.kgp220) testImplementation(kotlin("test")) testImplementation(gradleTestKit()) testImplementation(libs.mockserver) } + +private fun addEdge(compilation: KotlinCompilation<*>, dependency: KotlinCompilation<*>) { + compilation.defaultSourceSet.dependencies { + compileOnly(dependency.output.classesDirs) + } +} + +val mainCompilation = kotlin.target.compilations.getByName("main") + +mapOf( + "220" to setOf(libs.kgp220), + "2320" to setOf(libs.kgp2320) +).forEach { + val compilation = kotlin.target.compilations.create("kgp-${it.key}") + + addEdge(mainCompilation, compilation) // Needed to be able + + tasks.jar { + from(compilation.output.classesDirs) + } + dependencies { + it.value.forEach { + add(compilation.compileOnlyConfigurationName, it) + } + // See https://issuetracker.google.com/issues/445209309 + add(compilation.compileOnlyConfigurationName, libs.gradle.api) + } +} \ No newline at end of file diff --git a/librarian-gradle-plugin/src/kgp-220/kotlin/com/gradleup/librarian/internal/bcv220.kt b/librarian-gradle-plugin/src/kgp-220/kotlin/com/gradleup/librarian/internal/bcv220.kt new file mode 100644 index 0000000..ea07438 --- /dev/null +++ b/librarian-gradle-plugin/src/kgp-220/kotlin/com/gradleup/librarian/internal/bcv220.kt @@ -0,0 +1,48 @@ +@file:OptIn(ExperimentalAbiValidation::class) + +package com.gradleup.librarian.internal + +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension +import org.jetbrains.kotlin.gradle.dsl.abi.AbiValidationExtension +import org.jetbrains.kotlin.gradle.dsl.abi.AbiValidationMultiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.abi.ExperimentalAbiValidation + +fun Project.configureBcv220( + excludePatterns: List = emptyList(), +) { + extensions.getByType(KotlinProjectExtension::class.java).apply { + val abiValidation = this.extensions.findByName("abiValidation") ?: error("No abiValidation extension found") + + when (abiValidation) { + is AbiValidationExtension -> { + abiValidation.enabled.set(true) + abiValidation.filters { + it.excluded.byNames.addAll(excludePatterns) + } + } + + is AbiValidationMultiplatformExtension -> { + abiValidation.enabled.set(true) + abiValidation.filters { + it.excluded.byNames.addAll(excludePatterns) + } + } + + else -> error("Librarian: unknown abiValidation extension type: '${abiValidation.javaClass.name}'") + } + + /** + * Compatibility tasks to not break the brain muscle + */ + tasks.named("build") { + it.dependsOn("checkLegacyAbi") + } + tasks.register("apiDump") { + it.dependsOn("updateLegacyAbi") + } + tasks.register("apiCheck") { + it.dependsOn("checkLegacyAbi") + } + } +} \ No newline at end of file diff --git a/librarian-gradle-plugin/src/kgp-2320/kotlin/com/gradleup/librarian/internal/bcv2320.kt b/librarian-gradle-plugin/src/kgp-2320/kotlin/com/gradleup/librarian/internal/bcv2320.kt new file mode 100644 index 0000000..7c6132f --- /dev/null +++ b/librarian-gradle-plugin/src/kgp-2320/kotlin/com/gradleup/librarian/internal/bcv2320.kt @@ -0,0 +1,51 @@ +@file:OptIn(ExperimentalAbiValidation::class) + +package com.gradleup.librarian.internal + +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension +import org.jetbrains.kotlin.gradle.dsl.abi.AbiValidationExtension +import org.jetbrains.kotlin.gradle.dsl.abi.AbiValidationMultiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.abi.ExperimentalAbiValidation + +fun Project.configureBcv2320( + excludePatterns: List = emptyList(), +) { + extensions.getByType(KotlinProjectExtension::class.java).apply { + val abiValidation = this.extensions.findByName("abiValidation") ?: error("No abiValidation extension found") + + when (abiValidation) { + is AbiValidationExtension -> { + abiValidation.enabled.set(true) + abiValidation.filters { + it.exclude.byNames.addAll(excludePatterns) + } + } + + is AbiValidationMultiplatformExtension -> { + abiValidation.enabled.set(true) + abiValidation.filters { + it.exclude.byNames.addAll(excludePatterns) + } + } + + else -> error("Librarian: unknown abiValidation extension type: '${abiValidation.javaClass.name}'") + } + + /** + * Compatibility tasks to not break the brain muscle + */ + tasks.register("apiDump") { + it.dependsOn("updateKotlinAbi") + it.doLast { + println("`apiDump` is deprecated. Use `updateKotlinAbi` instead") + } + } + tasks.register("apiCheck") { + it.dependsOn("checkKotlinAbi") + it.doLast { + println("`apiCheck` is deprecated. Use `updateKotlinAbi` instead") + } + } + } +} \ No newline at end of file diff --git a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/bcv.kt b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/bcv.kt index f2bb061..0fae8dd 100644 --- a/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/bcv.kt +++ b/librarian-gradle-plugin/src/main/kotlin/com/gradleup/librarian/gradle/bcv.kt @@ -3,10 +3,9 @@ package com.gradleup.librarian.gradle import com.gradleup.librarian.core.tooling.semVerOrThrow +import com.gradleup.librarian.internal.configureBcv220 +import com.gradleup.librarian.internal.configureBcv2320 import org.gradle.api.Project -import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension -import org.jetbrains.kotlin.gradle.dsl.abi.AbiValidationExtension -import org.jetbrains.kotlin.gradle.dsl.abi.AbiValidationMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.abi.ExperimentalAbiValidation import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion @@ -14,57 +13,13 @@ fun Project.configureBcv( warnIfMissing: Boolean = true, excludePatterns: List = emptyList(), ) { - extensions.getByType(KotlinProjectExtension::class.java).apply { - val abiValidation = this.extensions.findByName("abiValidation") + // See https://kotlinlang.org/docs/whatsnew2320.html#improvements-to-binary-compatibility-validation-in-kgp + val kgpVersion = this@configureBcv.getKotlinPluginVersion().semVerOrThrow() - if (abiValidation != null) { - when (abiValidation) { - is AbiValidationExtension -> { - abiValidation.enabled.set(true) - abiValidation.filters { - it.exclude.byNames.addAll(excludePatterns) - } - } - is AbiValidationMultiplatformExtension -> { - abiValidation.enabled.set(true) - abiValidation.filters { - it.exclude.byNames.addAll(excludePatterns) - } - } - else -> error("Librarian: unknown abiValidation extension type: '${abiValidation.javaClass.name}'") - } - - // See https://kotlinlang.org/docs/whatsnew2320.html#improvements-to-binary-compatibility-validation-in-kgp - val kgpVersion = this@configureBcv.getKotlinPluginVersion().semVerOrThrow() - - /** - * Compatibility tasks to not break the brain muscle - */ - if (kgpVersion >= "2.3.20".semVerOrThrow()) { - tasks.register("apiDump") { - it.dependsOn("updateKotlinAbi") - it.doLast { - println("`apiDump` is deprecated. Use `updateKotlinAbi` instead") - } - } - tasks.register("apiCheck") { - it.dependsOn("checkKotlinAbi") - it.doLast { - println("`apiCheck` is deprecated. Use `updateKotlinAbi` instead") - } - } - } else { - tasks.named("build") { - it.dependsOn("checkLegacyAbi") - } - tasks.register("apiDump") { - it.dependsOn("updateLegacyAbi") - } - tasks.register("apiCheck") { - it.dependsOn("checkLegacyAbi") - } - } - } else { + when { + kgpVersion >= "2.3.20".semVerOrThrow() -> configureBcv2320(excludePatterns) + kgpVersion >= "2.2.0".semVerOrThrow() -> configureBcv220(excludePatterns) + else -> { if (warnIfMissing) { println("Librarian: BCV is only configured by default if using KGP 2.2+ (currently detected is '${getKotlinPluginVersion()}'). Set bcv.warn=false in your librarian.root.properties file to remove this warning.") }