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
This commit is contained in:
Yahor Berdnikau
2021-11-22 15:24:39 +01:00
parent b376146744
commit 5d11c5fa56
4 changed files with 39 additions and 5 deletions
@@ -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<Project> {
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()
@@ -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<KotlinTargetType : KotlinTarget>
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)
@@ -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) }
@@ -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<Configuration>.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)
)
}
}
}