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

org.jetbrains.kotlin.gradle.targets.native.KonanPropertiesBuildService.kt Maven / Gradle / Ivy

There is a newer version: 2.1.0-RC
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.
 */

package org.jetbrains.kotlin.gradle.targets.native

import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.services.BuildService
import org.gradle.api.services.BuildServiceParameters
import org.gradle.api.tasks.Internal
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.dsl.NativeCacheKind
import org.jetbrains.kotlin.gradle.tasks.withType
import org.jetbrains.kotlin.gradle.utils.SingleActionPerProject
import org.jetbrains.kotlin.konan.properties.resolvablePropertyList
import org.jetbrains.kotlin.konan.target.Distribution
import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget
import java.util.*

internal interface UsesKonanPropertiesBuildService : Task {
    @get:Internal
    val konanPropertiesService: Property
}

abstract class KonanPropertiesBuildService : BuildService {

    internal interface Parameters : BuildServiceParameters {
        val konanHome: DirectoryProperty
    }

    private val properties: Properties by lazy {
        Distribution(parameters.konanHome.get().asFile.absolutePath).properties
    }

    private val cacheableTargets: List by lazy {
        properties
            .resolvablePropertyList("cacheableTargets", HostManager.hostName)
            .map { KonanTarget.predefinedTargets.getValue(it) }
    }

    private val targetsWithOptInStaticCaches: List by lazy {
        properties
            .resolvablePropertyList("optInCacheableTargets", HostManager.hostName)
            .map { KonanTarget.predefinedTargets.getValue(it) }
    }

    internal fun defaultCacheKindForTarget(target: KonanTarget): NativeCacheKind =
        if (target in cacheableTargets && target !in targetsWithOptInStaticCaches) {
            NativeCacheKind.STATIC
        } else {
            NativeCacheKind.NONE
        }

    internal fun cacheWorksFor(target: KonanTarget): Boolean =
        target in cacheableTargets

    internal fun additionalCacheFlags(target: KonanTarget): List =
        properties.resolvablePropertyList("additionalCacheFlags", target.visibleName)

    companion object {
        fun registerIfAbsent(project: Project): Provider =
            project.gradle.sharedServices.registerIfAbsent(serviceName, KonanPropertiesBuildService::class.java) { service ->
                service.parameters.konanHome.set(project.konanHome)
            }.also { serviceProvider ->
                SingleActionPerProject.run(project, UsesKonanPropertiesBuildService::class.java.name) {
                    project.tasks.withType().configureEach { task ->
                        task.usesService(serviceProvider)
                    }
                }
            }

        private val serviceName: String
            get() {
                val clazz = KonanPropertiesBuildService::class.java
                return "${clazz}_${clazz.classLoader.hashCode()}"
            }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy