All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmNativeVariantFactory.kt Maven / Gradle / Ivy

There is a newer version: 2.1.0-Beta1
Show newest version
/*
 * 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)
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy