From 5d11c5fa56ec85eb40966cc3d2b926a1569380d0 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Mon, 22 Nov 2021 15:24:39 +0100 Subject: [PATCH] Add attributes to the kotlin subplugins classpath. This removes selection ambiguity and provides Gradle multi-variant support for 3rd party compile plugins wrapped in Gradle. ^KT-49227 In Progress --- .../gradle/plugin/KotlinPluginWrapper.kt | 11 ++++++++- .../gradle/plugin/KotlinTargetConfigurator.kt | 8 +++---- .../mpp/pm20/GradleKpmCompilerPlugin.kt | 2 ++ .../gradle/utils/gradleConfigurationUtils.kt | 23 +++++++++++++++++++ 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index d6690674a98..4eaf72a891c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -43,6 +43,7 @@ import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropKlibLibraryEl import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestsRegistry import org.jetbrains.kotlin.gradle.tooling.registerBuildKotlinToolingMetadataTask +import org.jetbrains.kotlin.gradle.utils.addGradlePluginMetadataAttributes import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility import org.jetbrains.kotlin.gradle.utils.getOrPut import org.jetbrains.kotlin.gradle.utils.loadPropertyFromResources @@ -75,9 +76,17 @@ abstract class KotlinBasePluginWrapper : Plugin { addKotlinCompilerConfiguration(project) - project.configurations.maybeCreate(PLUGIN_CLASSPATH_CONFIGURATION_NAME) + project.configurations.maybeCreate(PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply { + isVisible = false + isCanBeConsumed = false + addGradlePluginMetadataAttributes(project) + } + project.configurations.maybeCreate(NATIVE_COMPILER_PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply { + isVisible = false + isCanBeConsumed = false isTransitive = false + addGradlePluginMetadataAttributes(project) } project.registerCommonizerClasspathConfigurationIfNecessary() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index ef957f2e73c..94eb0949dfb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -38,10 +38,7 @@ import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.registerTask -import org.jetbrains.kotlin.gradle.tasks.withType -import org.jetbrains.kotlin.gradle.utils.COMPILE -import org.jetbrains.kotlin.gradle.utils.RUNTIME -import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast +import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import java.util.concurrent.Callable import kotlin.reflect.KMutableProperty1 @@ -281,8 +278,11 @@ abstract class AbstractKotlinTargetConfigurator val configurations = target.project.configurations configurations.maybeCreate(compilation.pluginConfigurationName).apply { + addGradlePluginMetadataAttributes(project) + if (target.platformType == KotlinPlatformType.native) { extendsFrom(configurations.getByName(NATIVE_COMPILER_PLUGIN_CLASSPATH_CONFIGURATION_NAME)) + isTransitive = false } else { extendsFrom(target.project.commonKotlinPluginClasspath) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmCompilerPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmCompilerPlugin.kt index e749b7abba0..e51c89a19c5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmCompilerPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmCompilerPlugin.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.gradle.plugin.FilesSubpluginOption import org.jetbrains.kotlin.gradle.plugin.SubpluginOption import org.jetbrains.kotlin.gradle.tasks.CompilerPluginOptions import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerPluginData +import org.jetbrains.kotlin.gradle.utils.addGradlePluginMetadataAttributes import org.jetbrains.kotlin.gradle.utils.newProperty import org.jetbrains.kotlin.project.model.* import java.io.File @@ -94,6 +95,7 @@ internal class CompilerPluginOptionsBuilder( isCanBeResolved = true isVisible = false reorderPluginClasspathDependencies() + addGradlePluginMetadataAttributes(project) } artifacts.forEach { project.dependencies.add(configurationName, it) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleConfigurationUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleConfigurationUtils.kt index 6102187342a..5253e7c2e01 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleConfigurationUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/gradleConfigurationUtils.kt @@ -8,6 +8,13 @@ package org.jetbrains.kotlin.gradle.utils import org.gradle.api.NamedDomainObjectProvider import org.gradle.api.Project import org.gradle.api.artifacts.Configuration +import org.gradle.api.attributes.Category +import org.gradle.api.attributes.LibraryElements +import org.gradle.api.attributes.Usage +import org.gradle.api.attributes.plugin.GradlePluginApiVersion +import org.gradle.kotlin.dsl.named +import org.gradle.util.GradleVersion +import java.lang.RuntimeException fun Project.addExtendsFromRelation(extendingConfigurationName: String, extendsFromConfigurationName: String, forced: Boolean = true) { if (extendingConfigurationName == extendsFromConfigurationName) return @@ -23,3 +30,19 @@ fun NamedDomainObjectProvider.extendsFrom(other: NamedDomainObjec if (name == other.name) return configure { extending -> extending.extendsFrom(other.get()) } } + +internal fun Configuration.addGradlePluginMetadataAttributes( + project: Project +) { + attributes { + it.attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY)) + it.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME)) + it.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR)) + if (GradleVersion.current() >= GradleVersion.version("7.0")) { + it.attribute( + GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE, + project.objects.named(GradlePluginApiVersion::class.java, GradleVersion.current().version) + ) + } + } +}