From be5a8fe2979efee13fe0ab18a48d998011d6c99d Mon Sep 17 00:00:00 2001 From: Adam <897017+aSemy@users.noreply.github.com> Date: Sat, 13 Jan 2024 18:59:27 +0100 Subject: [PATCH] use a complicated arrangement of feature-variants, compiledWith, and Gradle dependencies to split up Project/Settings plugins so that the Settings plugin can have an implementation dependency on KGP, while the Project plugin can have a compileOnly dependency --- .../gradle-plugin-bcv-features.gradle.kts | 72 +++++++++++++++++++ gradle.properties | 9 +-- gradle/libs.versions.toml | 8 +-- .../validation/test/SettingsPluginDslTest.kt | 6 +- .../api/bcv-gradle-plugin.api | 32 +-------- modules/bcv-gradle-plugin/build.gradle.kts | 54 +++++++++++++- .../src/main/kotlin/BCVPlugin.kt | 7 +- .../main/kotlin/internal/BCVInternalApi.kt | 2 +- .../main/kotlin/internal/gradleAccessors.kt | 8 --- .../kotlin/BCVProjectPlugin.kt | 0 .../kotlin/internal/gradleProjectAccessors.kt | 9 +++ .../kotlin/BCVSettingsPlugin.kt | 15 ++-- .../kotlin/dsl/bcvGradleDslAccessors.kt | 0 settings.gradle.kts | 3 + 14 files changed, 164 insertions(+), 61 deletions(-) create mode 100644 buildSrc/src/main/kotlin/buildsrc/conventions/gradle-plugin-bcv-features.gradle.kts rename modules/bcv-gradle-plugin/src/{main => mainBuildPlugin}/kotlin/BCVProjectPlugin.kt (100%) create mode 100644 modules/bcv-gradle-plugin/src/mainBuildPlugin/kotlin/internal/gradleProjectAccessors.kt rename modules/bcv-gradle-plugin/src/{main => mainSettingsPlugin}/kotlin/BCVSettingsPlugin.kt (76%) rename modules/bcv-gradle-plugin/src/{main => mainSettingsPlugin}/kotlin/dsl/bcvGradleDslAccessors.kt (100%) diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/gradle-plugin-bcv-features.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/gradle-plugin-bcv-features.gradle.kts new file mode 100644 index 0000000..6ff851a --- /dev/null +++ b/buildSrc/src/main/kotlin/buildsrc/conventions/gradle-plugin-bcv-features.gradle.kts @@ -0,0 +1,72 @@ +package buildsrc.conventions + +plugins { + id("org.gradle.kotlin.kotlin-dsl") +} + +val java = extensions.getByType() + +extensions.configure { +//sourceSets { + val mainBuildPlugin by creating { + kotlin { srcDir("src/mainBuildPlugin/kotlin") } + java { srcDirs(emptyList()) } + } + java.registerFeature(mainBuildPlugin.name) { + usingSourceSet(mainBuildPlugin) + withJavadocJar() + withSourcesJar() + project.run { + capability(group.toString(), name.replace("-plugin", "-build-plugin"), version.toString()) + } + } + val mainSettingsPlugin by creating { + kotlin { srcDir("src/mainSettingsPlugin/kotlin") } + java { srcDirs(emptyList()) } + } + java.registerFeature(mainSettingsPlugin.name) { + usingSourceSet(mainSettingsPlugin) + withJavadocJar() + withSourcesJar() + project.run { + capability(group.toString(), name.replace("-plugin", "-settings-plugin"), version.toString()) + } + } +} + +////extensions.configure { +//kotlin { +// target { +// val mainCompilation = compilations.named("main") +// compilations +// .matching { +// it.name == "mainBuildPlugin" || it.name == "mainSettingsPlugin" +// } +// .configureEach { +// associateWith(mainCompilation.get()) +// } +// } +//} + +plugins.withType().configureEach { + extensions.configure { + publications.withType().configureEach { + // disable warning because this project doesn't need to be resolvable by Maven + // > Maven publication 'pluginMaven' pom metadata warnings (silence with 'suppressPomMetadataWarningsFor(variant)'): + // > - Variant mainBuildPluginApiElements: + // > - Declares capability dev.adamko.kotlin.binary_compatibility_validator:bcv-gradle-build-plugin:main-SNAPSHOT which cannot be mapped to Maven + suppressPomMetadataWarningsFor("pluginMaven") + suppressPomMetadataWarningsFor("mainBuildPlugin") + suppressPomMetadataWarningsFor("mainSettingsPlugin") + + suppressPomMetadataWarningsFor("mainBuildPluginApiElements") + suppressPomMetadataWarningsFor("mainBuildPluginJavadocElements") + suppressPomMetadataWarningsFor("mainBuildPluginRuntimeElements") + suppressPomMetadataWarningsFor("mainBuildPluginSourcesElements") + suppressPomMetadataWarningsFor("mainSettingsPluginApiElements") + suppressPomMetadataWarningsFor("mainSettingsPluginJavadocElements") + suppressPomMetadataWarningsFor("mainSettingsPluginRuntimeElements") + suppressPomMetadataWarningsFor("mainSettingsPluginSourcesElements") + } + } +} diff --git a/gradle.properties b/gradle.properties index 92c473a..80c6fa4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,12 +1,7 @@ org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xmx4g -XX:+HeapDumpOnOutOfMemoryError org.gradle.caching=true - -org.gradle.unsafe.configuration-cache=true -org.gradle.unsafe.configuration-cache-problems=warn - +org.gradle.configuration-cache=true +org.gradle.configuration-cache-problems=warn org.gradle.parallel=true org.gradle.welcome=never - -# https://github.com/gradle/gradle/issues/9268#issuecomment-1397116301 -systemProp.org.gradle.unsafe.kotlin.assignment=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5c22c50..2728e1c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -kotlinGradle = "1.6.0" +kotlinGradle = "1.9.21" javaDiffUtils = "4.12" junit = "5.9.3" @@ -10,7 +10,7 @@ kotlinx-bcv = "0.13.2" gradlePluginPublishPlugin = "1.2.0" shadowPlugin = "8.1.1" devPublish = "0.2.0" -bcvMu = "0.0.3" +bcvMu = "0.1.0" #bcvMu = "0.2.0-SNAPSHOT" supportedGradleVersion = "7.6" # the minimal supported Gradle plugin version, used in functional tests @@ -19,8 +19,8 @@ supportedGradleVersion = "7.6" # the minimal supported Gradle plugin version, us javaDiffUtils = { module = "io.github.java-diff-utils:java-diff-utils", version.ref = "javaDiffUtils" } kotlinx-bcv = { module = "org.jetbrains.kotlinx:binary-compatibility-validator", version.ref = "kotlinx-bcv" } -kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlinGradle" } -kotlin-gradlePluginApi = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin-api", version.ref = "kotlinGradle" } +kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin" } +kotlin-gradlePluginApi = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin-api" } ## region Test Libraries kotest-bom = { module = "io.kotest:kotest-bom", version.ref = "kotest" } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt index bdc6029..3c15724 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt @@ -148,7 +148,7 @@ private fun kotlinMultiplatformProjectWithBcvSettingsPlugin() = private val settingsGradleKtsWithBcvPlugin = """ buildscript { dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.7.20") + //classpath("org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.7.20") } } @@ -176,7 +176,7 @@ binaryCompatibilityValidator { @Language("kts") private val buildGradleKtsWithKotlinJvmAndBcvConfig = """ plugins { - kotlin("jvm") version "1.7.20" + kotlin("jvm") version "1.9.21" } // check that the DSL is available: @@ -190,7 +190,7 @@ binaryCompatibilityValidator { } @Language("kts") private val buildGradleKtsWithKotlinMultiplatformJvmAndBcvConfig = """ plugins { - kotlin("multiplatform") version "1.7.20" + kotlin("multiplatform") version "1.9.21" } kotlin { diff --git a/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api b/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api index 8b660f6..159cc17 100644 --- a/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api +++ b/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api @@ -3,6 +3,8 @@ public abstract class dev/adamko/kotlin/binary_compatibility_validator/BCVPlugin public static final field API_DIR Ljava/lang/String; public static final field API_DUMP_TASK_NAME Ljava/lang/String; public static final field API_GENERATE_TASK_NAME Ljava/lang/String; + public static final field BCV_PROJECT_PLUGIN_ID Ljava/lang/String; + public static final field BCV_SETTINGS_PLUGIN_ID Ljava/lang/String; public static final field Companion Ldev/adamko/kotlin/binary_compatibility_validator/BCVPlugin$Companion; public static final field EXTENSION_NAME Ljava/lang/String; public static final field RUNTIME_CLASSPATH_CONFIGURATION_NAME Ljava/lang/String; @@ -30,30 +32,7 @@ public abstract class dev/adamko/kotlin/binary_compatibility_validator/BCVProjec public final fun getTargets ()Lorg/gradle/api/NamedDomainObjectContainer; } -public abstract class dev/adamko/kotlin/binary_compatibility_validator/BCVProjectPlugin : org/gradle/api/Plugin { - public static final field Companion Ldev/adamko/kotlin/binary_compatibility_validator/BCVProjectPlugin$Companion; - public synthetic fun apply (Ljava/lang/Object;)V - public fun apply (Lorg/gradle/api/Project;)V -} - -public final class dev/adamko/kotlin/binary_compatibility_validator/BCVProjectPlugin$Companion { -} - -public abstract class dev/adamko/kotlin/binary_compatibility_validator/BCVSettingsPlugin : org/gradle/api/Plugin { - public synthetic fun apply (Ljava/lang/Object;)V - public fun apply (Lorg/gradle/api/initialization/Settings;)V -} - -public abstract class dev/adamko/kotlin/binary_compatibility_validator/BCVSettingsPlugin$Extension { - public fun (Ldev/adamko/kotlin/binary_compatibility_validator/targets/BCVTargetSpec;)V - public final fun defaultTargetValues (Lkotlin/jvm/functions/Function1;)V - public final fun getDefaultTargetValues ()Ldev/adamko/kotlin/binary_compatibility_validator/targets/BCVTargetSpec; - public abstract fun getIgnoredProjects ()Lorg/gradle/api/provider/SetProperty; -} - -public final class dev/adamko/kotlin/binary_compatibility_validator/BCVSettingsPlugin$apply$1$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action { - public fun (Lkotlin/jvm/functions/Function1;)V - public final synthetic fun execute (Ljava/lang/Object;)V +public abstract interface annotation class dev/adamko/kotlin/binary_compatibility_validator/internal/BCVInternalApi : java/lang/annotation/Annotation { } public abstract class dev/adamko/kotlin/binary_compatibility_validator/targets/BCVTarget : dev/adamko/kotlin/binary_compatibility_validator/targets/BCVTargetSpec, java/io/Serializable, org/gradle/api/Named { @@ -112,8 +91,3 @@ public abstract class dev/adamko/kotlin/binary_compatibility_validator/tasks/BCV public final class dev/adamko/kotlin/binary_compatibility_validator/workers/BCVSignaturesWorker$Companion { } -public final class org/gradle/kotlin/dsl/BcvGradleDslAccessorsKt { - public static final fun binaryCompatibilityValidator (Lorg/gradle/api/initialization/Settings;Lkotlin/jvm/functions/Function1;)V - public static final fun getBinaryCompatibilityValidator (Lorg/gradle/api/initialization/Settings;)Ldev/adamko/kotlin/binary_compatibility_validator/BCVSettingsPlugin$Extension; -} - diff --git a/modules/bcv-gradle-plugin/build.gradle.kts b/modules/bcv-gradle-plugin/build.gradle.kts index e973a5d..89351c2 100644 --- a/modules/bcv-gradle-plugin/build.gradle.kts +++ b/modules/bcv-gradle-plugin/build.gradle.kts @@ -5,6 +5,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask plugins { buildsrc.conventions.`kotlin-gradle-plugin` + buildsrc.conventions.`gradle-plugin-bcv-features` id("dev.adamko.dev-publish") `java-test-fixtures` //com.github.johnrengelman.shadow @@ -15,10 +16,40 @@ plugins { dependencies { implementation(libs.javaDiffUtils) + runtimeOnly(projects.modules.bcvGradlePlugin) { + capabilities { + requireCapability("${project.group}:${project.name.replace("-plugin", "-build-plugin")}") + } + } + runtimeOnly(projects.modules.bcvGradlePlugin) { + capabilities { + requireCapability("${project.group}:${project.name.replace("-plugin", "-settings-plugin")}") + } + } + compileOnly(libs.kotlinx.bcv) -// compileOnly(libs.kotlin.gradlePlugin) compileOnly(libs.kotlin.gradlePluginApi) + mainBuildPluginCompileOnly(gradleApi()) + mainBuildPluginCompileOnly(libs.kotlin.gradlePluginApi) { + version { + prefer(embeddedKotlinVersion) +// prefer(libs.versions.kotlinGradle.get()) + } + } + mainBuildPluginCompileOnly(gradleKotlinDsl()) + mainBuildPluginImplementation(project) + + mainSettingsPluginCompileOnly(gradleApi()) + mainSettingsPluginCompileOnly(gradleKotlinDsl()) + mainSettingsPluginImplementation(project) + mainSettingsPluginImplementation(libs.kotlin.gradlePluginApi) { + version { + prefer(embeddedKotlinVersion) +// prefer(libs.versions.kotlinGradle.get()) + } + } + testFixturesApi(gradleTestKit()) testFixturesApi(platform(libs.junit.bom)) @@ -30,6 +61,27 @@ dependencies { testFixturesApi(libs.kotest.property) } +//configurations.mainBuildPluginRuntimeClasspath { +// extendsFrom(configurations.runtimeClasspath.get()) +//} +// +//configurations.mainSettingsPluginRuntimeClasspath { +// extendsFrom(configurations.runtimeClasspath.get()) +//} + +kotlin { + target { + val mainCompilation = compilations.named("main") + compilations + .matching { + it.name == "mainBuildPlugin" || it.name == "mainSettingsPlugin" + } + .configureEach { + associateWith(mainCompilation.get()) + } + } +} + @Suppress("UnstableApiUsage") gradlePlugin { website = "https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu" diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/BCVPlugin.kt b/modules/bcv-gradle-plugin/src/main/kotlin/BCVPlugin.kt index 3163de2..e1da0e0 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/BCVPlugin.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/BCVPlugin.kt @@ -13,8 +13,8 @@ abstract class BCVPlugin constructor() : Plugin { override fun apply(target: PluginAware) { when (target) { - is Project -> target.pluginManager.apply(BCVProjectPlugin::class) - is Settings -> target.pluginManager.apply(BCVSettingsPlugin::class) + is Project -> target.pluginManager.apply(BCV_PROJECT_PLUGIN_ID) + is Settings -> target.pluginManager.apply(BCV_SETTINGS_PLUGIN_ID) else -> error("cannot apply BCVPlugin to ${target::class}") } } @@ -29,5 +29,8 @@ constructor() : Plugin { const val API_CHECK_TASK_NAME = "apiCheck" const val API_DUMP_TASK_NAME = "apiDump" const val API_GENERATE_TASK_NAME = "apiGenerate" + + const val BCV_PROJECT_PLUGIN_ID = "dev.adamko.kotlin.binary-compatibility-validator.project" + const val BCV_SETTINGS_PLUGIN_ID = "dev.adamko.kotlin.binary-compatibility-validator.settings" } } diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/internal/BCVInternalApi.kt b/modules/bcv-gradle-plugin/src/main/kotlin/internal/BCVInternalApi.kt index 3789ed0..ad2c193 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/internal/BCVInternalApi.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/internal/BCVInternalApi.kt @@ -17,4 +17,4 @@ import kotlin.annotation.AnnotationTarget.* CONSTRUCTOR, ) @MustBeDocumented -internal annotation class BCVInternalApi +annotation class BCVInternalApi diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/internal/gradleAccessors.kt b/modules/bcv-gradle-plugin/src/main/kotlin/internal/gradleAccessors.kt index 9f7a061..62a5f54 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/internal/gradleAccessors.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/internal/gradleAccessors.kt @@ -1,9 +1 @@ package dev.adamko.kotlin.binary_compatibility_validator.internal - -import org.gradle.api.Project -import org.gradle.api.tasks.SourceSetContainer -import org.gradle.kotlin.dsl.* - - -internal val Project.sourceSets: SourceSetContainer - get() = extensions.getByType() diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectPlugin.kt b/modules/bcv-gradle-plugin/src/mainBuildPlugin/kotlin/BCVProjectPlugin.kt similarity index 100% rename from modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectPlugin.kt rename to modules/bcv-gradle-plugin/src/mainBuildPlugin/kotlin/BCVProjectPlugin.kt diff --git a/modules/bcv-gradle-plugin/src/mainBuildPlugin/kotlin/internal/gradleProjectAccessors.kt b/modules/bcv-gradle-plugin/src/mainBuildPlugin/kotlin/internal/gradleProjectAccessors.kt new file mode 100644 index 0000000..9f7a061 --- /dev/null +++ b/modules/bcv-gradle-plugin/src/mainBuildPlugin/kotlin/internal/gradleProjectAccessors.kt @@ -0,0 +1,9 @@ +package dev.adamko.kotlin.binary_compatibility_validator.internal + +import org.gradle.api.Project +import org.gradle.api.tasks.SourceSetContainer +import org.gradle.kotlin.dsl.* + + +internal val Project.sourceSets: SourceSetContainer + get() = extensions.getByType() diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/BCVSettingsPlugin.kt b/modules/bcv-gradle-plugin/src/mainSettingsPlugin/kotlin/BCVSettingsPlugin.kt similarity index 76% rename from modules/bcv-gradle-plugin/src/main/kotlin/BCVSettingsPlugin.kt rename to modules/bcv-gradle-plugin/src/mainSettingsPlugin/kotlin/BCVSettingsPlugin.kt index ed01a2e..c55ecd2 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/BCVSettingsPlugin.kt +++ b/modules/bcv-gradle-plugin/src/mainSettingsPlugin/kotlin/BCVSettingsPlugin.kt @@ -1,5 +1,6 @@ package dev.adamko.kotlin.binary_compatibility_validator +import dev.adamko.kotlin.binary_compatibility_validator.BCVPlugin.Companion.BCV_PROJECT_PLUGIN_ID import dev.adamko.kotlin.binary_compatibility_validator.internal.BCVInternalApi import dev.adamko.kotlin.binary_compatibility_validator.internal.globToRegex import dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTargetSpec @@ -39,12 +40,14 @@ constructor( globToRegex(it, Project.PATH_SEPARATOR).matches(project.path) } ) { - project.pluginManager.apply(BCVProjectPlugin::class) - project.extensions.configure { - enabled.convention(extension.defaultTargetValues.enabled) - ignoredClasses.convention(extension.defaultTargetValues.ignoredClasses) - ignoredMarkers.convention(extension.defaultTargetValues.ignoredMarkers) - ignoredPackages.convention(extension.defaultTargetValues.ignoredPackages) + project.pluginManager.apply(BCV_PROJECT_PLUGIN_ID) + project.pluginManager.withPlugin(BCV_PROJECT_PLUGIN_ID) { + project.extensions.configure { + enabled.convention(extension.defaultTargetValues.enabled) + ignoredClasses.convention(extension.defaultTargetValues.ignoredClasses) + ignoredMarkers.convention(extension.defaultTargetValues.ignoredMarkers) + ignoredPackages.convention(extension.defaultTargetValues.ignoredPackages) + } } } } diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/dsl/bcvGradleDslAccessors.kt b/modules/bcv-gradle-plugin/src/mainSettingsPlugin/kotlin/dsl/bcvGradleDslAccessors.kt similarity index 100% rename from modules/bcv-gradle-plugin/src/main/kotlin/dsl/bcvGradleDslAccessors.kt rename to modules/bcv-gradle-plugin/src/mainSettingsPlugin/kotlin/dsl/bcvGradleDslAccessors.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index ef04132..7da05be 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -89,6 +89,9 @@ val gitVersion: Provider = if (!detached) { "$branch-SNAPSHOT" + // control chars and slashes aren't allowed in Maven Versions + .map { c -> if (c.isISOControl() || c == '/' || c == '\\') "_" else c } + .joinToString("") } else { val descriptions = described.split("-") val head = descriptions.singleOrNull() ?: ""