[Gradle] Use METADATA attribute when no compatibility variant enabled

Consumer configurations with following set of attributes:

* org.gradle.usage = 'kotlin-api'
* org.jetbrains.kotlin.platform.type = 'common'

are supposed to consume legacy `*.kotlin_metadata` artifacts.
And can be consumed by HMPP project with
"Compatibility Metadata Variant Enabled" flag. For such purpose
`metadataCompileClasspath` configuration is configured with attributes
mentioned above.
There is no sense to consume such artifacts in HMPP projects without
compatibility metadata variant. And in order to prevent
breaking changes in KGP ecosystem, legacy configurations are
reconfigured to consume new KLIB metadata artifacts. Instead of failing
on resolution.

^KT-50925 Verification Pending
This commit is contained in:
Anton Lakotka
2022-03-14 17:09:29 +01:00
committed by Space
parent 9d754d7631
commit c42cedc0d0
@@ -8,11 +8,17 @@ package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
import org.gradle.api.attributes.*
import org.gradle.api.attributes.Usage.*
import org.gradle.kotlin.dsl.findByType
import org.gradle.kotlin.dsl.hasPlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformCommonPlugin
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.androidJvm
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.jvm
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.*
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.usageByName
import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
object KotlinUsages {
@@ -27,8 +33,11 @@ object KotlinUsages {
private val jvmPlatformTypes: Set<KotlinPlatformType> = setOf(jvm, androidJvm)
internal fun consumerApiUsage(project: Project, platformType: KotlinPlatformType) = project.usageByName(
when (platformType) {
in jvmPlatformTypes -> JAVA_API
when {
platformType in jvmPlatformTypes -> JAVA_API
platformType == common
&& project.kotlinExtension is KotlinMultiplatformExtension
&& !project.isCompatibilityMetadataVariantEnabled -> KOTLIN_METADATA
else -> KOTLIN_API
}
)