[Gradle] Add role-based configuration method factories

Starting from Gradle 8.2 there is deprecation diagnostic that
disallows changing configuration roles after creation.

With Gradle 8.4 there is an Incubating API that introduces
role factories for Configuration. For consistency reasons names that
introduced in this commit match the names that Gradle introduces in 8.4
version.

^KT-60879
This commit is contained in:
Anton Lakotka
2023-11-10 12:54:43 +01:00
parent e94b247835
commit 2ab30d8880
32 changed files with 215 additions and 240 deletions
@@ -16,8 +16,9 @@ import org.jetbrains.kotlin.commonizer.CliCommonizer
import org.jetbrains.kotlin.gradle.internal.KOTLIN_MODULE_GROUP import org.jetbrains.kotlin.gradle.internal.KOTLIN_MODULE_GROUP
import org.jetbrains.kotlin.gradle.plugin.KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.plugin.KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.utils.markResolvable
import org.jetbrains.kotlin.gradle.plugin.usageByName import org.jetbrains.kotlin.gradle.plugin.usageByName
import org.jetbrains.kotlin.gradle.utils.createResolvable
import org.jetbrains.kotlin.gradle.utils.findResolvable
import org.jetbrains.kotlin.gradle.utils.named import org.jetbrains.kotlin.gradle.utils.named
private const val KOTLIN_KLIB_COMMONIZER_EMBEDDABLE = "kotlin-klib-commonizer-embeddable" private const val KOTLIN_KLIB_COMMONIZER_EMBEDDABLE = "kotlin-klib-commonizer-embeddable"
@@ -29,9 +30,8 @@ internal fun GradleCliCommonizer(commonizerToolRunner: KotlinNativeCommonizerToo
} }
internal fun Project.maybeCreateCommonizerClasspathConfiguration(): Configuration { internal fun Project.maybeCreateCommonizerClasspathConfiguration(): Configuration {
return configurations.findByName(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME) return configurations.findResolvable(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME)
?: project.configurations.create(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME) ?: project.configurations.createResolvable(KLIB_COMMONIZER_CLASSPATH_CONFIGURATION_NAME)
.markResolvable()
.run { .run {
attributes.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY))
attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR))
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.COMMON_MAIN_ELEMENTS_CONFIGU
import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isCompatibilityMetadataVariantEnabled
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.createConsumable
internal val KotlinLegacyCompatibilityMetadataArtifact = KotlinTargetArtifact { target, _, _ -> internal val KotlinLegacyCompatibilityMetadataArtifact = KotlinTargetArtifact { target, _, _ ->
if (target !is KotlinMetadataTarget) return@KotlinTargetArtifact if (target !is KotlinMetadataTarget) return@KotlinTargetArtifact
@@ -35,9 +36,7 @@ internal val KotlinLegacyCompatibilityMetadataArtifact = KotlinTargetArtifact {
} }
/* Create actual Gradle artifact */ /* Create actual Gradle artifact */
target.project.configurations.create(COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME).apply { target.project.configurations.createConsumable(COMMON_MAIN_ELEMENTS_CONFIGURATION_NAME).apply {
isCanBeConsumed = true
isCanBeResolved = false
usesPlatformOf(target) usesPlatformOf(target)
attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target)) attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target))
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnab
import org.jetbrains.kotlin.gradle.targets.native.internal.includeCommonizedCInteropMetadata import org.jetbrains.kotlin.gradle.targets.native.internal.includeCommonizedCInteropMetadata
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import org.jetbrains.kotlin.gradle.utils.copyAttributes import org.jetbrains.kotlin.gradle.utils.copyAttributes
import org.jetbrains.kotlin.gradle.utils.createConsumable
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
internal val KotlinNativeHostSpecificMetadataArtifact = KotlinTargetArtifact { target, apiElements, _ -> internal val KotlinNativeHostSpecificMetadataArtifact = KotlinTargetArtifact { target, apiElements, _ ->
@@ -30,10 +31,7 @@ internal val KotlinNativeHostSpecificMetadataArtifact = KotlinTargetArtifact { t
if (!target.project.isKotlinGranularMetadataEnabled) return@KotlinTargetArtifact if (!target.project.isKotlinGranularMetadataEnabled) return@KotlinTargetArtifact
val project = target.project val project = target.project
target.project.configurations.create(target.hostSpecificMetadataElementsConfigurationName) { configuration -> target.project.configurations.createConsumable(target.hostSpecificMetadataElementsConfigurationName).also { configuration ->
configuration.isCanBeConsumed = true
configuration.isCanBeResolved = false
configuration.extendsFrom(*apiElements.extendsFrom.toTypedArray()) configuration.extendsFrom(*apiElements.extendsFrom.toTypedArray())
target.project.launchInStage(AfterFinaliseDsl) { target.project.launchInStage(AfterFinaliseDsl) {
@@ -32,6 +32,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaCompilation
import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.gradle.tasks.configuration.* import org.jetbrains.kotlin.gradle.tasks.configuration.*
import org.jetbrains.kotlin.gradle.utils.createResolvable
import org.jetbrains.kotlin.gradle.utils.findResolvable
import org.jetbrains.kotlin.gradle.utils.whenEvaluated import org.jetbrains.kotlin.gradle.utils.whenEvaluated
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
@@ -142,10 +144,8 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To
fun createAptConfigurationIfNeeded(project: Project, sourceSetName: String): Configuration { fun createAptConfigurationIfNeeded(project: Project, sourceSetName: String): Configuration {
val configurationName = getKaptConfigurationName(sourceSetName) val configurationName = getKaptConfigurationName(sourceSetName)
project.configurations.findByName(configurationName)?.let { return it } project.configurations.findResolvable(configurationName)?.let { return it }
val aptConfiguration = project.configurations.create(configurationName).apply { val aptConfiguration = project.configurations.createResolvable(configurationName).apply {
// Should not be available for consumption from other projects during variant-aware dependency resolution:
isCanBeConsumed = false
attributes.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class.java, Usage.JAVA_RUNTIME)) attributes.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class.java, Usage.JAVA_RUNTIME))
} }
@@ -368,11 +368,9 @@ class Kapt3GradleSubplugin @Inject internal constructor(private val registry: To
kaptExtension kaptExtension
) )
val kaptClasspathConfiguration = project.configurations.create("kaptClasspath_$taskName") val kaptClasspathConfiguration = project.configurations.createResolvable("kaptClasspath_$taskName")
.setExtendsFrom(kaptClasspathConfigurations).also { .setExtendsFrom(kaptClasspathConfigurations).also {
it.isVisible = false it.isVisible = false
it.isCanBeConsumed = false
it.isCanBeResolved = true
} }
taskConfigAction.configureTaskProvider { taskProvider -> taskConfigAction.configureTaskProvider { taskProvider ->
taskProvider.dependsOn(generateStubsTask) taskProvider.dependsOn(generateStubsTask)
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnosticOncePerBuild import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnosticOncePerBuild
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.utils.createDependencyScope
import org.jetbrains.kotlin.gradle.utils.whenEvaluated import org.jetbrains.kotlin.gradle.utils.whenEvaluated
abstract class KotlinPlatformPluginBase(protected val platformName: String) : Plugin<Project> { abstract class KotlinPlatformPluginBase(protected val platformName: String) : Plugin<Project> {
@@ -53,8 +54,8 @@ open class KotlinPlatformImplementationPluginBase(platformName: String) : Kotlin
override fun apply(project: Project) { override fun apply(project: Project) {
warnAboutKotlin12xMppDeprecation(project) warnAboutKotlin12xMppDeprecation(project)
val implementConfig = project.configurations.create(IMPLEMENT_CONFIG_NAME) val implementConfig = project.configurations.createDependencyScope(IMPLEMENT_CONFIG_NAME)
val expectedByConfig = project.configurations.create(EXPECTED_BY_CONFIG_NAME) val expectedByConfig = project.configurations.createDependencyScope(EXPECTED_BY_CONFIG_NAME)
implementConfig.dependencies.whenObjectAdded { implementConfig.dependencies.whenObjectAdded {
if (!implementConfigurationIsUsed) { if (!implementConfigurationIsUsed) {
@@ -70,10 +70,8 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
addKotlinCompilerConfiguration(project) addKotlinCompilerConfiguration(project)
project.configurations.maybeCreate(PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply { project.configurations.maybeCreateResolvable(PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply {
isVisible = false isVisible = false
isCanBeConsumed = false
isCanBeResolved = true
addGradlePluginMetadataAttributes(project) addGradlePluginMetadataAttributes(project)
} }
@@ -88,8 +86,7 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
private fun addKotlinCompilerConfiguration(project: Project) { private fun addKotlinCompilerConfiguration(project: Project) {
project project
.configurations .configurations
.maybeCreate(COMPILER_CLASSPATH_CONFIGURATION_NAME) .maybeCreateResolvable(COMPILER_CLASSPATH_CONFIGURATION_NAME)
.markResolvable()
.defaultDependencies { .defaultDependencies {
it.add( it.add(
project.dependencies.create("$KOTLIN_MODULE_GROUP:$KOTLIN_COMPILER_EMBEDDABLE:${project.getKotlinPluginVersion()}") project.dependencies.create("$KOTLIN_MODULE_GROUP:$KOTLIN_COMPILER_EMBEDDABLE:${project.getKotlinPluginVersion()}")
@@ -97,8 +94,7 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
} }
project project
.configurations .configurations
.maybeCreate(BUILD_TOOLS_API_CLASSPATH_CONFIGURATION_NAME) .maybeCreateResolvable(BUILD_TOOLS_API_CLASSPATH_CONFIGURATION_NAME)
.markResolvable()
.defaultDependencies { .defaultDependencies {
it.add( it.add(
project.dependencies.create("$KOTLIN_MODULE_GROUP:$KOTLIN_BUILD_TOOLS_API_IMPL:${project.getKotlinPluginVersion()}") project.dependencies.create("$KOTLIN_MODULE_GROUP:$KOTLIN_BUILD_TOOLS_API_IMPL:${project.getKotlinPluginVersion()}")
@@ -227,9 +223,8 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() {
project.logger.info("Using Kotlin Gradle Plugin $pluginVariant variant") project.logger.info("Using Kotlin Gradle Plugin $pluginVariant variant")
checkGradleCompatibility() checkGradleCompatibility()
project.configurations.maybeCreate(NATIVE_COMPILER_PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply { project.configurations.maybeCreateResolvable(NATIVE_COMPILER_PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply {
isVisible = false isVisible = false
isCanBeConsumed = false
isTransitive = false isTransitive = false
addGradlePluginMetadataAttributes(project) addGradlePluginMetadataAttributes(project)
} }
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.InternalKotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.sources.InternalKotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.utils.detachedResolvable
import org.jetbrains.kotlin.gradle.utils.relativeOrAbsolute import org.jetbrains.kotlin.gradle.utils.relativeOrAbsolute
import org.jetbrains.kotlin.tooling.core.mutableExtrasOf import org.jetbrains.kotlin.tooling.core.mutableExtrasOf
@@ -244,8 +244,7 @@ class IdeBinaryDependencyResolver @JvmOverloads constructor(
if (sourceSet !is DefaultKotlinSourceSet) return null if (sourceSet !is DefaultKotlinSourceSet) return null
val project = sourceSet.project val project = sourceSet.project
val platformLikeCompileDependenciesConfiguration = project.configurations.detachedConfiguration() val platformLikeCompileDependenciesConfiguration = project.configurations.detachedResolvable()
platformLikeCompileDependenciesConfiguration.markResolvable()
platformLikeCompileDependenciesConfiguration.attributes.setupPlatformResolutionAttributes(sourceSet) platformLikeCompileDependenciesConfiguration.attributes.setupPlatformResolutionAttributes(sourceSet)
platformLikeCompileDependenciesConfiguration.dependencies.addAll(sourceSet.resolvableMetadataConfiguration.allDependencies) platformLikeCompileDependenciesConfiguration.dependencies.addAll(sourceSet.resolvableMetadataConfiguration.allDependencies)
@@ -34,7 +34,6 @@ import org.jetbrains.kotlin.gradle.targets.metadata.*
import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.Future import org.jetbrains.kotlin.gradle.utils.Future
import org.jetbrains.kotlin.gradle.utils.future import org.jetbrains.kotlin.gradle.utils.future
import org.jetbrains.kotlin.gradle.utils.markResolvable
import org.jetbrains.kotlin.gradle.utils.setProperty import org.jetbrains.kotlin.gradle.utils.setProperty
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
@@ -207,7 +206,7 @@ class DefaultKotlinUsageContext(
* attributes schema migration, or create proper, non-detached configurations for publishing that are separated from the * attributes schema migration, or create proper, non-detached configurations for publishing that are separated from the
* configurations used for project-to-project dependencies * configurations used for project-to-project dependencies
*/ */
val result = project.configurations.detachedConfiguration().markResolvable().attributes val result = project.configurations.detachedResolvable().attributes
// Capture type parameter T: // Capture type parameter T:
fun <T> copyAttribute(attribute: Attribute<T>, from: AttributeContainer, to: AttributeContainer) { fun <T> copyAttribute(attribute: Attribute<T>, from: AttributeContainer, to: AttributeContainer) {
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.DefaultKotlinCompi
import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationConfigurationsContainer import org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCompilationConfigurationsContainer
import org.jetbrains.kotlin.gradle.plugin.mpp.javaSourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.javaSourceSets
import org.jetbrains.kotlin.gradle.plugin.sources.METADATA_CONFIGURATION_NAME_SUFFIX import org.jetbrains.kotlin.gradle.plugin.sources.METADATA_CONFIGURATION_NAME_SUFFIX
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.*
internal sealed class DefaultKotlinCompilationDependencyConfigurationsFactory : internal sealed class DefaultKotlinCompilationDependencyConfigurationsFactory :
@@ -101,84 +100,72 @@ private fun KotlinCompilationDependencyConfigurationsContainer(
val compilationCoordinates = "${target.disambiguationClassifier}/$compilationName" val compilationCoordinates = "${target.disambiguationClassifier}/$compilationName"
/* Support deprecated configurations */ /* Support deprecated configurations */
val deprecatedCompileConfiguration = target.project.configurations.findByName( val deprecatedCompileConfiguration = target.project.configurations.findDependencyScope(
ConfigurationNaming.Default(target, compilationName).name(COMPILE) ConfigurationNaming.Default(target, compilationName).name(COMPILE)
)?.apply { )?.apply {
isCanBeConsumed = false
setupAsLocalTargetSpecificConfigurationIfSupported(target) setupAsLocalTargetSpecificConfigurationIfSupported(target)
isVisible = false isVisible = false
isCanBeResolved = false
description = "Dependencies for $compilation (deprecated, use '${implementationConfigurationName} ' instead)." description = "Dependencies for $compilation (deprecated, use '${implementationConfigurationName} ' instead)."
} }
val deprecatedRuntimeConfiguration = if (withRuntime) target.project.configurations.findByName( val deprecatedRuntimeConfiguration = if (withRuntime) target.project.configurations.findDependencyScope(
ConfigurationNaming.Default(target, compilationName).name(RUNTIME) ConfigurationNaming.Default(target, compilationName).name(RUNTIME)
)?.apply { )?.apply {
isCanBeConsumed = false
setupAsLocalTargetSpecificConfigurationIfSupported(target) setupAsLocalTargetSpecificConfigurationIfSupported(target)
deprecatedCompileConfiguration?.let { extendsFrom(it) } deprecatedCompileConfiguration?.let { extendsFrom(it) }
isVisible = false isVisible = false
isCanBeResolved = false
description = description =
"Runtime dependencies for $compilation (deprecated, use '${runtimeOnlyConfigurationName} ' instead)." "Runtime dependencies for $compilation (deprecated, use '${runtimeOnlyConfigurationName} ' instead)."
} else null } else null
/* Actual configurations */ /* Actual configurations */
val apiConfiguration = target.project.configurations.maybeCreate(apiConfigurationName).apply { val apiConfiguration = target.project.configurations.maybeCreateDependencyScope(apiConfigurationName).apply {
deprecatedCompileConfiguration?.let { extendsFrom(it) } deprecatedCompileConfiguration?.let { extendsFrom(it) }
isVisible = false isVisible = false
isCanBeConsumed = false
isCanBeResolved = false
description = "API dependencies for $compilationCoordinates" description = "API dependencies for $compilationCoordinates"
} }
val implementationConfiguration = target.project.configurations.maybeCreate(implementationConfigurationName).apply { val implementationConfiguration = target.project.configurations
extendsFrom(apiConfiguration) .maybeCreateDependencyScope(implementationConfigurationName).apply {
deprecatedCompileConfiguration?.let { extendsFrom(it) } extendsFrom(apiConfiguration)
isVisible = false deprecatedCompileConfiguration?.let { extendsFrom(it) }
isCanBeConsumed = false isVisible = false
isCanBeResolved = false description = "Implementation only dependencies for $compilationCoordinates."
description = "Implementation only dependencies for $compilationCoordinates." }
}
val compileOnlyConfiguration = target.project.configurations.maybeCreate(compileOnlyConfigurationName).apply { val compileOnlyConfiguration = target.project.configurations
isCanBeConsumed = false .maybeCreateDependencyScope(compileOnlyConfigurationName).apply {
setupAsLocalTargetSpecificConfigurationIfSupported(target) setupAsLocalTargetSpecificConfigurationIfSupported(target)
attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY))
isVisible = false isVisible = false
isCanBeResolved = false description = "Compile only dependencies for $compilationCoordinates."
description = "Compile only dependencies for $compilationCoordinates." }
}
val runtimeOnlyConfiguration = target.project.configurations.maybeCreate(runtimeOnlyConfigurationName).apply { val runtimeOnlyConfiguration = target.project.configurations.maybeCreateDependencyScope(runtimeOnlyConfigurationName).apply {
isVisible = false isVisible = false
isCanBeConsumed = false
isCanBeResolved = false
description = "Runtime only dependencies for $compilationCoordinates." description = "Runtime only dependencies for $compilationCoordinates."
} }
val compileDependencyConfiguration = target.project.configurations.maybeCreate(compileClasspathConfigurationName).apply { val compileDependencyConfiguration = target.project.configurations
extendsFrom(compileOnlyConfiguration, implementationConfiguration) .maybeCreateResolvable(compileClasspathConfigurationName).apply {
usesPlatformOf(target) extendsFrom(compileOnlyConfiguration, implementationConfiguration)
isVisible = false usesPlatformOf(target)
isCanBeConsumed = false isVisible = false
attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerApiUsage(target)) attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerApiUsage(target))
if (target.platformType != KotlinPlatformType.androidJvm) { if (target.platformType != KotlinPlatformType.androidJvm) {
attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY))
}
description = "Compile classpath for $compilationCoordinates."
} }
description = "Compile classpath for $compilationCoordinates."
}
val runtimeDependencyConfiguration = val runtimeDependencyConfiguration =
if (withRuntime) target.project.configurations.maybeCreate(runtimeClasspathConfigurationName).apply { if (withRuntime) target.project.configurations.maybeCreateResolvable(runtimeClasspathConfigurationName).apply {
extendsFrom(runtimeOnlyConfiguration, implementationConfiguration) extendsFrom(runtimeOnlyConfiguration, implementationConfiguration)
deprecatedRuntimeConfiguration?.let { extendsFrom(it) } deprecatedRuntimeConfiguration?.let { extendsFrom(it) }
usesPlatformOf(target) usesPlatformOf(target)
isVisible = false isVisible = false
isCanBeConsumed = false
isCanBeResolved = true
attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target)) attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target))
if (target.platformType != KotlinPlatformType.androidJvm) { if (target.platformType != KotlinPlatformType.androidJvm) {
attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, target.project.categoryByName(Category.LIBRARY))
@@ -187,8 +174,7 @@ private fun KotlinCompilationDependencyConfigurationsContainer(
} else null } else null
val hostSpecificMetadataConfiguration = val hostSpecificMetadataConfiguration =
if (withHostSpecificMetadata) target.project.configurations.maybeCreate(hostSpecificMetadataConfigurationName).apply { if (withHostSpecificMetadata) target.project.configurations.maybeCreateResolvable(hostSpecificMetadataConfigurationName).apply {
markResolvable()
isVisible = false isVisible = false
description = "Host-specific Metadata dependencies for $compilationCoordinates" description = "Host-specific Metadata dependencies for $compilationCoordinates"
extendsFrom(compileDependencyConfiguration) extendsFrom(compileDependencyConfiguration)
@@ -198,7 +184,7 @@ private fun KotlinCompilationDependencyConfigurationsContainer(
} }
} else null } else null
val pluginConfiguration = target.project.configurations.maybeCreate(pluginConfigurationName).apply { val pluginConfiguration = target.project.configurations.maybeCreateResolvable(pluginConfigurationName).apply {
addGradlePluginMetadataAttributes(target.project) addGradlePluginMetadataAttributes(target.project)
if (target.platformType == KotlinPlatformType.native) { if (target.platformType == KotlinPlatformType.native) {
@@ -208,7 +194,6 @@ private fun KotlinCompilationDependencyConfigurationsContainer(
extendsFrom(target.project.commonKotlinPluginClasspath) extendsFrom(target.project.commonKotlinPluginClasspath)
} }
isVisible = false isVisible = false
isCanBeConsumed = false
description = "Kotlin compiler plugins for $compilation" description = "Kotlin compiler plugins for $compilation"
} }
@@ -23,8 +23,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.mpp.configureSourcesPublicationAttributes import org.jetbrains.kotlin.gradle.plugin.mpp.configureSourcesPublicationAttributes
import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.markConsumable
import org.jetbrains.kotlin.gradle.utils.named import org.jetbrains.kotlin.gradle.utils.named
import org.jetbrains.kotlin.gradle.utils.newInstance import org.jetbrains.kotlin.gradle.utils.newInstance
@@ -39,18 +39,21 @@ import org.jetbrains.kotlin.gradle.utils.newInstance
fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExternalKotlinTarget( fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExternalKotlinTarget(
descriptor: ExternalKotlinTargetDescriptor<T>, descriptor: ExternalKotlinTargetDescriptor<T>,
): T { ): T {
val apiElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "apiElements")) val apiElementsConfiguration = project.configurations
val runtimeElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "runtimeElements")) .maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "apiElements"))
val sourcesElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "sourcesElements")) val runtimeElementsConfiguration = project.configurations
.maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "runtimeElements"))
val sourcesElementsConfiguration = project.configurations
.maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "sourcesElements"))
val apiElementsPublishedConfiguration = val apiElementsPublishedConfiguration = project.configurations
project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "apiElements-published")) .maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "apiElements-published"))
val runtimeElementsPublishedConfiguration = val runtimeElementsPublishedConfiguration = project.configurations
project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "runtimeElements-published")) .maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "runtimeElements-published"))
val sourcesElementsPublishedConfiguration = val sourcesElementsPublishedConfiguration = project.configurations
project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "sourcesElements-published")) .maybeCreateConsumable(lowerCamelCaseName(descriptor.targetName, "sourcesElements-published"))
val kotlinTargetComponent = ExternalKotlinTargetComponent( val kotlinTargetComponent = ExternalKotlinTargetComponent(
ExternalKotlinTargetComponent.TargetProvider.byTargetName(this, descriptor.targetName) ExternalKotlinTargetComponent.TargetProvider.byTargetName(this, descriptor.targetName)
@@ -91,17 +94,6 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
target.setupRuntimeElements(runtimeElementsPublishedConfiguration) target.setupRuntimeElements(runtimeElementsPublishedConfiguration)
target.setupSourcesElements(sourcesElementsConfiguration) target.setupSourcesElements(sourcesElementsConfiguration)
target.setupSourcesElements(sourcesElementsPublishedConfiguration) target.setupSourcesElements(sourcesElementsPublishedConfiguration)
apiElementsConfiguration.markConsumable()
runtimeElementsConfiguration.markConsumable()
sourcesElementsConfiguration.markConsumable()
/* Those configurations can not be resolved but also not consumed (not suitable for project to project dependencies) */
apiElementsPublishedConfiguration.isCanBeConsumed = false
apiElementsPublishedConfiguration.isCanBeResolved = false
runtimeElementsPublishedConfiguration.isCanBeResolved = false
runtimeElementsPublishedConfiguration.isCanBeConsumed = false
sourcesElementsPublishedConfiguration.isCanBeConsumed = false
sourcesElementsPublishedConfiguration.isCanBeResolved = false
val decorated = descriptor.targetFactory.create(DecoratedExternalKotlinTarget.Delegate(target)) val decorated = descriptor.targetFactory.create(DecoratedExternalKotlinTarget.Delegate(target))
target.onCreated() target.onCreated()
@@ -19,10 +19,8 @@ import org.jetbrains.kotlin.gradle.plugin.sources.disambiguateName
import org.jetbrains.kotlin.gradle.plugin.usageByName import org.jetbrains.kotlin.gradle.plugin.usageByName
import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf
import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.getOrCreate
import org.jetbrains.kotlin.gradle.utils.listProperty import org.jetbrains.kotlin.gradle.utils.listProperty
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.markResolvable
/** /**
* @see resolvableMetadataConfiguration * @see resolvableMetadataConfiguration
@@ -37,8 +35,7 @@ internal val InternalKotlinSourceSet.resolvableMetadataConfigurationName: String
*/ */
internal val InternalKotlinSourceSet.resolvableMetadataConfiguration: Configuration by extrasStoredProperty { internal val InternalKotlinSourceSet.resolvableMetadataConfiguration: Configuration by extrasStoredProperty {
assert(resolvableMetadataConfigurationName !in project.configurations.names) assert(resolvableMetadataConfigurationName !in project.configurations.names)
val configuration = project.configurations.maybeCreate(resolvableMetadataConfigurationName) val configuration = project.configurations.maybeCreateResolvable(resolvableMetadataConfigurationName)
configuration.markResolvable()
withDependsOnClosure.forAll { sourceSet -> withDependsOnClosure.forAll { sourceSet ->
configuration.extendsFrom(project.configurations.getByName(sourceSet.apiConfigurationName)) configuration.extendsFrom(project.configurations.getByName(sourceSet.apiConfigurationName))
@@ -96,18 +93,18 @@ private fun InternalKotlinSourceSet.configureMetadataDependenciesConfigurations(
* the [InternalKotlinSourceSet.resolvableMetadataConfiguration] * the [InternalKotlinSourceSet.resolvableMetadataConfiguration]
*/ */
private val Project.allCompileMetadataConfiguration private val Project.allCompileMetadataConfiguration
get(): Configuration = configurations.getOrCreate("allSourceSetsCompileDependenciesMetadata", invokeWhenCreated = { configuration -> get(): Configuration = configurations.findResolvable("allSourceSetsCompileDependenciesMetadata")
configuration.markResolvable() ?: configurations.createResolvable("allSourceSetsCompileDependenciesMetadata").also { configuration ->
configuration.usesPlatformOf(multiplatformExtension.metadata()) configuration.usesPlatformOf(multiplatformExtension.metadata())
configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_METADATA)) configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_METADATA))
configuration.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) configuration.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
kotlinExtension.sourceSets.all { sourceSet -> kotlinExtension.sourceSets.all { sourceSet ->
configuration.extendsFrom(configurations.getByName(sourceSet.apiConfigurationName)) configuration.extendsFrom(configurations.getByName(sourceSet.apiConfigurationName))
configuration.extendsFrom(configurations.getByName(sourceSet.implementationConfigurationName)) configuration.extendsFrom(configurations.getByName(sourceSet.implementationConfigurationName))
configuration.extendsFrom(configurations.getByName(sourceSet.compileOnlyConfigurationName)) configuration.extendsFrom(configurations.getByName(sourceSet.compileOnlyConfigurationName))
}
} }
})
private inline fun <reified T> Project.listProvider(noinline provider: () -> List<T>): Provider<List<T>> { private inline fun <reified T> Project.listProvider(noinline provider: () -> List<T>): Provider<List<T>> {
return project.objects.listProperty<T>().apply { return project.objects.listProperty<T>().apply {
@@ -12,7 +12,8 @@ import org.gradle.api.attributes.Usage
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
import org.jetbrains.kotlin.gradle.utils.getOrCreate import org.jetbrains.kotlin.gradle.utils.maybeCreateDependencyScope
import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable
import java.io.File import java.io.File
internal abstract class KotlinSourceSetFactory<T : KotlinSourceSet> internal constructor( internal abstract class KotlinSourceSetFactory<T : KotlinSourceSet> internal constructor(
@@ -42,11 +43,10 @@ internal abstract class KotlinSourceSetFactory<T : KotlinSourceSet> internal con
) )
} }
configurationNames.forEach { configurationName -> configurationNames.forEach { configurationName ->
maybeCreate(configurationName).apply { if (!configurationName.endsWith(METADATA_CONFIGURATION_NAME_SUFFIX)) {
if (!configurationName.endsWith(METADATA_CONFIGURATION_NAME_SUFFIX)) { maybeCreateDependencyScope(configurationName)
isCanBeResolved = false } else {
} maybeCreateResolvable(configurationName)
isCanBeConsumed = false
} }
} }
} }
@@ -87,15 +87,14 @@ internal class DefaultKotlinSourceSetFactory(
} }
dependencyConfigurationWithMetadata.forEach { (configurationName, metadataName) -> dependencyConfigurationWithMetadata.forEach { (configurationName, metadataName) ->
project.configurations.getOrCreate(metadataName).apply { project.configurations.maybeCreateResolvable(metadataName).apply {
attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.common) attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.common)
attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_API)) attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_API))
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
isVisible = false isVisible = false
isCanBeConsumed = false
if (configurationName != null) { if (configurationName != null) {
extendsFrom(project.configurations.maybeCreate(configurationName)) extendsFrom(project.configurations.maybeCreateDependencyScope(configurationName))
} }
if (project.isKotlinGranularMetadataEnabled) { if (project.isKotlinGranularMetadataEnabled) {
@@ -31,6 +31,8 @@ import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor
import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation
import org.jetbrains.kotlin.gradle.scripting.ScriptingExtension import org.jetbrains.kotlin.gradle.scripting.ScriptingExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.utils.maybeCreateDependencyScope
import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
private const val SCRIPTING_LOG_PREFIX = "kotlin scripting plugin:" private const val SCRIPTING_LOG_PREFIX = "kotlin scripting plugin:"
@@ -41,9 +43,8 @@ class ScriptingGradleSubplugin : Plugin<Project> {
const val MISCONFIGURATION_MESSAGE_SUFFIX = "the plugin is probably applied by a mistake" const val MISCONFIGURATION_MESSAGE_SUFFIX = "the plugin is probably applied by a mistake"
fun configureForSourceSet(project: Project, sourceSetName: String) { fun configureForSourceSet(project: Project, sourceSetName: String) {
val discoveryConfiguration = project.configurations.maybeCreate(getDiscoveryClasspathConfigurationName(sourceSetName)).apply { val discoveryConfiguration = project.configurations.maybeCreateDependencyScope(getDiscoveryClasspathConfigurationName(sourceSetName)).apply {
isVisible = false isVisible = false
isCanBeConsumed = false
description = "Script filename extensions discovery classpath configuration" description = "Script filename extensions discovery classpath configuration"
} }
project.logger.info("$SCRIPTING_LOG_PREFIX created the scripting discovery configuration: ${discoveryConfiguration.name}") project.logger.info("$SCRIPTING_LOG_PREFIX created the scripting discovery configuration: ${discoveryConfiguration.name}")
@@ -111,9 +112,7 @@ private fun configureDiscoveryTransformation(
discoveryConfiguration: Configuration, discoveryConfiguration: Configuration,
discoveryResultsConfigurationName: String discoveryResultsConfigurationName: String
) { ) {
project.configurations.maybeCreate(discoveryResultsConfigurationName).apply { project.configurations.maybeCreateResolvable(discoveryResultsConfigurationName).apply {
isCanBeConsumed = false
isCanBeResolved = true
attributes.attribute(artifactType, scriptFilesExtensions) attributes.attribute(artifactType, scriptFilesExtensions)
extendsFrom(discoveryConfiguration) extendsFrom(discoveryConfiguration)
} }
@@ -15,6 +15,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.configureSourcesPublicationAttribu
import org.jetbrains.kotlin.gradle.plugin.mpp.internal import org.jetbrains.kotlin.gradle.plugin.mpp.internal
import org.jetbrains.kotlin.gradle.plugin.mpp.isSourcesPublishableFuture import org.jetbrains.kotlin.gradle.plugin.mpp.isSourcesPublishableFuture
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.utils.maybeCreateConsumable
import org.jetbrains.kotlin.gradle.utils.maybeCreateDependencyScope
internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { target -> internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { target ->
val project = target.project val project = target.project
@@ -24,21 +26,19 @@ internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { tar
val mainCompilation = target.compilations.maybeCreate(KotlinCompilation.MAIN_COMPILATION_NAME) val mainCompilation = target.compilations.maybeCreate(KotlinCompilation.MAIN_COMPILATION_NAME)
val compileConfiguration = mainCompilation.internal.configurations.deprecatedCompileConfiguration val compileConfiguration = mainCompilation.internal.configurations.deprecatedCompileConfiguration
val implementationConfiguration = configurations.maybeCreate(mainCompilation.implementationConfigurationName) val implementationConfiguration = configurations.maybeCreateDependencyScope(mainCompilation.implementationConfigurationName)
val runtimeOnlyConfiguration = when (mainCompilation) { val runtimeOnlyConfiguration = when (mainCompilation) {
is KotlinCompilationToRunnableFiles<*> -> configurations.maybeCreate(mainCompilation.runtimeOnlyConfigurationName) is KotlinCompilationToRunnableFiles<*> -> configurations.maybeCreateDependencyScope(mainCompilation.runtimeOnlyConfigurationName)
else -> null else -> null
} }
configurations.maybeCreate(target.apiElementsConfigurationName).apply { configurations.maybeCreateConsumable(target.apiElementsConfigurationName).apply {
description = "API elements for main." description = "API elements for main."
isVisible = false isVisible = false
isCanBeResolved = false
isCanBeConsumed = true
attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target)) attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target))
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
extendsFrom(configurations.maybeCreate(mainCompilation.apiConfigurationName)) extendsFrom(configurations.maybeCreateDependencyScope(mainCompilation.apiConfigurationName))
if (mainCompilation is KotlinCompilationToRunnableFiles) { if (mainCompilation is KotlinCompilationToRunnableFiles) {
val runtimeConfiguration = mainCompilation.internal.configurations.deprecatedRuntimeConfiguration val runtimeConfiguration = mainCompilation.internal.configurations.deprecatedRuntimeConfiguration
runtimeConfiguration?.let { extendsFrom(it) } runtimeConfiguration?.let { extendsFrom(it) }
@@ -47,11 +47,9 @@ internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { tar
} }
if (mainCompilation is KotlinCompilationToRunnableFiles<*>) { if (mainCompilation is KotlinCompilationToRunnableFiles<*>) {
configurations.maybeCreate(target.runtimeElementsConfigurationName).apply { configurations.maybeCreateConsumable(target.runtimeElementsConfigurationName).apply {
description = "Elements of runtime for main." description = "Elements of runtime for main."
isVisible = false isVisible = false
isCanBeConsumed = true
isCanBeResolved = false
attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerRuntimeUsage(target)) attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerRuntimeUsage(target))
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
val runtimeConfiguration = mainCompilation.internal.configurations.deprecatedRuntimeConfiguration val runtimeConfiguration = mainCompilation.internal.configurations.deprecatedRuntimeConfiguration
@@ -63,11 +61,9 @@ internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { tar
} }
} }
configurations.maybeCreate(target.sourcesElementsConfigurationName).apply { configurations.maybeCreateConsumable(target.sourcesElementsConfigurationName).apply {
description = "Source files of main compilation of ${target.name}." description = "Source files of main compilation of ${target.name}."
isVisible = false isVisible = false
isCanBeResolved = false
isCanBeConsumed = true
configureSourcesPublicationAttributes(target) configureSourcesPublicationAttributes(target)
project.launch { isCanBeConsumed = target.internal.isSourcesPublishableFuture.await() } project.launch { isCanBeConsumed = target.internal.isSourcesPublishableFuture.await() }
} }
@@ -75,9 +71,9 @@ internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { tar
if (target !is KotlinMetadataTarget) { if (target !is KotlinMetadataTarget) {
val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME) val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME)
val compileTestsConfiguration = testCompilation.internal.configurations.deprecatedCompileConfiguration val compileTestsConfiguration = testCompilation.internal.configurations.deprecatedCompileConfiguration
val testImplementationConfiguration = configurations.maybeCreate(testCompilation.implementationConfigurationName) val testImplementationConfiguration = configurations.maybeCreateDependencyScope(testCompilation.implementationConfigurationName)
val testRuntimeOnlyConfiguration = when (testCompilation) { val testRuntimeOnlyConfiguration = when (testCompilation) {
is KotlinCompilationToRunnableFiles<*> -> configurations.maybeCreate(testCompilation.runtimeOnlyConfigurationName) is KotlinCompilationToRunnableFiles<*> -> configurations.maybeCreateDependencyScope(testCompilation.runtimeOnlyConfigurationName)
else -> null else -> null
} }
@@ -93,13 +89,11 @@ internal val CreateTargetConfigurationsSideEffect = KotlinTargetSideEffect { tar
} }
if (target is KotlinJsIrTarget && !target.isMpp!!) { if (target is KotlinJsIrTarget && !target.isMpp!!) {
target.project.configurations.maybeCreate( target.project.configurations.maybeCreateConsumable(
target.commonFakeApiElementsConfigurationName target.commonFakeApiElementsConfigurationName
).apply { ).apply {
description = "Common Fake API elements for main." description = "Common Fake API elements for main."
isVisible = false isVisible = false
isCanBeResolved = false
isCanBeConsumed = true
attributes.attribute<Usage>(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target)) attributes.attribute<Usage>(Usage.USAGE_ATTRIBUTE, KotlinUsages.producerApiUsage(target))
attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.common) attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.common)
} }
@@ -221,10 +221,7 @@ abstract class KotlinAndroidTarget @Inject constructor(
val outputTaskOrProvider = getLibraryOutputTask(variant) ?: return emptySet() val outputTaskOrProvider = getLibraryOutputTask(variant) ?: return emptySet()
val artifact = run { val artifact = run {
val archivesConfigurationName = lowerCamelCaseName(targetName, variantName, "archives") val archivesConfigurationName = lowerCamelCaseName(targetName, variantName, "archives")
project.configurations.maybeCreate(archivesConfigurationName).apply { project.configurations.maybeCreateDependencyScope(archivesConfigurationName)
isCanBeConsumed = false
isCanBeResolved = false
}
project.artifacts.add(archivesConfigurationName, outputTaskOrProvider) { artifact -> project.artifacts.add(archivesConfigurationName, outputTaskOrProvider) { artifact ->
artifact.classifier = artifactClassifier artifact.classifier = artifactClassifier
} }
@@ -294,12 +291,11 @@ abstract class KotlinAndroidTarget @Inject constructor(
val existingConfiguration = project.configurations.findByName(sourcesElementsConfigurationName) val existingConfiguration = project.configurations.findByName(sourcesElementsConfigurationName)
if (existingConfiguration != null) return existingConfiguration if (existingConfiguration != null) return existingConfiguration
val apiElementsConfiguration = project.configurations.getByName(apiElementsConfigurationName) val apiElementsConfiguration = project.configurations.findConsumable(apiElementsConfigurationName)
return project.configurations.create(sourcesElementsConfigurationName).apply { ?: error("Configuration $apiElementsConfigurationName was not found")
return project.configurations.createConsumable(sourcesElementsConfigurationName).apply {
description = "Source files of Android ${variantName}." description = "Source files of Android ${variantName}."
isVisible = false isVisible = false
isCanBeResolved = false
isCanBeConsumed = true
copyAttributes(apiElementsConfiguration.attributes, attributes) copyAttributes(apiElementsConfiguration.attributes, attributes)
configureSourcesPublicationAttributes(this@KotlinAndroidTarget) configureSourcesPublicationAttributes(this@KotlinAndroidTarget)
@@ -71,7 +71,7 @@ open class KotlinJsPlugin: Plugin<Project> {
API, API,
RUNTIME_ONLY RUNTIME_ONLY
).forEach { baseConfigurationName -> ).forEach { baseConfigurationName ->
configurations.maybeCreate( configurations.maybeCreateDependencyScope(
lowerCamelCaseName( lowerCamelCaseName(
baseCompilationName, baseCompilationName,
baseConfigurationName baseConfigurationName
@@ -50,7 +50,6 @@ open class NodeJsRootPlugin : Plugin<Project> {
it.description = "Download and install a local node/npm version" it.description = "Download and install a local node/npm version"
it.configuration = project.provider { it.configuration = project.provider {
project.configurations.detachedConfiguration(project.dependencies.create(it.ivyDependency)) project.configurations.detachedConfiguration(project.dependencies.create(it.ivyDependency))
.markResolvable()
.also { conf -> conf.isTransitive = false } .also { conf -> conf.isTransitive = false }
} }
} }
@@ -32,9 +32,8 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.
import org.jetbrains.kotlin.gradle.targets.js.npm.* import org.jetbrains.kotlin.gradle.targets.js.npm.*
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask
import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.CompositeProjectComponentArtifactMetadata import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.`is` import org.jetbrains.kotlin.gradle.utils.createResolvable
import org.jetbrains.kotlin.gradle.utils.topRealPath
import java.io.Serializable import java.io.Serializable
/** /**
@@ -133,15 +132,13 @@ class KotlinCompilationNpmResolver(
} }
private fun createAggregatedConfiguration(): Configuration { private fun createAggregatedConfiguration(): Configuration {
val all = project.configurations.create(compilation.npmAggregatedConfigurationName) val all = project.configurations.createResolvable(compilation.npmAggregatedConfigurationName)
all.usesPlatformOf(target) all.usesPlatformOf(target)
all.attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target)) all.attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target))
all.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) all.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
all.attributes.attribute(publicPackageJsonAttribute, PUBLIC_PACKAGE_JSON_ATTR_VALUE) all.attributes.attribute(publicPackageJsonAttribute, PUBLIC_PACKAGE_JSON_ATTR_VALUE)
all.isVisible = false all.isVisible = false
all.isCanBeConsumed = false
all.isCanBeResolved = true
all.description = "NPM configuration for $compilation." all.description = "NPM configuration for $compilation."
KotlinDependencyScope.values().forEach { scope -> KotlinDependencyScope.values().forEach { scope ->
@@ -163,15 +160,13 @@ class KotlinCompilationNpmResolver(
} }
private fun createPublicPackageJsonConfiguration(): Configuration { private fun createPublicPackageJsonConfiguration(): Configuration {
val all = project.configurations.create(compilation.publicPackageJsonConfigurationName) val all = project.configurations.createConsumable(compilation.publicPackageJsonConfigurationName)
all.usesPlatformOf(target) all.usesPlatformOf(target)
all.attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target)) all.attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(target))
all.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) all.attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
all.attributes.attribute(publicPackageJsonAttribute, PUBLIC_PACKAGE_JSON_ATTR_VALUE) all.attributes.attribute(publicPackageJsonAttribute, PUBLIC_PACKAGE_JSON_ATTR_VALUE)
all.isVisible = false all.isVisible = false
all.isCanBeConsumed = true
all.isCanBeResolved = false
return all return all
} }
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.ST
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.UPGRADE_YARN_LOCK import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockCopyTask.Companion.UPGRADE_YARN_LOCK
import org.jetbrains.kotlin.gradle.tasks.CleanDataTask import org.jetbrains.kotlin.gradle.tasks.CleanDataTask
import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.utils.detachedResolvable
import org.jetbrains.kotlin.gradle.utils.onlyIfCompat import org.jetbrains.kotlin.gradle.utils.onlyIfCompat
open class YarnPlugin : Plugin<Project> { open class YarnPlugin : Plugin<Project> {
@@ -47,8 +47,7 @@ open class YarnPlugin : Plugin<Project> {
it.description = "Download and install a local yarn version" it.description = "Download and install a local yarn version"
it.configuration = provider { it.configuration = provider {
this.project.configurations.detachedConfiguration(this.project.dependencies.create(it.ivyDependency)) this.project.configurations.detachedResolvable(this.project.dependencies.create(it.ivyDependency))
.markResolvable()
.also { conf -> conf.isTransitive = false } .also { conf -> conf.isTransitive = false }
} }
} }
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic
import org.jetbrains.kotlin.gradle.targets.android.internal.InternalKotlinTargetPreset import org.jetbrains.kotlin.gradle.targets.android.internal.InternalKotlinTargetPreset
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
import org.jetbrains.kotlin.gradle.utils.configureExperimentalTryNext import org.jetbrains.kotlin.gradle.utils.configureExperimentalTryNext
import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable
@DeprecatedTargetPresetApi @DeprecatedTargetPresetApi
class KotlinJvmWithJavaTargetPreset( class KotlinJvmWithJavaTargetPreset(
@@ -71,12 +72,12 @@ class KotlinJvmWithJavaTargetPreset(
compileDependencyFiles = project.files( compileDependencyFiles = project.files(
main.output.allOutputs, main.output.allOutputs,
project.configurations.maybeCreate(compileDependencyConfigurationName) project.configurations.maybeCreateResolvable(compileDependencyConfigurationName)
) )
runtimeDependencyFiles = project.files( runtimeDependencyFiles = project.files(
output.allOutputs, output.allOutputs,
main.output.allOutputs, main.output.allOutputs,
project.configurations.maybeCreate(runtimeDependencyConfigurationName) project.configurations.maybeCreateResolvable(runtimeDependencyConfigurationName)
) )
} }
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf
import org.jetbrains.kotlin.gradle.targets.KotlinTargetSideEffect import org.jetbrains.kotlin.gradle.targets.KotlinTargetSideEffect
import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable
internal val ConfigureFrameworkExportSideEffect = KotlinTargetSideEffect<KotlinNativeTarget> { target -> internal val ConfigureFrameworkExportSideEffect = KotlinTargetSideEffect<KotlinNativeTarget> { target ->
val project = target.project val project = target.project
@@ -30,11 +31,9 @@ internal val ConfigureFrameworkExportSideEffect = KotlinTargetSideEffect<KotlinN
} }
target.binaries.withType(AbstractNativeLibrary::class.java).all { framework -> target.binaries.withType(AbstractNativeLibrary::class.java).all { framework ->
project.configurations.maybeCreate(framework.exportConfigurationName).apply { project.configurations.maybeCreateResolvable(framework.exportConfigurationName).apply {
isVisible = false isVisible = false
isTransitive = false isTransitive = false
isCanBeConsumed = false
isCanBeResolved = true
usesPlatformOf(target) usesPlatformOf(target)
attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerApiUsage(target)) attributes.attribute(Usage.USAGE_ATTRIBUTE, KotlinUsages.consumerApiUsage(target))
attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY))
@@ -20,6 +20,7 @@ import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toUpperCaseAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.toUpperCaseAsciiOnly
import java.io.File import java.io.File
@@ -213,9 +214,9 @@ abstract class AbstractNativeLibrary(
*/ */
@ExperimentalKotlinGradlePluginApi @ExperimentalKotlinGradlePluginApi
var transitiveExport: Boolean var transitiveExport: Boolean
get() = project.configurations.maybeCreate(exportConfigurationName).isTransitive get() = project.configurations.maybeCreateResolvable(exportConfigurationName).isTransitive
set(value) { set(value) {
project.configurations.maybeCreate(exportConfigurationName).isTransitive = value project.configurations.maybeCreateResolvable(exportConfigurationName).isTransitive = value
} }
/** /**
@@ -148,8 +148,7 @@ class NativeCompilerDownloader(
) )
} }
val configuration = project.configurations.detachedConfiguration(compilerDependency) val configuration = project.configurations.detachedResolvable(compilerDependency)
.markResolvable()
logger.lifecycle("\nPlease wait while Kotlin/Native compiler $compilerVersion is being installed.") logger.lifecycle("\nPlease wait while Kotlin/Native compiler $compilerVersion is being installed.")
if (!kotlinProperties.nativeDownloadFromMaven) { if (!kotlinProperties.nativeDownloadFromMaven) {
@@ -20,10 +20,9 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.copyAttributes import org.jetbrains.kotlin.gradle.utils.copyAttributes
import org.jetbrains.kotlin.gradle.utils.getOrCreate
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.markConsumable
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import java.io.File import java.io.File
@@ -47,13 +46,13 @@ private val Framework.frameworkGroupDescription
) )
internal fun Project.createFrameworkArtifact(binaryFramework: Framework, linkTask: TaskProvider<KotlinNativeLink>) { internal fun Project.createFrameworkArtifact(binaryFramework: Framework, linkTask: TaskProvider<KotlinNativeLink>) {
val frameworkConfiguration = configurations.getOrCreate(binaryFramework.binaryFrameworkConfigurationName, invokeWhenCreated = { val frameworkConfiguration = configurations.findConsumable(binaryFramework.binaryFrameworkConfigurationName)
it.markConsumable() ?: configurations.createConsumable(binaryFramework.binaryFrameworkConfigurationName).also {
it.applyBinaryFrameworkGroupAttributes(project, binaryFramework.frameworkGroupDescription, listOf(binaryFramework.target)) it.applyBinaryFrameworkGroupAttributes(project, binaryFramework.frameworkGroupDescription, listOf(binaryFramework.target))
project.launchInStage(KotlinPluginLifecycle.Stage.FinaliseDsl) { project.launchInStage(KotlinPluginLifecycle.Stage.FinaliseDsl) {
copyAttributes(binaryFramework.attributes, it.attributes) copyAttributes(binaryFramework.attributes, it.attributes)
}
} }
})
// Can't use flatMap here because of https://github.com/gradle/gradle/issues/25645 // Can't use flatMap here because of https://github.com/gradle/gradle/issues/25645
val linkTaskOutputProvider = linkTask.map { it.outputFile.get() } val linkTaskOutputProvider = linkTask.map { it.outputFile.get() }
@@ -125,10 +124,9 @@ private fun Project.createFatFramework(groupDescription: FrameworkGroupDescripti
} }
} }
val fatFrameworkConfiguration = project.configurations.getOrCreate(fatFrameworkConfigurationName, invokeWhenCreated = { val fatFrameworkConfiguration = project.configurations.maybeCreateConsumable(fatFrameworkConfigurationName).also {
it.markConsumable()
it.applyBinaryFrameworkGroupAttributes(project, groupDescription, targets = frameworks.map(Framework::target)) it.applyBinaryFrameworkGroupAttributes(project, groupDescription, targets = frameworks.map(Framework::target))
}) }
addFrameworkArtifact(fatFrameworkConfiguration, fatFrameworkTask.map { it.fatFramework }) addFrameworkArtifact(fatFrameworkConfiguration, fatFrameworkTask.map { it.fatFramework })
} }
@@ -21,8 +21,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration
import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.targets.metadata.awaitMetadataCompilationsCreated import org.jetbrains.kotlin.gradle.targets.metadata.awaitMetadataCompilationsCreated
import org.jetbrains.kotlin.gradle.targets.metadata.findMetadataCompilation import org.jetbrains.kotlin.gradle.targets.metadata.findMetadataCompilation
import org.jetbrains.kotlin.gradle.utils.markConsumable import org.jetbrains.kotlin.gradle.utils.createConsumable
import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.utils.createResolvable
import org.jetbrains.kotlin.tooling.core.UnsafeApi import org.jetbrains.kotlin.tooling.core.UnsafeApi
/* Elements configuration */ /* Elements configuration */
@@ -64,8 +64,7 @@ internal fun Project.locateOrCreateCommonizedCInteropApiElementsConfiguration(co
val configurationName = commonizerTarget.identityString + "CInteropApiElements" val configurationName = commonizerTarget.identityString + "CInteropApiElements"
configurations.findByName(configurationName)?.let { return it } configurations.findByName(configurationName)?.let { return it }
return configurations.create(configurationName) { configuration -> return configurations.createConsumable(configurationName).also { configuration ->
configuration.markConsumable()
setupBasicCommonizedCInteropConfigurationAttributes(configuration, commonizerTarget) setupBasicCommonizedCInteropConfigurationAttributes(configuration, commonizerTarget)
launch { launch {
@@ -102,9 +101,8 @@ internal suspend fun Project.locateOrCreateCommonizedCInteropDependencyConfigura
val configurationName = sourceSet.name + "CInterop" val configurationName = sourceSet.name + "CInterop"
configurations.findByName(configurationName)?.let { return it } configurations.findByName(configurationName)?.let { return it }
val configuration = configurations.create(configurationName) { configuration -> val configuration = configurations.createResolvable(configurationName).also { configuration ->
configuration.isVisible = false configuration.isVisible = false
configuration.markResolvable()
// Extends from Metadata Configuration associated with given source set to ensure matching // Extends from Metadata Configuration associated with given source set to ensure matching
configuration.extendsFrom(sourceSet.internal.resolvableMetadataConfiguration) configuration.extendsFrom(sourceSet.internal.resolvableMetadataConfiguration)
@@ -21,8 +21,10 @@ import org.jetbrains.kotlin.gradle.plugin.usesPlatformOf
import org.jetbrains.kotlin.gradle.targets.KotlinTargetSideEffect import org.jetbrains.kotlin.gradle.targets.KotlinTargetSideEffect
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropKlibLibraryElements.cinteropKlibLibraryElements import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropKlibLibraryElements.cinteropKlibLibraryElements
import org.jetbrains.kotlin.gradle.tasks.CInteropProcess import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.copyAttributes import org.jetbrains.kotlin.gradle.utils.copyAttributes
import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.utils.createConsumable
import org.jetbrains.kotlin.gradle.utils.findConsumable
internal fun createCInteropApiElementsKlibArtifact( internal fun createCInteropApiElementsKlibArtifact(
target: KotlinNativeTarget, target: KotlinNativeTarget,
@@ -43,15 +45,14 @@ internal fun createCInteropApiElementsKlibArtifact(
internal fun Project.locateOrCreateCInteropDependencyConfiguration( internal fun Project.locateOrCreateCInteropDependencyConfiguration(
compilation: KotlinNativeCompilation, compilation: KotlinNativeCompilation,
): Configuration { ): Configuration {
configurations.findByName(compilation.cInteropDependencyConfigurationName)?.let { return it } configurations.findResolvable(compilation.cInteropDependencyConfigurationName)?.let { return it }
val compileOnlyConfiguration = configurations.getByName(compilation.compileOnlyConfigurationName) val compileOnlyConfiguration = configurations.getByName(compilation.compileOnlyConfigurationName)
val implementationConfiguration = configurations.getByName(compilation.implementationConfigurationName) val implementationConfiguration = configurations.getByName(compilation.implementationConfigurationName)
return configurations.create(compilation.cInteropDependencyConfigurationName).apply { return configurations.createResolvable(compilation.cInteropDependencyConfigurationName).apply {
extendsFrom(compileOnlyConfiguration, implementationConfiguration) extendsFrom(compileOnlyConfiguration, implementationConfiguration)
isVisible = false isVisible = false
markResolvable()
/* Deferring attributes to wait for compilation.attributes to be configured by user*/ /* Deferring attributes to wait for compilation.attributes to be configured by user*/
launchInStage(AfterFinaliseDsl) { launchInStage(AfterFinaliseDsl) {
@@ -74,12 +75,9 @@ internal val SetupCInteropApiElementsConfigurationSideEffect = KotlinTargetSideE
internal fun Project.locateOrCreateCInteropApiElementsConfiguration(target: KotlinTarget): Configuration { internal fun Project.locateOrCreateCInteropApiElementsConfiguration(target: KotlinTarget): Configuration {
val configurationName = cInteropApiElementsConfigurationName(target) val configurationName = cInteropApiElementsConfigurationName(target)
configurations.findByName(configurationName)?.let { return it } configurations.findConsumable(configurationName)?.let { return it }
return configurations.create(configurationName).apply {
isCanBeResolved = false
isCanBeConsumed = true
return configurations.createConsumable(configurationName).apply {
/* Deferring attributes to wait for target.attributes to be configured by user */ /* Deferring attributes to wait for target.attributes to be configured by user */
launchInStage(AfterFinaliseDsl) { launchInStage(AfterFinaliseDsl) {
usesPlatformOf(target) usesPlatformOf(target)
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.maybeCreateResolvable
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.konan.target.presetName import org.jetbrains.kotlin.konan.target.presetName
@@ -72,10 +73,8 @@ abstract class KotlinNativeArtifactConfigImpl(artifactName: String) : KotlinArti
internal fun Project.registerLibsDependencies(target: KonanTarget, artifactName: String, deps: Set<Any>): String { internal fun Project.registerLibsDependencies(target: KonanTarget, artifactName: String, deps: Set<Any>): String {
val librariesConfigurationName = lowerCamelCaseName(target.presetName, artifactName, "linkLibrary") val librariesConfigurationName = lowerCamelCaseName(target.presetName, artifactName, "linkLibrary")
configurations.maybeCreate(librariesConfigurationName).apply { configurations.maybeCreateResolvable(librariesConfigurationName).apply {
isVisible = false isVisible = false
isCanBeConsumed = false
isCanBeResolved = true
isTransitive = true isTransitive = true
attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.native) attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.native)
attributes.attribute(KotlinNativeTarget.konanTargetAttribute, target.name) attributes.attribute(KotlinNativeTarget.konanTargetAttribute, target.name)
@@ -87,10 +86,8 @@ internal fun Project.registerLibsDependencies(target: KonanTarget, artifactName:
internal fun Project.registerExportDependencies(target: KonanTarget, artifactName: String, deps: Set<Any>): String { internal fun Project.registerExportDependencies(target: KonanTarget, artifactName: String, deps: Set<Any>): String {
val exportConfigurationName = lowerCamelCaseName(target.presetName, artifactName, "linkExport") val exportConfigurationName = lowerCamelCaseName(target.presetName, artifactName, "linkExport")
configurations.maybeCreate(exportConfigurationName).apply { configurations.maybeCreateResolvable(exportConfigurationName).apply {
isVisible = false isVisible = false
isCanBeConsumed = false
isCanBeResolved = true
isTransitive = false isTransitive = false
attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.native) attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.native)
attributes.attribute(KotlinNativeTarget.konanTargetAttribute, target.name) attributes.attribute(KotlinNativeTarget.konanTargetAttribute, target.name)
@@ -25,8 +25,10 @@ import org.jetbrains.kotlin.gradle.internal.kapt.incremental.StructureTransformA
import org.jetbrains.kotlin.gradle.internal.kapt.incremental.StructureTransformLegacyAction import org.jetbrains.kotlin.gradle.internal.kapt.incremental.StructureTransformLegacyAction
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.tasks.toCompilerPluginOptions import org.jetbrains.kotlin.gradle.tasks.toCompilerPluginOptions
import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.createDependencyScope
import org.jetbrains.kotlin.gradle.utils.detachedResolvable
import org.jetbrains.kotlin.gradle.utils.listProperty import org.jetbrains.kotlin.gradle.utils.listProperty
import org.jetbrains.kotlin.gradle.utils.markResolvable
import java.io.File import java.io.File
internal open class KaptConfig<TASK : KaptTask>( internal open class KaptConfig<TASK : KaptTask>(
@@ -91,7 +93,7 @@ internal open class KaptConfig<TASK : KaptTask>(
return if (project.isIncrementalKapt()) { return if (project.isIncrementalKapt()) {
maybeRegisterTransform(project) maybeRegisterTransform(project)
val classStructureConfiguration = project.configurations.detachedConfiguration().markResolvable() val classStructureConfiguration = project.configurations.detachedResolvable()
// Wrap the `kotlinCompile.classpath` into a file collection, so that, if the classpath is represented by a configuration, // Wrap the `kotlinCompile.classpath` into a file collection, so that, if the classpath is represented by a configuration,
// the configuration is not extended (via extendsFrom, which normally happens when one configuration is _added_ into another) // the configuration is not extended (via extendsFrom, which normally happens when one configuration is _added_ into another)
@@ -196,8 +198,8 @@ internal class KaptWithoutKotlincConfig : KaptConfig<KaptWithoutKotlincTask> {
kaptGenerateStubsTask: TaskProvider<KaptGenerateStubsTask>, kaptGenerateStubsTask: TaskProvider<KaptGenerateStubsTask>,
ext: KaptExtension ext: KaptExtension
) : super(project, kaptGenerateStubsTask, ext) { ) : super(project, kaptGenerateStubsTask, ext) {
project.configurations.findByName(Kapt3GradleSubplugin.KAPT_WORKER_DEPENDENCIES_CONFIGURATION_NAME) project.configurations.findResolvable(Kapt3GradleSubplugin.KAPT_WORKER_DEPENDENCIES_CONFIGURATION_NAME)
?: project.configurations.create(Kapt3GradleSubplugin.KAPT_WORKER_DEPENDENCIES_CONFIGURATION_NAME).apply { ?: project.configurations.createResolvable(Kapt3GradleSubplugin.KAPT_WORKER_DEPENDENCIES_CONFIGURATION_NAME).apply {
dependencies.addAllLater(project.listProperty { dependencies.addAllLater(project.listProperty {
val kaptDependency = "org.jetbrains.kotlin:kotlin-annotation-processing-gradle:${project.getKotlinPluginVersion()}" val kaptDependency = "org.jetbrains.kotlin:kotlin-annotation-processing-gradle:${project.getKotlinPluginVersion()}"
listOf( listOf(
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaCompilation
import org.jetbrains.kotlin.gradle.plugin.tcs import org.jetbrains.kotlin.gradle.plugin.tcs
import org.jetbrains.kotlin.gradle.tasks.DefaultKotlinJavaToolchain import org.jetbrains.kotlin.gradle.tasks.DefaultKotlinJavaToolchain
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.utils.detachedResolvable
import org.jetbrains.kotlin.gradle.utils.providerWithLazyConvention import org.jetbrains.kotlin.gradle.utils.providerWithLazyConvention
internal typealias KotlinCompileConfig = BaseKotlinCompileConfig<KotlinCompile> internal typealias KotlinCompileConfig = BaseKotlinCompileConfig<KotlinCompile>
@@ -48,9 +48,9 @@ internal open class BaseKotlinCompileConfig<TASK : KotlinCompile> : AbstractKotl
registerTransformsOnce(project, jvmToolchain, runKotlinCompilerViaBuildToolsApi) registerTransformsOnce(project, jvmToolchain, runKotlinCompilerViaBuildToolsApi)
// Note: Creating configurations should be done during build configuration, not task configuration, to avoid issues with // Note: Creating configurations should be done during build configuration, not task configuration, to avoid issues with
// composite builds (e.g., https://issuetracker.google.com/183952598). // composite builds (e.g., https://issuetracker.google.com/183952598).
project.configurations.detachedConfiguration( project.configurations.detachedResolvable(
project.dependencies.create(objectFactory.fileCollection().from(project.provider { taskProvider.get().libraries })) project.dependencies.create(objectFactory.fileCollection().from(project.provider { taskProvider.get().libraries }))
).markResolvable() )
} else null } else null
if (useClasspathSnapshot) { if (useClasspathSnapshot) {
@@ -6,6 +6,8 @@
package org.jetbrains.kotlin.gradle.utils package org.jetbrains.kotlin.gradle.utils
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ConfigurationContainer
import org.gradle.api.artifacts.Dependency
const val COMPILE_ONLY = "compileOnly" const val COMPILE_ONLY = "compileOnly"
const val COMPILE = "compile" const val COMPILE = "compile"
@@ -15,12 +17,55 @@ const val RUNTIME_ONLY = "runtimeOnly"
const val RUNTIME = "runtime" const val RUNTIME = "runtime"
internal const val INTRANSITIVE = "intransitive" internal const val INTRANSITIVE = "intransitive"
internal fun Configuration.markConsumable(): Configuration = apply { internal fun ConfigurationContainer.createResolvable(name: String): Configuration = create(name).apply {
this.isCanBeConsumed = true isCanBeConsumed = false
this.isCanBeResolved = false
} }
internal fun Configuration.markResolvable(): Configuration = apply { internal fun ConfigurationContainer.findResolvable(name: String): Configuration? = findByName(name)?.apply {
this.isCanBeConsumed = false if (isCanBeResolved && isCanBeConsumed) {
this.isCanBeResolved = true isCanBeConsumed = false
} else {
check(isCanBeResolved && !isCanBeConsumed) { "$this is not resolvable" }
}
} }
internal fun ConfigurationContainer.maybeCreateResolvable(name: String): Configuration =
findResolvable(name) ?: createResolvable(name)
internal fun ConfigurationContainer.detachedResolvable(vararg dependencies: Dependency) =
detachedConfiguration(*dependencies).apply {
isCanBeConsumed = false
}
internal fun ConfigurationContainer.createConsumable(name: String): Configuration = create(name).apply {
isCanBeResolved = false
}
internal fun ConfigurationContainer.findConsumable(name: String): Configuration? = findByName(name)?.apply {
if (isCanBeResolved && isCanBeConsumed) {
isCanBeResolved = false
} else {
check(!isCanBeResolved && isCanBeConsumed) { "$this is not consumable" }
}
}
internal fun ConfigurationContainer.maybeCreateConsumable(name: String): Configuration =
findConsumable(name) ?: createConsumable(name)
internal fun ConfigurationContainer.createDependencyScope(name: String) = create(name).apply {
isCanBeResolved = false
isCanBeConsumed = false
}
internal fun ConfigurationContainer.findDependencyScope(name: String): Configuration? = findByName(name)?.apply {
if (isCanBeResolved && isCanBeConsumed) {
isCanBeConsumed = false
isCanBeResolved = false
} else {
check(!isCanBeResolved) { "$this is not dependency scope configuration but resolvable one" }
check(!isCanBeConsumed) { "$this is not dependency scope configuration but consumable one" }
}
}
internal fun ConfigurationContainer.maybeCreateDependencyScope(name: String): Configuration =
findDependencyScope(name) ?: createDependencyScope(name)
@@ -11,8 +11,8 @@ import org.gradle.api.attributes.Usage
import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.dependencies
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerArtifactTypeAttribute import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerArtifactTypeAttribute
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
import org.jetbrains.kotlin.gradle.utils.markConsumable import org.jetbrains.kotlin.gradle.utils.createConsumable
import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.utils.createResolvable
import org.jetbrains.kotlin.gradle.utils.named import org.jetbrains.kotlin.gradle.utils.named
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
@@ -33,8 +33,7 @@ class CInteropCommonizerArtifactTypeAttributeTest {
) )
/* Create consumable elements configuration */ /* Create consumable elements configuration */
project.configurations.create("testElements") { configuration -> project.configurations.createConsumable("testElements").also { configuration ->
configuration.markConsumable()
configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named("test")) configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named("test"))
/* Add klibCollectionDir as artifact */ /* Add klibCollectionDir as artifact */
@@ -45,8 +44,7 @@ class CInteropCommonizerArtifactTypeAttributeTest {
} }
/* Create resolvable configuration */ /* Create resolvable configuration */
val resolvable = project.configurations.create("testDependencies") { configuration -> val resolvable = project.configurations.createResolvable("testDependencies").also { configuration ->
configuration.markResolvable()
configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named("test")) configuration.attributes.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named("test"))
configuration.attributes.attribute( configuration.attributes.attribute(
CInteropCommonizerArtifactTypeAttribute.attribute, CInteropCommonizerArtifactTypeAttribute.KLIB CInteropCommonizerArtifactTypeAttribute.attribute, CInteropCommonizerArtifactTypeAttribute.KLIB
@@ -21,8 +21,8 @@ import org.jetbrains.kotlin.gradle.plugin.await
import org.jetbrains.kotlin.gradle.targets.native.internal.CommonizerTargetAttribute import org.jetbrains.kotlin.gradle.targets.native.internal.CommonizerTargetAttribute
import org.jetbrains.kotlin.gradle.targets.native.internal.locateOrCreateCommonizedCInteropDependencyConfiguration import org.jetbrains.kotlin.gradle.targets.native.internal.locateOrCreateCommonizedCInteropDependencyConfiguration
import org.jetbrains.kotlin.gradle.util.* import org.jetbrains.kotlin.gradle.util.*
import org.jetbrains.kotlin.gradle.utils.markConsumable import org.jetbrains.kotlin.gradle.utils.createConsumable
import org.jetbrains.kotlin.gradle.utils.markResolvable import org.jetbrains.kotlin.gradle.utils.createResolvable
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.tooling.core.UnsafeApi import org.jetbrains.kotlin.tooling.core.UnsafeApi
import kotlin.test.Test import kotlin.test.Test
@@ -35,8 +35,7 @@ class CInteropCommonizerConfigurationTests {
fun `test - compatibility rule - superset is compatible`() { fun `test - compatibility rule - superset is compatible`() {
val project = buildProjectWithMPP() val project = buildProjectWithMPP()
val consumable = project.configurations.create("testElements") { configuration -> val consumable = project.configurations.createConsumable("testElements").also { configuration ->
configuration.markConsumable()
configuration.attributes.attribute( configuration.attributes.attribute(
CommonizerTargetAttribute.attribute, CommonizerTargetAttribute.attribute,
CommonizerTarget( CommonizerTarget(
@@ -48,8 +47,7 @@ class CInteropCommonizerConfigurationTests {
) )
} }
val resolvable = project.configurations.create("testDependencies") { configuration -> val resolvable = project.configurations.createResolvable("testDependencies").also { configuration ->
configuration.markResolvable()
configuration.attributes.attribute( configuration.attributes.attribute(
CommonizerTargetAttribute.attribute, CommonizerTargetAttribute.attribute,
CommonizerTarget( CommonizerTarget(
@@ -74,8 +72,7 @@ class CInteropCommonizerConfigurationTests {
fun `test - disambiguation rule - chooses most specific variant`() { fun `test - disambiguation rule - chooses most specific variant`() {
val project = buildProjectWithMPP() val project = buildProjectWithMPP()
project.configurations.create("testConsumableAll") { configuration -> project.configurations.createConsumable("testConsumableAll").also { configuration ->
configuration.markConsumable()
configuration.attributes.attribute( configuration.attributes.attribute(
CommonizerTargetAttribute.attribute, CommonizerTargetAttribute.attribute,
CommonizerTarget( CommonizerTarget(
@@ -90,8 +87,7 @@ class CInteropCommonizerConfigurationTests {
} }
/* More specific as it does not offer macos parts */ /* More specific as it does not offer macos parts */
val consumableSpecific = project.configurations.create("testConsumableSpecific") { configuration -> val consumableSpecific = project.configurations.createConsumable("testConsumableSpecific").also { configuration ->
configuration.markConsumable()
configuration.attributes.attribute( configuration.attributes.attribute(
CommonizerTargetAttribute.attribute, CommonizerTargetAttribute.attribute,
CommonizerTarget( CommonizerTarget(
@@ -103,8 +99,7 @@ class CInteropCommonizerConfigurationTests {
) )
} }
val resolvable = project.configurations.create("testDependencies") { configuration -> val resolvable = project.configurations.createResolvable("testDependencies").also { configuration ->
configuration.markResolvable()
configuration.attributes.attribute( configuration.attributes.attribute(
CommonizerTargetAttribute.attribute, CommonizerTargetAttribute.attribute,
CommonizerTarget( CommonizerTarget(