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

org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl.KotlinCreateNativeCompileTasksSideEffect.kt Maven / Gradle / Ivy

There is a newer version: 2.0.0-RC2
Show newest version
/*
 * Copyright 2010-2023 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.
 */

package org.jetbrains.kotlin.gradle.plugin.mpp.compilationImpl

import org.gradle.api.plugins.BasePlugin
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.artifacts.klibOutputDirectory
import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode
import org.jetbrains.kotlin.gradle.dsl.topLevelExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.SubpluginEnvironment
import org.jetbrains.kotlin.gradle.plugin.launchInStage
import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.enabledOnCurrentHost
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.registerTask

/**
 * Will register (and configure) the corresponding [KotlinNativeCompile] task for a given
 * [AbstractKotlinNativeCompilation] (which includes shared native metadata and 'platform compilations')
 */
internal val KotlinCreateNativeCompileTasksSideEffect = KotlinCompilationSideEffect { compilation ->
    val project = compilation.project
    val extension = project.topLevelExtension
    val compilationInfo = KotlinCompilationInfo(compilation)
    val isMetadataCompilation = compilationInfo.compilation is KotlinMetadataCompilation<*>

    val kotlinNativeCompile = project.registerTask(
        compilation.compileKotlinTaskName,
        listOf(compilationInfo, compilation.compilerOptions.options)
    ) { task ->
        task.group = BasePlugin.BUILD_GROUP
        task.description = "Compiles a klibrary from the '${compilationInfo.compilationName}' " +
                "compilation in target '${compilationInfo.targetDisambiguationClassifier}'."
        task.enabled = compilation.konanTarget.enabledOnCurrentHost

        task.destinationDirectory.set(project.klibOutputDirectory(compilationInfo).dir("klib"))
        task.runViaBuildToolsApi.value(false).disallowChanges() // K/N is not yet supported

        task.explicitApiMode.value(
            project.providers.provider {
                // Plugin explicitly does not configures 'explicitApi' mode for test sources
                // compilation, as test sources are not published
                if (compilationInfo.isMain) {
                    extension.explicitApi
                } else {
                    ExplicitApiMode.Disabled
                }
            }
        ).finalizeValueOnRead()

        // for metadata tasks we should provide unpacked klib
        task.produceUnpackedKlib.set(isMetadataCompilation)
    }

    compilationInfo.classesDirs.from(kotlinNativeCompile.map { it.outputFile })
    project.tasks.named(compilation.compileAllTaskName).dependsOn(kotlinNativeCompile)
    project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).dependsOn(kotlinNativeCompile)
    compilation.addCompilerPlugins()
}

private fun AbstractKotlinNativeCompilation.addCompilerPlugins() {
    val project = target.project

    project.launchInStage(KotlinPluginLifecycle.Stage.AfterEvaluateBuildscript) {
        SubpluginEnvironment
            .loadSubplugins(project)
            .addSubpluginOptions(project, this@addCompilerPlugins)

        compileTaskProvider.configure {
            it.compilerPluginClasspath = [email protected]
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy