diff --git a/idea/testData/gradle/importAndCheckNavigation/navigationToCommonizedLibrary/gradle.properties b/idea/testData/gradle/importAndCheckNavigation/navigationToCommonizedLibrary/gradle.properties index 04763deac75..1d0d44f1d8e 100644 --- a/idea/testData/gradle/importAndCheckNavigation/navigationToCommonizedLibrary/gradle.properties +++ b/idea/testData/gradle/importAndCheckNavigation/navigationToCommonizedLibrary/gradle.properties @@ -1,3 +1,2 @@ kotlin.mpp.enableGranularSourceSetsMetadata=true kotlin.native.enableDependencyPropagation=false -kotlin.mpp.enableHierarchicalCommonization=false diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt index 36de2569362..f2beaee8259 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinSourceSet.kt @@ -47,4 +47,4 @@ interface KotlinSourceSet : Named, HasKotlinDependencies { fun requiresVisibilityOf(other: KotlinSourceSet) fun addCustomSourceFilesExtensions(extensions: List) {} -} \ No newline at end of file +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index dd8ca70d732..5c7cc849f4e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -233,6 +233,9 @@ internal class PropertiesProvider private constructor(private val project: Proje val enableNativeDistributionCommonizationCache: Boolean get() = booleanProperty("kotlin.mpp.enableNativeDistributionCommonizationCache") ?: true + val enableIntransitiveMetadataConfiguration: Boolean + get() = booleanProperty("kotlin.mpp.enableIntransitiveMetadataConfiguration") ?: false + /** * Dependencies caching strategy for all targets that support caches. */ diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt index 011639127fb..3c4b1a7a9bd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultKotlinSourceSet.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.gradle.plugin.whenEvaluated import org.jetbrains.kotlin.gradle.utils.* import java.io.File import java.util.* -import kotlin.collections.HashSet const val METADATA_CONFIGURATION_NAME_SUFFIX = "DependenciesMetadata" @@ -54,6 +53,12 @@ class DefaultKotlinSourceSet( override val runtimeOnlyMetadataConfigurationName: String get() = lowerCamelCaseName(runtimeOnlyConfigurationName, METADATA_CONFIGURATION_NAME_SUFFIX) + /** + * Dependencies added to this configuration will not be exposed to any other source set. + */ + val intransitiveMetadataConfigurationName: String + get() = lowerCamelCaseName(disambiguateName(INTRANSITIVE), METADATA_CONFIGURATION_NAME_SUFFIX) + override val kotlin: SourceDirectorySet = createDefaultSourceDirectorySet(project, "$name Kotlin source").apply { filter.include("**/*.java") filter.include("**/*.kt") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt index 51279abef8b..88273013b1e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/KotlinSourceSetFactory.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle.plugin.sources import org.gradle.api.NamedDomainObjectFactory import org.gradle.api.Project import org.gradle.api.attributes.Usage -import org.gradle.api.internal.file.FileResolver import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages @@ -74,7 +73,8 @@ internal class DefaultKotlinSourceSetFactory( apiConfigurationName to apiMetadataConfigurationName, implementationConfigurationName to implementationMetadataConfigurationName, compileOnlyConfigurationName to compileOnlyMetadataConfigurationName, - runtimeOnlyConfigurationName to runtimeOnlyMetadataConfigurationName + runtimeOnlyConfigurationName to runtimeOnlyMetadataConfigurationName, + null to intransitiveMetadataConfigurationName ) } @@ -84,7 +84,10 @@ internal class DefaultKotlinSourceSetFactory( attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_API)) isVisible = false isCanBeConsumed = false - extendsFrom(project.configurations.maybeCreate(configurationName)) + + if (configurationName != null) { + extendsFrom(project.configurations.maybeCreate(configurationName)) + } if (project.isKotlinGranularMetadataEnabled) { attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_METADATA)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index a708449d0de..047275d680a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilationsBySourceSets import org.jetbrains.kotlin.gradle.plugin.sources.* import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService +import org.jetbrains.kotlin.gradle.targets.native.internal.* import org.jetbrains.kotlin.gradle.targets.native.internal.commonizeCInteropTask import org.jetbrains.kotlin.gradle.targets.native.internal.copyCommonizeCInteropForIdeTask import org.jetbrains.kotlin.gradle.targets.native.internal.getLibraries @@ -329,8 +330,11 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) : } project.copyCommonizeCInteropForIdeTask?.let { task -> val libraries = task.getLibraries(this) - kotlinSourceSetsIncludingDefault.forEach { sourceSet -> - project.dependencies.add(sourceSet.implementationMetadataConfigurationName, libraries) + kotlinSourceSetsIncludingDefault.filterIsInstance().forEach { sourceSet -> + val dependencyConfigurationName = + if (project.isIntransitiveMetadataConfigurationEnabled) sourceSet.intransitiveMetadataConfigurationName + else sourceSet.implementationMetadataConfigurationName + project.dependencies.add(dependencyConfigurationName, libraries) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt index 4f6b0f937ca..e18e39ce1d4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CommonizerTasks.kt @@ -18,6 +18,9 @@ internal val Project.isCInteropCommonizationEnabled: Boolean get() = PropertiesP internal val Project.isHierarchicalCommonizationEnabled: Boolean get() = PropertiesProvider(this).enableHierarchicalCommonization +internal val Project.isIntransitiveMetadataConfigurationEnabled: Boolean + get() = PropertiesProvider(this).enableIntransitiveMetadataConfiguration + internal val Project.commonizeTask: TaskProvider get() = locateOrRegisterTask( "commonize", diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalKotlinNativePlatformDependencies.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalKotlinNativePlatformDependencies.kt index 0d201915a47..b83054650b4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalKotlinNativePlatformDependencies.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/HierarchicalKotlinNativePlatformDependencies.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.commonizer.* import org.jetbrains.kotlin.compilerRunner.konanHome import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet import org.jetbrains.kotlin.gradle.targets.metadata.getMetadataCompilationForSourceSet import org.jetbrains.kotlin.gradle.utils.filesProvider @@ -53,7 +54,12 @@ private fun Project.addDependencies(sourceSet: KotlinSourceSet, libraries: FileC getMetadataCompilationForSourceSet(sourceSet)?.let { compilation -> compilation.compileDependencyFiles += libraries } - dependencies.add(sourceSet.implementationMetadataConfigurationName, libraries) + if (sourceSet is DefaultKotlinSourceSet) { + val metadataConfigurationName = + if (project.isIntransitiveMetadataConfigurationEnabled) sourceSet.intransitiveMetadataConfigurationName + else sourceSet.implementationMetadataConfigurationName + dependencies.add(metadataConfigurationName, libraries) + } } private val Project.konanDistribution: KonanDistribution diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/configurations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/configurations.kt index 9fd61878247..fee5db0c130 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/configurations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/configurations.kt @@ -10,4 +10,5 @@ const val COMPILE = "compile" const val IMPLEMENTATION = "implementation" const val API = "api" const val RUNTIME_ONLY = "runtimeOnly" -const val RUNTIME = "runtime" \ No newline at end of file +const val RUNTIME = "runtime" +internal const val INTRANSITIVE = "intransitive"