org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmNativeVariantFactory.kt Maven / Gradle / Ivy
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("FunctionName")
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation
import org.jetbrains.kotlin.gradle.utils.setupNativeCompiler
fun GradleKpmNativeVariantFactory(
module: GradleKpmModule,
constructor: GradleKpmNativeVariantConstructor,
config: GradleKpmNativeVariantConfig = GradleKpmNativeVariantConfig()
) = GradleKpmFragmentFactory(
fragmentInstantiator = GradleKpmNativeVariantInstantiator(module, constructor, config),
fragmentConfigurator = GradleKpmNativeVariantConfigurator(config)
)
data class GradleKpmNativeVariantConfig(
val dependenciesConfigurationFactory: GradleKpmFragmentDependencyConfigurationsFactory =
GradleKpmDefaultFragmentDependencyConfigurationsFactory,
val compileDependencies: GradleKpmConfigurationSetup =
DefaultKotlinCompileDependenciesDefinition + GradleKpmKonanTargetAttribute,
val apiElements: GradleKpmConfigurationSetup =
DefaultKotlinApiElementsDefinition
+ GradleKpmKonanTargetAttribute
+ GradleKpmConfigurationRelationSetup { extendsFrom(dependencies.transitiveImplementationConfiguration) },
val hostSpecificMetadataElements: GradleKpmConfigurationSetup =
DefaultKotlinHostSpecificMetadataElementsDefinition,
val compileTaskConfigurator: GradleKpmCompileTaskConfigurator =
GradleKpmNativeCompileTaskConfigurator,
val sourceArchiveTaskConfigurator: GradleKpmSourceArchiveTaskConfigurator =
GradleKpmDefaultKotlinSourceArchiveTaskConfigurator,
val sourceDirectoriesConfigurator: GradleKpmSourceDirectoriesConfigurator =
GradleKpmDefaultSourceDirectoriesConfigurator,
val publicationConfigurator: GradleKpmPublicationConfigurator =
GradleKpmPublicationConfigurator.NativeVariantPublication
)
class GradleKpmNativeVariantInstantiator(
private val module: GradleKpmModule,
private val variantConstructor: GradleKpmNativeVariantConstructor,
private val config: GradleKpmNativeVariantConfig
) : GradleKpmFragmentFactory.FragmentInstantiator {
override fun create(name: String): T {
val names = FragmentNameDisambiguation(module, name)
val dependencies = config.dependenciesConfigurationFactory.create(module, names)
val context = GradleKpmFragmentConfigureContextImpl(module, dependencies, names)
return variantConstructor.invoke(
containingModule = module,
fragmentName = name,
dependencyConfigurations = dependencies,
compileDependencyConfiguration = config.compileDependencies.provider.getConfiguration(context).also { configuration ->
config.compileDependencies.relations.setupExtendsFromRelations(configuration, context)
},
apiElementsConfiguration = config.apiElements.provider.getConfiguration(context).also { configuration ->
config.apiElements.relations.setupExtendsFromRelations(configuration, context)
},
hostSpecificMetadataElementsConfiguration =
config.hostSpecificMetadataElements.provider.getConfiguration(context).also { configuration ->
config.hostSpecificMetadataElements.relations.setupExtendsFromRelations(configuration, context)
}
)
}
}
class GradleKpmNativeVariantConfigurator(
private val config: GradleKpmNativeVariantConfig
) : GradleKpmFragmentFactory.FragmentConfigurator {
override fun configure(fragment: T) {
fragment.project.setupNativeCompiler(fragment.konanTarget)
fragment.compileDependenciesConfiguration.configure(config.compileDependencies, fragment)
fragment.apiElementsConfiguration.configure(config.apiElements, fragment)
fragment.hostSpecificMetadataElementsConfiguration?.configure(config.hostSpecificMetadataElements, fragment)
config.sourceDirectoriesConfigurator.configure(fragment)
config.compileTaskConfigurator.registerCompileTasks(fragment)
config.sourceArchiveTaskConfigurator.registerSourceArchiveTask(fragment)
config.publicationConfigurator.configure(fragment)
}
}