KT-49189: fix project(...) dependencies on MPP from pure-Java consumers
* Don't set the localToProject attribute anymore, as it prevents proper disambiguation if not set properly on all configurations, while all the intentionally-public configurations should already have the same value. * Disambiguate o.j.k.platform.type Android vs JVM preferring JVM, as Android should have other attributes which make pure-Android consumers match the Android MPP variants. * With Gradle 7.0+, set the attribute `org.gradle.api.attributes.java.TargetJvmEnvironment` on the JVM & Android elements configurations, which helps pure-Android consumers to match the Android, not JVM variants. This fixes KT-30961 for Gradle 7.0+ and AGP 7.0+ Issues: KT-49189, KT-30961
This commit is contained in:
+1
-2
@@ -12,6 +12,7 @@ import com.android.build.gradle.api.BaseVariant
|
||||
import com.android.build.gradle.api.SourceKind
|
||||
import org.gradle.api.*
|
||||
import org.gradle.api.artifacts.repositories.ArtifactRepository
|
||||
import org.gradle.api.attributes.Bundling
|
||||
import org.gradle.api.attributes.Category
|
||||
import org.gradle.api.attributes.Usage
|
||||
import org.gradle.api.file.ConfigurableFileTree
|
||||
@@ -613,14 +614,12 @@ internal abstract class AbstractKotlinPlugin(
|
||||
project.configurations.getByName(kotlinTarget.apiElementsConfigurationName).run {
|
||||
attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(kotlinTarget))
|
||||
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
|
||||
setupAsPublicConfigurationIfSupported(kotlinTarget)
|
||||
usesPlatformOf(kotlinTarget)
|
||||
}
|
||||
|
||||
project.configurations.getByName(kotlinTarget.runtimeElementsConfigurationName).run {
|
||||
attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerRuntimeUsage(kotlinTarget))
|
||||
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
|
||||
setupAsPublicConfigurationIfSupported(kotlinTarget)
|
||||
usesPlatformOf(kotlinTarget)
|
||||
}
|
||||
}
|
||||
|
||||
+22
-2
@@ -6,12 +6,14 @@
|
||||
package org.jetbrains.kotlin.gradle.plugin
|
||||
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.Named
|
||||
import org.gradle.api.NamedDomainObjectContainer
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.artifacts.Configuration
|
||||
import org.gradle.api.artifacts.Dependency
|
||||
import org.gradle.api.artifacts.PublishArtifact
|
||||
import org.gradle.api.artifacts.type.ArtifactTypeDefinition
|
||||
import org.gradle.api.attributes.Attribute
|
||||
import org.gradle.api.attributes.Category
|
||||
import org.gradle.api.attributes.Usage
|
||||
import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE
|
||||
@@ -38,6 +40,7 @@ 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.lowerCamelCaseName
|
||||
import java.util.concurrent.Callable
|
||||
import kotlin.reflect.KMutableProperty1
|
||||
@@ -182,7 +185,6 @@ abstract class AbstractKotlinTargetConfigurator<KotlinTargetType : KotlinTarget>
|
||||
runtimeConfiguration?.let { extendsFrom(it) }
|
||||
}
|
||||
usesPlatformOf(target)
|
||||
setupAsPublicConfigurationIfSupported(target)
|
||||
}
|
||||
|
||||
if (mainCompilation is KotlinCompilationToRunnableFiles<*>) {
|
||||
@@ -199,7 +201,6 @@ abstract class AbstractKotlinTargetConfigurator<KotlinTargetType : KotlinTarget>
|
||||
extendsFrom(runtimeOnlyConfiguration)
|
||||
runtimeConfiguration?.let { extendsFrom(it) }
|
||||
usesPlatformOf(target)
|
||||
setupAsPublicConfigurationIfSupported(target)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -500,6 +501,12 @@ internal fun Project.categoryByName(categoryName: String): Category =
|
||||
fun Configuration.usesPlatformOf(target: KotlinTarget): Configuration {
|
||||
attributes.attribute(KotlinPlatformType.attribute, target.platformType)
|
||||
|
||||
when (target.platformType) {
|
||||
KotlinPlatformType.jvm -> setJavaTargetEnvironmentAttributeIfSupported(target.project, "standard-jvm")
|
||||
KotlinPlatformType.androidJvm -> setJavaTargetEnvironmentAttributeIfSupported(target.project, "android")
|
||||
else -> Unit
|
||||
}
|
||||
|
||||
if (target is KotlinJsTarget) {
|
||||
attributes.attribute(KotlinJsCompilerAttribute.jsCompilerAttribute, KotlinJsCompilerAttribute.legacy)
|
||||
}
|
||||
@@ -515,6 +522,19 @@ fun Configuration.usesPlatformOf(target: KotlinTarget): Configuration {
|
||||
return this
|
||||
}
|
||||
|
||||
private fun Configuration.setJavaTargetEnvironmentAttributeIfSupported(project: Project, value: String) {
|
||||
if (isGradleVersionAtLeast(7, 0)) {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val attributeClass = Class.forName("org.gradle.api.attributes.java.TargetJvmEnvironment") as Class<out Named>
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val attributeKey = attributeClass.getField("TARGET_JVM_ENVIRONMENT_ATTRIBUTE").get(null) as Attribute<Named>
|
||||
|
||||
val attributeValue = project.objects.named(attributeClass, value)
|
||||
attributes.attribute(attributeKey, attributeValue)
|
||||
}
|
||||
}
|
||||
|
||||
internal val Project.commonKotlinPluginClasspath get() = configurations.getByName(PLUGIN_CLASSPATH_CONFIGURATION_NAME)
|
||||
internal val KotlinCompilation<*>.pluginConfigurationName
|
||||
get() = lowerCamelCaseName(PLUGIN_CLASSPATH_CONFIGURATION_NAME, target.disambiguationClassifier, compilationName)
|
||||
+5
-8
@@ -9,11 +9,15 @@ import org.gradle.api.artifacts.Configuration
|
||||
import org.gradle.api.attributes.*
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
|
||||
|
||||
/**
|
||||
* This attribute is registered in the schema only for the case if some 3rd-party consumer or published
|
||||
* module still has it or relies on it. The Kotlin Gradle plugin should not add this attribute to any variant.
|
||||
* TODO: examine and remove
|
||||
*/
|
||||
object ProjectLocalConfigurations {
|
||||
val ATTRIBUTE: Attribute<String> = Attribute.of("org.jetbrains.kotlin.localToProject", String::class.java)
|
||||
|
||||
const val PUBLIC_VALUE = "public"
|
||||
const val LOCAL_TO_PROJECT_PREFIX = "local to "
|
||||
|
||||
fun setupAttributesMatchingStrategy(attributesSchema: AttributesSchema) = with(attributesSchema) {
|
||||
attribute(ATTRIBUTE) {
|
||||
@@ -43,12 +47,5 @@ internal fun Configuration.setupAsLocalTargetSpecificConfigurationIfSupported(ta
|
||||
// `api/RuntimeElements` with the KotlinPlatformType
|
||||
if ((target !is KotlinWithJavaTarget<*> || target.platformType != KotlinPlatformType.common)) {
|
||||
usesPlatformOf(target)
|
||||
attributes.attribute(ProjectLocalConfigurations.ATTRIBUTE, ProjectLocalConfigurations.LOCAL_TO_PROJECT_PREFIX + target.project.path)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun Configuration.setupAsPublicConfigurationIfSupported(target: KotlinTarget) {
|
||||
if ((target !is KotlinWithJavaTarget<*> || target.platformType != KotlinPlatformType.common)) {
|
||||
attributes.attribute(ProjectLocalConfigurations.ATTRIBUTE, ProjectLocalConfigurations.PUBLIC_VALUE)
|
||||
}
|
||||
}
|
||||
|
||||
+5
-1
@@ -14,6 +14,7 @@ import org.gradle.api.Project
|
||||
import org.gradle.api.artifacts.ArtifactCollection
|
||||
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
|
||||
import org.gradle.api.attributes.Attribute
|
||||
import org.gradle.api.attributes.Category
|
||||
import org.gradle.api.file.FileCollection
|
||||
import org.gradle.api.specs.Spec
|
||||
import org.gradle.api.tasks.PathSensitivity
|
||||
@@ -143,7 +144,10 @@ class Android25ProjectHandler(
|
||||
}
|
||||
|
||||
listOf(apiElementsConfigurationName, runtimeElementsConfigurationName).forEach { outputConfigurationName ->
|
||||
project.configurations.findByName(outputConfigurationName)?.usesPlatformOf(compilation.target)
|
||||
project.configurations.findByName(outputConfigurationName)?.let { configuration ->
|
||||
configuration.usesPlatformOf(compilation.target)
|
||||
configuration.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-1
@@ -119,7 +119,6 @@ open class KotlinJsTargetConfigurator :
|
||||
isCanBeConsumed = true
|
||||
attributes.attribute<Usage>(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target))
|
||||
attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.common)
|
||||
setupAsPublicConfigurationIfSupported(target)
|
||||
}
|
||||
}
|
||||
}
|
||||
-1
@@ -161,7 +161,6 @@ open class KotlinJsIrTargetConfigurator() :
|
||||
isCanBeConsumed = true
|
||||
attributes.attribute<Usage>(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target))
|
||||
attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.common)
|
||||
setupAsPublicConfigurationIfSupported(target)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-1
@@ -450,7 +450,6 @@ class KotlinMetadataTargetConfigurator :
|
||||
project.configurations.create(COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME).apply {
|
||||
isCanBeConsumed = true
|
||||
isCanBeResolved = false
|
||||
setupAsPublicConfigurationIfSupported(target)
|
||||
usesPlatformOf(target)
|
||||
|
||||
attributes.attribute(USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target))
|
||||
|
||||
-1
@@ -82,7 +82,6 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
|
||||
linkTask: TaskProvider<KotlinNativeLink>
|
||||
) {
|
||||
fun <T : Task> Configuration.configureConfiguration(taskProvider: TaskProvider<T>) {
|
||||
setupAsPublicConfigurationIfSupported(binary.target)
|
||||
project.afterEvaluate {
|
||||
val task = taskProvider.get()
|
||||
val artifactFile = when (task) {
|
||||
|
||||
-1
@@ -62,7 +62,6 @@ internal fun Project.locateOrCreateCInteropApiElementsConfiguration(target: Kotl
|
||||
return configurations.create(configurationName).apply {
|
||||
isCanBeResolved = false
|
||||
isCanBeConsumed = true
|
||||
setupAsPublicConfigurationIfSupported(target)
|
||||
|
||||
usesPlatformOf(target)
|
||||
attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, cinteropKlibLibraryElements())
|
||||
|
||||
Reference in New Issue
Block a user