[Gradle][KPM] Reference Configurations directly

Configurations are not registered/created lazily which makes
referencing NamedDomainObjectProvider over Configurations unnecessary
for now.
This commit is contained in:
sebastian.sellmair
2021-11-29 10:29:29 +01:00
committed by Space
parent 032981dd83
commit 444b88e438
20 changed files with 131 additions and 166 deletions
@@ -9,34 +9,34 @@ import org.gradle.api.NamedDomainObjectProvider
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
interface KotlinDependencyConfigurations { interface KotlinDependencyConfigurations {
val apiConfiguration: NamedDomainObjectProvider<Configuration> val apiConfiguration: Configuration
val implementationConfiguration: NamedDomainObjectProvider<Configuration> val implementationConfiguration: Configuration
val compileOnlyConfiguration: NamedDomainObjectProvider<Configuration> val compileOnlyConfiguration: Configuration
val runtimeOnlyConfiguration: NamedDomainObjectProvider<Configuration> val runtimeOnlyConfiguration: Configuration
/** This configuration includes the dependencies from the refines-parents */ /** This configuration includes the dependencies from the refines-parents */
val transitiveApiConfiguration: NamedDomainObjectProvider<Configuration> val transitiveApiConfiguration: Configuration
/** This configuration includes the dependencies from the refines-parents */ /** This configuration includes the dependencies from the refines-parents */
val transitiveImplementationConfiguration: NamedDomainObjectProvider<Configuration> val transitiveImplementationConfiguration: Configuration
private class Impl( private class Impl(
override val apiConfiguration: NamedDomainObjectProvider<Configuration>, override val apiConfiguration: Configuration,
override val implementationConfiguration: NamedDomainObjectProvider<Configuration>, override val implementationConfiguration: Configuration,
override val compileOnlyConfiguration: NamedDomainObjectProvider<Configuration>, override val compileOnlyConfiguration: Configuration,
override val runtimeOnlyConfiguration: NamedDomainObjectProvider<Configuration>, override val runtimeOnlyConfiguration: Configuration,
override val transitiveApiConfiguration: NamedDomainObjectProvider<Configuration>, override val transitiveApiConfiguration:Configuration,
override val transitiveImplementationConfiguration: NamedDomainObjectProvider<Configuration> override val transitiveImplementationConfiguration: Configuration
) : KotlinDependencyConfigurations ) : KotlinDependencyConfigurations
companion object { companion object {
fun create( fun create(
apiConfiguration: NamedDomainObjectProvider<Configuration>, apiConfiguration: Configuration,
implementationConfiguration: NamedDomainObjectProvider<Configuration>, implementationConfiguration: Configuration,
compileOnlyConfiguration: NamedDomainObjectProvider<Configuration>, compileOnlyConfiguration: Configuration,
runtimeOnlyConfiguration: NamedDomainObjectProvider<Configuration>, runtimeOnlyConfiguration: Configuration,
transitiveApiConfiguration: NamedDomainObjectProvider<Configuration>, transitiveApiConfiguration: Configuration,
transitiveImplementationConfiguration: NamedDomainObjectProvider<Configuration> transitiveImplementationConfiguration: Configuration
): KotlinDependencyConfigurations = Impl( ): KotlinDependencyConfigurations = Impl(
apiConfiguration = apiConfiguration, apiConfiguration = apiConfiguration,
implementationConfiguration = implementationConfiguration, implementationConfiguration = implementationConfiguration,
@@ -18,7 +18,7 @@ interface KotlinGradleVariant : KotlinGradleFragment, KotlinModuleVariant {
val platformType: KotlinPlatformType val platformType: KotlinPlatformType
// TODO generalize with KotlinCompilation? // TODO generalize with KotlinCompilation?
val compileDependenciesConfiguration: NamedDomainObjectProvider<Configuration> val compileDependenciesConfiguration: Configuration
var compileDependencyFiles: FileCollection var compileDependencyFiles: FileCollection
@@ -29,28 +29,28 @@ interface KotlinGradleVariant : KotlinGradleFragment, KotlinModuleVariant {
val sourceArchiveTaskName: String val sourceArchiveTaskName: String
// TODO generalize exposing outputs: what if a variant has more than one such configurations or none? // TODO generalize exposing outputs: what if a variant has more than one such configurations or none?
val apiElementsConfiguration: NamedDomainObjectProvider<Configuration> val apiElementsConfiguration: Configuration
val gradleVariantNames: Set<String> val gradleVariantNames: Set<String>
} }
interface KotlinGradleVariantWithRuntime : KotlinGradleVariant { interface KotlinGradleVariantWithRuntime : KotlinGradleVariant {
// TODO deduplicate with KotlinCompilation? // TODO deduplicate with KotlinCompilation?
val runtimeDependenciesConfiguration: NamedDomainObjectProvider<Configuration> val runtimeDependenciesConfiguration: Configuration
var runtimeDependencyFiles: FileCollection var runtimeDependencyFiles: FileCollection
val runtimeFiles: ConfigurableFileCollection val runtimeFiles: ConfigurableFileCollection
// TODO generalize exposing outputs: what if a variant has more than one such configurations or none? // TODO generalize exposing outputs: what if a variant has more than one such configurations or none?
val runtimeElementsConfiguration: NamedDomainObjectProvider<Configuration> val runtimeElementsConfiguration: Configuration
} }
interface KotlinNativeVariant : KotlinGradleVariant { interface KotlinNativeVariant : KotlinGradleVariant {
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.native get() = KotlinPlatformType.native
val hostSpecificMetadataElementsConfiguration: NamedDomainObjectProvider<Configuration>? val hostSpecificMetadataElementsConfiguration: Configuration?
var enableEndorsedLibraries: Boolean var enableEndorsedLibraries: Boolean
} }
@@ -31,14 +31,14 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() {
fun `test accessing configurations`() { fun `test accessing configurations`() {
val variant = KotlinJvmVariantFactory(kotlin.main).create("jvm") val variant = KotlinJvmVariantFactory(kotlin.main).create("jvm")
variant.compileDependenciesConfiguration.get() variant.compileDependenciesConfiguration
variant.runtimeDependenciesConfiguration.get() variant.runtimeDependenciesConfiguration
variant.apiElementsConfiguration.get() variant.apiElementsConfiguration
variant.runtimeElementsConfiguration.get() variant.runtimeElementsConfiguration
variant.implementationConfiguration.get() variant.implementationConfiguration
variant.apiConfiguration.get() variant.apiConfiguration
variant.runtimeOnlyConfiguration.get() variant.runtimeOnlyConfiguration
variant.compileOnlyConfiguration.get() variant.compileOnlyConfiguration
} }
@Test @Test
@@ -88,13 +88,13 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() {
val variant = KotlinJvmVariantFactory( val variant = KotlinJvmVariantFactory(
KotlinJvmVariantInstantiator(kotlin.main), KotlinJvmVariantInstantiator(kotlin.main),
KotlinJvmVariantConfigurator(compileDependenciesConfigurator = { fragment, configuration -> KotlinJvmVariantConfigurator(compileDependenciesConfigurator = { fragment, configuration ->
assertSame(fragment.compileDependenciesConfiguration.get(), configuration) assertSame(fragment.compileDependenciesConfiguration, configuration)
configuration.attributes.attribute(testAttribute, "compileDependencies") configuration.attributes.attribute(testAttribute, "compileDependencies")
}) })
).create("jvm") ).create("jvm")
assertEquals( assertEquals(
"compileDependencies", variant.compileDependenciesConfiguration.get().attributes.getAttribute(testAttribute) "compileDependencies", variant.compileDependenciesConfiguration.attributes.getAttribute(testAttribute)
) )
} }
@@ -103,13 +103,13 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() {
val variant = KotlinJvmVariantFactory( val variant = KotlinJvmVariantFactory(
KotlinJvmVariantInstantiator(kotlin.main), KotlinJvmVariantInstantiator(kotlin.main),
KotlinJvmVariantConfigurator(runtimeDependenciesConfigurator = { fragment, configuration -> KotlinJvmVariantConfigurator(runtimeDependenciesConfigurator = { fragment, configuration ->
assertSame(fragment.runtimeDependenciesConfiguration.get(), configuration) assertSame(fragment.runtimeDependenciesConfiguration, configuration)
configuration.attributes.attribute(testAttribute, "runtimeDependencies") configuration.attributes.attribute(testAttribute, "runtimeDependencies")
}) })
).create("jvm") ).create("jvm")
assertEquals( assertEquals(
"runtimeDependencies", variant.runtimeDependenciesConfiguration.get().attributes.getAttribute(testAttribute) "runtimeDependencies", variant.runtimeDependenciesConfiguration.attributes.getAttribute(testAttribute)
) )
} }
@@ -117,13 +117,13 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() {
fun `test custom configure apiElementsConfiguration`() { fun `test custom configure apiElementsConfiguration`() {
val variant = KotlinJvmVariantFactory( val variant = KotlinJvmVariantFactory(
KotlinJvmVariantInstantiator(kotlin.main), KotlinJvmVariantConfigurator(apiElementsConfigurator = { fragment, configuration -> KotlinJvmVariantInstantiator(kotlin.main), KotlinJvmVariantConfigurator(apiElementsConfigurator = { fragment, configuration ->
assertSame(fragment.apiElementsConfiguration.get(), configuration) assertSame(fragment.apiElementsConfiguration, configuration)
configuration.attributes.attribute(testAttribute, "apiElements") configuration.attributes.attribute(testAttribute, "apiElements")
}) })
).create("jvm") ).create("jvm")
assertEquals( assertEquals(
"apiElements", variant.apiElementsConfiguration.get().attributes.getAttribute(testAttribute) "apiElements", variant.apiElementsConfiguration.attributes.getAttribute(testAttribute)
) )
} }
@@ -132,13 +132,13 @@ class KotlinJvmVariantFactoryTest : AbstractKpmExtensionTest() {
val variant = KotlinJvmVariantFactory( val variant = KotlinJvmVariantFactory(
KotlinJvmVariantInstantiator(kotlin.main), KotlinJvmVariantInstantiator(kotlin.main),
KotlinJvmVariantConfigurator(runtimeElementsConfigurator = { fragment, configuration -> KotlinJvmVariantConfigurator(runtimeElementsConfigurator = { fragment, configuration ->
assertSame(fragment.runtimeElementsConfiguration.get(), configuration) assertSame(fragment.runtimeElementsConfiguration, configuration)
configuration.attributes.attribute(testAttribute, "runtimeElements") configuration.attributes.attribute(testAttribute, "runtimeElements")
}) })
).create("jvm") ).create("jvm")
assertEquals( assertEquals(
"runtimeElements", variant.runtimeElementsConfiguration.get().attributes.getAttribute(testAttribute) "runtimeElements", variant.runtimeElementsConfiguration.attributes.getAttribute(testAttribute)
) )
} }
@@ -53,7 +53,7 @@ class KotlinNativeVariantFactoryTest(
fun `test compileDependenciesConfiguration - contains konanTarget`() { fun `test compileDependenciesConfiguration - contains konanTarget`() {
assertEquals( assertEquals(
variantConstructor.konanTarget.name, variantConstructor.konanTarget.name,
variant.compileDependenciesConfiguration.get() variant.compileDependenciesConfiguration
.attributes.getAttribute(KotlinNativeTarget.konanTargetAttribute) .attributes.getAttribute(KotlinNativeTarget.konanTargetAttribute)
) )
} }
@@ -62,7 +62,7 @@ class KotlinNativeVariantFactoryTest(
fun `test apiElementsConfiguration - contains konanTarget`() { fun `test apiElementsConfiguration - contains konanTarget`() {
assertEquals( assertEquals(
variantConstructor.konanTarget.name, variantConstructor.konanTarget.name,
variant.apiElementsConfiguration.get() variant.apiElementsConfiguration
.attributes.getAttribute(KotlinNativeTarget.konanTargetAttribute) .attributes.getAttribute(KotlinNativeTarget.konanTargetAttribute)
) )
} }
@@ -334,7 +334,7 @@ class GradleModuleVariantResolver : ModuleVariantResolver {
project.configurations.getByName(compilation.compileDependencyConfigurationName) project.configurations.getByName(compilation.compileDependencyConfigurationName)
} }
is KotlinPm20ProjectExtension -> { is KotlinPm20ProjectExtension -> {
(requestingVariant as KotlinGradleVariant).compileDependenciesConfiguration.get() (requestingVariant as KotlinGradleVariant).compileDependenciesConfiguration
} }
else -> error("could not find the compile dependencies configuration for variant $requestingVariant") else -> error("could not find the compile dependencies configuration for variant $requestingVariant")
} }
@@ -161,7 +161,7 @@ internal class FragmentGranularMetadataResolver(
// resolve the dependencies of that variant getting the host-specific metadata artifact // resolve the dependencies of that variant getting the host-specific metadata artifact
relevantVariantResolution?.let { resolution -> relevantVariantResolution?.let { resolution ->
val configurationResolvingPlatformVariant = val configurationResolvingPlatformVariant =
(resolution.requestingVariant as KotlinGradleVariant).compileDependenciesConfiguration.get() (resolution.requestingVariant as KotlinGradleVariant).compileDependenciesConfiguration
val hostSpecificArtifact = ResolvedMppVariantsProvider.get(project) val hostSpecificArtifact = ResolvedMppVariantsProvider.get(project)
.getHostSpecificMetadataArtifactByRootModule( .getHostSpecificMetadataArtifactByRootModule(
dependencyModule.moduleIdentifier, dependencyModule.moduleIdentifier,
@@ -6,9 +6,6 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.locateOrRegister
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
import org.jetbrains.kotlin.gradle.utils.extendsFrom
interface KotlinDependencyConfigurationsFactory { interface KotlinDependencyConfigurationsFactory {
fun create(module: KotlinGradleModule, names: FragmentNameDisambiguation): KotlinDependencyConfigurations fun create(module: KotlinGradleModule, names: FragmentNameDisambiguation): KotlinDependencyConfigurations
@@ -18,12 +15,12 @@ object DefaultKotlinDependencyConfigurationsFactory : KotlinDependencyConfigurat
override fun create(module: KotlinGradleModule, names: FragmentNameDisambiguation): KotlinDependencyConfigurations { override fun create(module: KotlinGradleModule, names: FragmentNameDisambiguation): KotlinDependencyConfigurations {
val configurations = module.project.configurations val configurations = module.project.configurations
val apiConfiguration = configurations.locateOrRegister(names.disambiguateName("api")) val apiConfiguration = configurations.maybeCreate(names.disambiguateName("api"))
val implementationConfiguration = configurations.locateOrRegister(names.disambiguateName("implementation")) val implementationConfiguration = configurations.maybeCreate(names.disambiguateName("implementation"))
val compileOnlyConfiguration = configurations.locateOrRegister(names.disambiguateName("compileOnly")) val compileOnlyConfiguration = configurations.maybeCreate(names.disambiguateName("compileOnly"))
val runtimeOnlyConfiguration = configurations.locateOrRegister(names.disambiguateName("runtimeOnly")) val runtimeOnlyConfiguration = configurations.maybeCreate(names.disambiguateName("runtimeOnly"))
val transitiveApiConfiguration = configurations.locateOrRegister(names.disambiguateName("transitiveApi")) val transitiveApiConfiguration = configurations.maybeCreate(names.disambiguateName("transitiveApi"))
val transitiveImplementationConfiguration = configurations.locateOrRegister(names.disambiguateName("transitiveImplementation")) val transitiveImplementationConfiguration = configurations.maybeCreate(names.disambiguateName("transitiveImplementation"))
listOf( listOf(
apiConfiguration, apiConfiguration,
@@ -32,11 +29,9 @@ object DefaultKotlinDependencyConfigurationsFactory : KotlinDependencyConfigurat
runtimeOnlyConfiguration, runtimeOnlyConfiguration,
transitiveApiConfiguration, transitiveApiConfiguration,
transitiveImplementationConfiguration transitiveImplementationConfiguration
).forEach { configurationProvider -> ).forEach { configuration ->
configurationProvider.configure { configuration -> configuration.isCanBeConsumed = false
configuration.isCanBeConsumed = false configuration.isCanBeResolved = false
configuration.isCanBeResolved = false
}
} }
transitiveApiConfiguration.extendsFrom(apiConfiguration) transitiveApiConfiguration.extendsFrom(apiConfiguration)
@@ -5,14 +5,13 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.NamedDomainObjectProvider
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation
interface KotlinFragmentConfigurationInstantiator { interface KotlinFragmentConfigurationInstantiator {
fun locateOrRegister( fun create(
module: KotlinGradleModule, module: KotlinGradleModule,
names: FragmentNameDisambiguation, names: FragmentNameDisambiguation,
dependencies: KotlinDependencyConfigurations dependencies: KotlinDependencyConfigurations
): NamedDomainObjectProvider<Configuration> ): Configuration
} }
@@ -14,8 +14,7 @@ import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
import org.jetbrains.kotlin.project.model.refinesClosure import org.jetbrains.kotlin.project.model.refinesClosure
object KotlinHostSpecificMetadataArtifactConfigurator : object KotlinHostSpecificMetadataArtifactConfigurator : KotlinGradleFragmentFactory.FragmentConfigurator<KotlinNativeVariantInternal> {
KotlinGradleFragmentFactory.FragmentConfigurator<KotlinNativeVariantInternal> {
override fun configure(fragment: KotlinNativeVariantInternal) { override fun configure(fragment: KotlinNativeVariantInternal) {
val project = fragment.project val project = fragment.project
val hostSpecificMetadataElements = fragment.hostSpecificMetadataElementsConfiguration ?: return val hostSpecificMetadataElements = fragment.hostSpecificMetadataElementsConfiguration ?: return
@@ -36,11 +35,9 @@ object KotlinHostSpecificMetadataArtifactConfigurator :
} }
} }
hostSpecificMetadataElements.configure { configuration -> project.artifacts.add(hostSpecificMetadataElements.name, hostSpecificMetadataJar)
project.artifacts.add(configuration.name, hostSpecificMetadataJar) hostSpecificMetadataElements.dependencies.addAllLater(project.objects.listProperty(Dependency::class.java).apply {
configuration.dependencies.addAllLater(project.objects.listProperty(Dependency::class.java).apply { set(project.provider { fragment.apiElementsConfiguration.allDependencies })
set(project.provider { fragment.apiElementsConfiguration.get().allDependencies }) })
})
}
} }
} }
@@ -17,10 +17,10 @@ open class KotlinJvmVariant(
containingModule: KotlinGradleModule, containingModule: KotlinGradleModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependenciesConfiguration: NamedDomainObjectProvider<Configuration>, compileDependenciesConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
runtimeDependenciesConfiguration: NamedDomainObjectProvider<Configuration>, runtimeDependenciesConfiguration: Configuration,
runtimeElementsConfiguration: NamedDomainObjectProvider<Configuration> runtimeElementsConfiguration: Configuration
) : KotlinGradlePublishedVariantWithRuntime( ) : KotlinGradlePublishedVariantWithRuntime(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
@@ -50,10 +50,10 @@ class KotlinJvmVariantInstantiator(
containingModule = module, containingModule = module,
fragmentName = name, fragmentName = name,
dependencyConfigurations = dependencies, dependencyConfigurations = dependencies,
compileDependenciesConfiguration = compileDependenciesConfigurationInstantiator.locateOrRegister(module, names, dependencies), compileDependenciesConfiguration = compileDependenciesConfigurationInstantiator.create(module, names, dependencies),
apiElementsConfiguration = apiElementsConfigurationInstantiator.locateOrRegister(module, names, dependencies), apiElementsConfiguration = apiElementsConfigurationInstantiator.create(module, names, dependencies),
runtimeDependenciesConfiguration = runtimeDependenciesConfigurationInstantiator.locateOrRegister(module, names, dependencies), runtimeDependenciesConfiguration = runtimeDependenciesConfigurationInstantiator.create(module, names, dependencies),
runtimeElementsConfiguration = runtimeElementsConfigurationInstantiator.locateOrRegister(module, names, dependencies) runtimeElementsConfiguration = runtimeElementsConfigurationInstantiator.create(module, names, dependencies)
) )
} }
} }
@@ -86,24 +86,11 @@ class KotlinJvmVariantConfigurator(
) : KotlinGradleFragmentFactory.FragmentConfigurator<KotlinJvmVariant> { ) : KotlinGradleFragmentFactory.FragmentConfigurator<KotlinJvmVariant> {
override fun configure(fragment: KotlinJvmVariant) { override fun configure(fragment: KotlinJvmVariant) {
fragment.compileDependenciesConfiguration.configure { configuration -> compileDependenciesConfigurator.configure(fragment, fragment.compileDependenciesConfiguration)
compileDependenciesConfigurator.configure(fragment, configuration) runtimeDependenciesConfigurator.configure(fragment, fragment.runtimeDependenciesConfiguration)
} apiElementsConfigurator.configure(fragment, fragment.apiElementsConfiguration)
runtimeElementsConfigurator.configure(fragment, fragment.runtimeElementsConfiguration)
fragment.runtimeDependenciesConfiguration.configure { configuration ->
runtimeDependenciesConfigurator.configure(fragment, configuration)
}
fragment.apiElementsConfiguration.configure { configuration ->
apiElementsConfigurator.configure(fragment, configuration)
}
fragment.runtimeElementsConfiguration.configure { configuration ->
runtimeElementsConfigurator.configure(fragment, configuration)
}
sourceDirectoriesConfigurator.configure(fragment) sourceDirectoriesConfigurator.configure(fragment)
compileTaskConfigurator.registerCompileTasks(fragment) compileTaskConfigurator.registerCompileTasks(fragment)
sourceArchiveTaskConfigurator.registerSourceArchiveTask(fragment) sourceArchiveTaskConfigurator.registerSourceArchiveTask(fragment)
publicationConfigurator.configure(fragment) publicationConfigurator.configure(fragment)
@@ -20,9 +20,9 @@ abstract class KotlinNativeVariantInternal(
fragmentName: String, fragmentName: String,
val konanTarget: KonanTarget, val konanTarget: KonanTarget,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependencyConfiguration: NamedDomainObjectProvider<Configuration>, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
final override val hostSpecificMetadataElementsConfiguration: NamedDomainObjectProvider<Configuration>? final override val hostSpecificMetadataElementsConfiguration: Configuration?
) : KotlinNativeVariant, ) : KotlinNativeVariant,
KotlinGradleVariantInternal( KotlinGradleVariantInternal(
containingModule = containingModule, containingModule = containingModule,
@@ -52,18 +52,18 @@ class KotlinNativeVariantConstructor<T : KotlinNativeVariantInternal>(
containingModule: KotlinGradleModule, containingModule: KotlinGradleModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependencyConfiguration: NamedDomainObjectProvider<Configuration>, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: NamedDomainObjectProvider<Configuration>? hostSpecificMetadataElementsConfiguration: Configuration?
) -> T ) -> T
) { ) {
operator fun invoke( operator fun invoke(
containingModule: KotlinGradleModule, containingModule: KotlinGradleModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependencyConfiguration: NamedDomainObjectProvider<Configuration>, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: NamedDomainObjectProvider<Configuration>? hostSpecificMetadataElementsConfiguration: Configuration?
): T = constructor( ): T = constructor(
containingModule, fragmentName, containingModule, fragmentName,
dependencyConfigurations, dependencyConfigurations,
@@ -78,9 +78,9 @@ open class KotlinLinuxX64Variant @Inject constructor(
containingModule: KotlinGradleModule, containingModule: KotlinGradleModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependencyConfiguration: NamedDomainObjectProvider<Configuration>, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: NamedDomainObjectProvider<Configuration>? hostSpecificMetadataElementsConfiguration: Configuration?
) : KotlinNativeVariantInternal( ) : KotlinNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
@@ -101,9 +101,9 @@ open class KotlinMacosX64Variant @Inject constructor(
containingModule: KotlinGradleModule, containingModule: KotlinGradleModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependencyConfiguration: NamedDomainObjectProvider<Configuration>, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: NamedDomainObjectProvider<Configuration>? hostSpecificMetadataElementsConfiguration: Configuration?
) : KotlinNativeVariantInternal( ) : KotlinNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
@@ -123,9 +123,9 @@ open class KotlinMacosX64Variant @Inject constructor(
open class KotlinMacosArm64Variant @Inject constructor( open class KotlinMacosArm64Variant @Inject constructor(
containingModule: KotlinGradleModule, fragmentName: String, containingModule: KotlinGradleModule, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependencyConfiguration: NamedDomainObjectProvider<Configuration>, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: NamedDomainObjectProvider<Configuration>? hostSpecificMetadataElementsConfiguration: Configuration?
) : KotlinNativeVariantInternal( ) : KotlinNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
@@ -146,9 +146,9 @@ open class KotlinIosX64Variant @Inject constructor(
containingModule: KotlinGradleModule, containingModule: KotlinGradleModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependencyConfiguration: NamedDomainObjectProvider<Configuration>, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: NamedDomainObjectProvider<Configuration>? hostSpecificMetadataElementsConfiguration: Configuration?
) : KotlinNativeVariantInternal( ) : KotlinNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
@@ -169,9 +169,9 @@ open class KotlinIosArm64Variant @Inject constructor(
containingModule: KotlinGradleModule, containingModule: KotlinGradleModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependencyConfiguration: NamedDomainObjectProvider<Configuration>, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: NamedDomainObjectProvider<Configuration>? hostSpecificMetadataElementsConfiguration: Configuration?
) : KotlinNativeVariantInternal( ) : KotlinNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
@@ -44,10 +44,10 @@ class KotlinNativeVariantInstantiator<T : KotlinNativeVariantInternal>(
containingModule = module, containingModule = module,
fragmentName = name, fragmentName = name,
dependencyConfigurations = dependencies, dependencyConfigurations = dependencies,
compileDependencyConfiguration = compileDependenciesConfigurationInstantiator.locateOrRegister(module, names, dependencies), compileDependencyConfiguration = compileDependenciesConfigurationInstantiator.create(module, names, dependencies),
apiElementsConfiguration = apiElementsConfigurationInstantiator.locateOrRegister(module, names, dependencies), apiElementsConfiguration = apiElementsConfigurationInstantiator.create(module, names, dependencies),
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration =
hostSpecificMetadataElementsConfigurationInstantiator?.locateOrRegister(module, names, dependencies) hostSpecificMetadataElementsConfigurationInstantiator?.create(module, names, dependencies)
) )
} }
} }
@@ -79,18 +79,11 @@ class KotlinNativeVariantConfigurator<T : KotlinNativeVariantInternal>(
) : KotlinGradleFragmentFactory.FragmentConfigurator<T> { ) : KotlinGradleFragmentFactory.FragmentConfigurator<T> {
override fun configure(fragment: T) { override fun configure(fragment: T) {
fragment.compileDependenciesConfiguration.configure { configuration -> compileDependenciesConfigurator.configure(fragment, fragment.compileDependenciesConfiguration)
compileDependenciesConfigurator.configure(fragment, configuration) apiElementsConfigurator.configure(fragment, fragment.apiElementsConfiguration)
} fragment.hostSpecificMetadataElementsConfiguration?.let { configuration ->
fragment.apiElementsConfiguration.configure { configuration ->
apiElementsConfigurator.configure(fragment, configuration)
}
fragment.hostSpecificMetadataElementsConfiguration?.configure { configuration ->
hostSpecificMetadataElementsConfigurator.configure(fragment, configuration) hostSpecificMetadataElementsConfigurator.configure(fragment, configuration)
} }
hostSpecificMetadataArtifactConfigurator.configure(fragment) hostSpecificMetadataArtifactConfigurator.configure(fragment)
sourceDirectoriesConfigurator.configure(fragment) sourceDirectoriesConfigurator.configure(fragment)
compileTaskConfigurator.registerCompileTasks(fragment) compileTaskConfigurator.registerCompileTasks(fragment)
@@ -54,7 +54,7 @@ internal open class TransformKotlinGranularMetadataForFragment
val participatingFragments = fragment.refinesClosure val participatingFragments = fragment.refinesClosure
val participatingCompilations = participatingFragments.flatMap { it.containingModule.variantsContainingFragment(it) } val participatingCompilations = participatingFragments.flatMap { it.containingModule.variantsContainingFragment(it) }
participatingCompilations.associate { variant -> participatingCompilations.associate { variant ->
variant.fragmentName to variant.compileDependenciesConfiguration.get() variant.fragmentName to variant.compileDependenciesConfiguration
.allDependencies.map { listOf(it.group, it.name, it.version) }.toSet() .allDependencies.map { listOf(it.group, it.name, it.version) }.toSet()
} }
} }
@@ -25,8 +25,8 @@ abstract class KotlinGradleVariantInternal(
containingModule: KotlinGradleModule, containingModule: KotlinGradleModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
final override val compileDependenciesConfiguration: NamedDomainObjectProvider<Configuration>, final override val compileDependenciesConfiguration: Configuration,
final override val apiElementsConfiguration: NamedDomainObjectProvider<Configuration> final override val apiElementsConfiguration: Configuration
) : KotlinGradleFragmentInternal( ) : KotlinGradleFragmentInternal(
containingModule, fragmentName, dependencyConfigurations containingModule, fragmentName, dependencyConfigurations
), KotlinGradleVariant { ), KotlinGradleVariant {
@@ -34,7 +34,7 @@ abstract class KotlinGradleVariantInternal(
override val variantAttributes: Map<KotlinAttributeKey, String> override val variantAttributes: Map<KotlinAttributeKey, String>
get() = mapOf(KotlinPlatformTypeAttribute to kotlinPlatformTypeAttributeFromPlatform(platformType)) // TODO user attributes get() = mapOf(KotlinPlatformTypeAttribute to kotlinPlatformTypeAttributeFromPlatform(platformType)) // TODO user attributes
override var compileDependencyFiles: FileCollection = project.files({ compileDependenciesConfiguration.get() }) override var compileDependencyFiles: FileCollection = project.files({ compileDependenciesConfiguration })
internal abstract val compilationData: KotlinVariantCompilationDataInternal<*> internal abstract val compilationData: KotlinVariantCompilationDataInternal<*>
@@ -80,10 +80,10 @@ abstract class KotlinGradleVariantWithRuntimeInternal(
containingModule: KotlinGradleModule, containingModule: KotlinGradleModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependencyConfiguration: NamedDomainObjectProvider<Configuration>, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
final override val runtimeDependenciesConfiguration: NamedDomainObjectProvider<Configuration>, final override val runtimeDependenciesConfiguration: Configuration,
final override val runtimeElementsConfiguration: NamedDomainObjectProvider<Configuration> final override val runtimeElementsConfiguration: Configuration
) : KotlinGradleVariantInternal( ) : KotlinGradleVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
@@ -105,10 +105,10 @@ private fun defaultModuleSuffix(module: KotlinGradleModule, variantName: String)
abstract class KotlinGradlePublishedVariantWithRuntime( abstract class KotlinGradlePublishedVariantWithRuntime(
containingModule: KotlinGradleModule, fragmentName: String, containingModule: KotlinGradleModule, fragmentName: String,
dependencyConfigurations: KotlinDependencyConfigurations, dependencyConfigurations: KotlinDependencyConfigurations,
compileDependencyConfiguration: NamedDomainObjectProvider<Configuration>, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: NamedDomainObjectProvider<Configuration>, apiElementsConfiguration: Configuration,
runtimeDependencyConfiguration: NamedDomainObjectProvider<Configuration>, runtimeDependencyConfiguration: Configuration,
runtimeElementsConfiguration: NamedDomainObjectProvider<Configuration> runtimeElementsConfiguration: Configuration
) : KotlinGradleVariantWithRuntimeInternal( ) : KotlinGradleVariantWithRuntimeInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration
import org.gradle.api.NamedDomainObjectProvider
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.attributes.Bundling import org.gradle.api.attributes.Bundling
import org.gradle.api.attributes.Category import org.gradle.api.attributes.Category
@@ -13,22 +12,21 @@ import org.gradle.jvm.tasks.Jar
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.locateOrRegister
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
interface KotlinApiElementsConfigurationInstantiator : KotlinFragmentConfigurationInstantiator interface KotlinApiElementsConfigurationInstantiator : KotlinFragmentConfigurationInstantiator
object DefaultKotlinApiElementsConfigurationInstantiator : KotlinApiElementsConfigurationInstantiator { object DefaultKotlinApiElementsConfigurationInstantiator : KotlinApiElementsConfigurationInstantiator {
override fun locateOrRegister( override fun create(
module: KotlinGradleModule, module: KotlinGradleModule,
names: FragmentNameDisambiguation, names: FragmentNameDisambiguation,
dependencies: KotlinDependencyConfigurations dependencies: KotlinDependencyConfigurations
): NamedDomainObjectProvider<Configuration> { ): Configuration {
return module.project.configurations.locateOrRegister(names.disambiguateName("apiElements")) { return module.project.configurations.maybeCreate(names.disambiguateName("apiElements")).apply {
isCanBeResolved = false isCanBeResolved = false
isCanBeConsumed = false isCanBeConsumed = false
extendsFrom(dependencies.transitiveApiConfiguration.get()) extendsFrom(dependencies.transitiveApiConfiguration)
module.ifMadePublic { isCanBeConsumed = true } module.ifMadePublic { isCanBeConsumed = true }
attributes.attribute(Category.CATEGORY_ATTRIBUTE, module.project.objects.named(Category::class.java, Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, module.project.objects.named(Category::class.java, Category.LIBRARY))
@@ -16,12 +16,12 @@ import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
interface KotlinCompileDependenciesConfigurationInstantiator : KotlinFragmentConfigurationInstantiator interface KotlinCompileDependenciesConfigurationInstantiator : KotlinFragmentConfigurationInstantiator
object DefaultKotlinCompileDependenciesConfigurationInstantiator : KotlinCompileDependenciesConfigurationInstantiator { object DefaultKotlinCompileDependenciesConfigurationInstantiator : KotlinCompileDependenciesConfigurationInstantiator {
override fun locateOrRegister( override fun create(
module: KotlinGradleModule, module: KotlinGradleModule,
names: FragmentNameDisambiguation, names: FragmentNameDisambiguation,
dependencies: KotlinDependencyConfigurations dependencies: KotlinDependencyConfigurations
): NamedDomainObjectProvider<Configuration> { ): Configuration {
return module.project.configurations.locateOrRegister(names.disambiguateName("compileDependencies")) { return module.project.configurations.maybeCreate(names.disambiguateName("compileDependencies")).apply {
isCanBeConsumed = false isCanBeConsumed = false
isCanBeResolved = true isCanBeResolved = true
module.project.addExtendsFromRelation(name, dependencies.transitiveApiConfiguration.name) module.project.addExtendsFromRelation(name, dependencies.transitiveApiConfiguration.name)
@@ -7,12 +7,10 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration
import org.gradle.api.NamedDomainObjectProvider
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.plugin.mpp.isHostSpecificKonanTargetsSet import org.jetbrains.kotlin.gradle.plugin.mpp.isHostSpecificKonanTargetsSet
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.locateOrRegister
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
interface KotlinHostSpecificMetadataElementsConfigurationInstantiator : KotlinFragmentConfigurationInstantiator interface KotlinHostSpecificMetadataElementsConfigurationInstantiator : KotlinFragmentConfigurationInstantiator
@@ -24,10 +22,10 @@ fun DefaultKotlinHostSpecificMetadataElementsConfigurationInstantiator(
private object DefaultKotlinHostSpecificMetadataElementsConfigurationInstantiator : private object DefaultKotlinHostSpecificMetadataElementsConfigurationInstantiator :
KotlinHostSpecificMetadataElementsConfigurationInstantiator { KotlinHostSpecificMetadataElementsConfigurationInstantiator {
override fun locateOrRegister( override fun create(
module: KotlinGradleModule, names: FragmentNameDisambiguation, dependencies: KotlinDependencyConfigurations module: KotlinGradleModule, names: FragmentNameDisambiguation, dependencies: KotlinDependencyConfigurations
): NamedDomainObjectProvider<Configuration> { ): Configuration {
return module.project.configurations.locateOrRegister(names.disambiguateName("hostSpecificMetadataElements")) { return module.project.configurations.maybeCreate(names.disambiguateName("hostSpecificMetadataElements")).apply {
isCanBeResolved = false isCanBeResolved = false
isCanBeConsumed = false isCanBeConsumed = false
} }
@@ -15,12 +15,12 @@ import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
interface KotlinRuntimeDependenciesConfigurationInstantiator : KotlinFragmentConfigurationInstantiator interface KotlinRuntimeDependenciesConfigurationInstantiator : KotlinFragmentConfigurationInstantiator
object DefaultKotlinRuntimeDependenciesConfigurationInstantiator : KotlinRuntimeDependenciesConfigurationInstantiator { object DefaultKotlinRuntimeDependenciesConfigurationInstantiator : KotlinRuntimeDependenciesConfigurationInstantiator {
override fun locateOrRegister( override fun create(
module: KotlinGradleModule, module: KotlinGradleModule,
names: FragmentNameDisambiguation, names: FragmentNameDisambiguation,
dependencies: KotlinDependencyConfigurations dependencies: KotlinDependencyConfigurations
): NamedDomainObjectProvider<Configuration> { ): Configuration {
return module.project.configurations.locateOrRegister(names.disambiguateName("runtimeDependencies")) { return module.project.configurations.maybeCreate(names.disambiguateName("runtimeDependencies")).apply {
isCanBeConsumed = false isCanBeConsumed = false
isCanBeResolved = true isCanBeResolved = true
module.project.addExtendsFromRelation(name, dependencies.transitiveApiConfiguration.name) module.project.addExtendsFromRelation(name, dependencies.transitiveApiConfiguration.name)
@@ -5,32 +5,30 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration package org.jetbrains.kotlin.gradle.plugin.mpp.pm20.configuration
import org.gradle.api.NamedDomainObjectProvider
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.attributes.Bundling import org.gradle.api.attributes.Bundling
import org.gradle.api.attributes.Category import org.gradle.api.attributes.Category
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinFragmentModuleCapabilityConfigurator.setModuleCapability import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinFragmentModuleCapabilityConfigurator.setModuleCapability
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.locateOrRegister
interface KotlinRuntimeElementsConfigurationFactory : KotlinFragmentConfigurationInstantiator interface KotlinRuntimeElementsConfigurationFactory : KotlinFragmentConfigurationInstantiator
object DefaultKotlinRuntimeElementsConfigurationInstantiator : KotlinRuntimeElementsConfigurationFactory { object DefaultKotlinRuntimeElementsConfigurationInstantiator : KotlinRuntimeElementsConfigurationFactory {
override fun locateOrRegister( override fun create(
module: KotlinGradleModule, module: KotlinGradleModule,
names: FragmentNameDisambiguation, names: FragmentNameDisambiguation,
dependencies: KotlinDependencyConfigurations dependencies: KotlinDependencyConfigurations
): NamedDomainObjectProvider<Configuration> { ): Configuration {
return module.project.configurations.locateOrRegister(names.disambiguateName("runtimeElements")) { return module.project.configurations.maybeCreate(names.disambiguateName("runtimeElements")).apply {
isCanBeResolved = false isCanBeResolved = false
isCanBeConsumed = false isCanBeConsumed = false
attributes.attribute(Category.CATEGORY_ATTRIBUTE, module.project.objects.named(Category::class.java, Category.LIBRARY)) attributes.attribute(Category.CATEGORY_ATTRIBUTE, module.project.objects.named(Category::class.java, Category.LIBRARY))
attributes.attribute(Bundling.BUNDLING_ATTRIBUTE, module.project.objects.named(Bundling::class.java, Bundling.EXTERNAL)) attributes.attribute(Bundling.BUNDLING_ATTRIBUTE, module.project.objects.named(Bundling::class.java, Bundling.EXTERNAL))
extendsFrom(dependencies.transitiveApiConfiguration.get()) extendsFrom(dependencies.transitiveApiConfiguration)
extendsFrom(dependencies.transitiveImplementationConfiguration.get()) extendsFrom(dependencies.transitiveImplementationConfiguration)
module.ifMadePublic { module.ifMadePublic {
isCanBeConsumed = true isCanBeConsumed = true
setModuleCapability(this, module) setModuleCapability(this, module)