[Gradle] Implement internal intransitiveMetadataConfiguration

- Implemented additional intransitiveMetadataConfiguration to support
dependencies that shall not be added transitively to dependsOn edges
This commit is contained in:
sebastian.sellmair
2021-04-08 11:48:00 +02:00
parent 4e40bd6371
commit 2aeb08e245
9 changed files with 34 additions and 10 deletions
@@ -1,3 +1,2 @@
kotlin.mpp.enableGranularSourceSetsMetadata=true
kotlin.native.enableDependencyPropagation=false
kotlin.mpp.enableHierarchicalCommonization=false
@@ -47,4 +47,4 @@ interface KotlinSourceSet : Named, HasKotlinDependencies {
fun requiresVisibilityOf(other: KotlinSourceSet)
fun addCustomSourceFilesExtensions(extensions: List<String>) {}
}
}
@@ -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.
*/
@@ -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")
@@ -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))
@@ -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<DefaultKotlinSourceSet>().forEach { sourceSet ->
val dependencyConfigurationName =
if (project.isIntransitiveMetadataConfigurationEnabled) sourceSet.intransitiveMetadataConfigurationName
else sourceSet.implementationMetadataConfigurationName
project.dependencies.add(dependencyConfigurationName, libraries)
}
}
}
@@ -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<Task>
get() = locateOrRegisterTask(
"commonize",
@@ -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
@@ -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"
const val RUNTIME = "runtime"
internal const val INTRANSITIVE = "intransitive"