Add new DSL for configuring K/N framework artifact.
This commit is contained in:
committed by
TeamCityServer
parent
cfdd5673ee
commit
3f40af10dc
+102
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* 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.tasks.artifact
|
||||||
|
|
||||||
|
import org.gradle.api.Project
|
||||||
|
import org.gradle.api.Task
|
||||||
|
import org.gradle.api.plugins.BasePlugin
|
||||||
|
import org.gradle.api.tasks.TaskProvider
|
||||||
|
import org.gradle.language.base.plugins.LifecycleBasePlugin
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.BitcodeEmbeddingMode
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeOutputKind
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.enabledOnCurrentHost
|
||||||
|
import org.jetbrains.kotlin.gradle.tasks.dependsOn
|
||||||
|
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
|
import org.jetbrains.kotlin.konan.target.presetName
|
||||||
|
import org.jetbrains.kotlin.konan.util.visibleName
|
||||||
|
|
||||||
|
class KotlinNativeFramework : KotlinNativeArtifact() {
|
||||||
|
lateinit var target: KonanTarget
|
||||||
|
var embedBitcode: BitcodeEmbeddingMode? = null
|
||||||
|
|
||||||
|
private val kind = NativeOutputKind.FRAMEWORK
|
||||||
|
|
||||||
|
override fun validate(project: Project, name: String): Boolean {
|
||||||
|
val logger = project.logger
|
||||||
|
if (!super.validate(project, name)) return false
|
||||||
|
if (!this::target.isInitialized) {
|
||||||
|
logger.error("Native library '${name}' wasn't configured because it requires target")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (!kind.availableFor(target)) {
|
||||||
|
logger.error("Native library '${name}' wasn't configured because ${kind.description} is not available for ${target.visibleName}")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun registerAssembleTask(project: Project, name: String) {
|
||||||
|
val resultTask = project.registerTask<Task>(lowerCamelCaseName("assemble", name, kind.taskNameClassifier)) { task ->
|
||||||
|
task.group = BasePlugin.BUILD_GROUP
|
||||||
|
task.description = "Assemble ${kind.description} '$name'."
|
||||||
|
task.enabled = target.enabledOnCurrentHost
|
||||||
|
}
|
||||||
|
|
||||||
|
val librariesConfigurationName = project.registerLibsDependencies(target, name, modules)
|
||||||
|
val exportConfigurationName = project.registerExportDependencies(target, name, modules)
|
||||||
|
modes.forEach { buildType ->
|
||||||
|
val targetTask = registerLinkFrameworkTask(
|
||||||
|
project,
|
||||||
|
name,
|
||||||
|
target,
|
||||||
|
buildType,
|
||||||
|
librariesConfigurationName,
|
||||||
|
exportConfigurationName,
|
||||||
|
embedBitcode
|
||||||
|
)
|
||||||
|
resultTask.dependsOn(targetTask)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun KotlinNativeArtifact.registerLinkFrameworkTask(
|
||||||
|
project: Project,
|
||||||
|
name: String,
|
||||||
|
target: KonanTarget,
|
||||||
|
buildType: NativeBuildType,
|
||||||
|
librariesConfigurationName: String,
|
||||||
|
exportConfigurationName: String,
|
||||||
|
embedBitcode: BitcodeEmbeddingMode?,
|
||||||
|
outDirName: String = "out",
|
||||||
|
taskNameSuffix: String = ""
|
||||||
|
): TaskProvider<KotlinNativeLinkArtifactTask> {
|
||||||
|
val kind = NativeOutputKind.FRAMEWORK
|
||||||
|
val destinationDir = project.buildDir.resolve("$outDirName/${kind.visibleName}/${target.visibleName}/${buildType.visibleName}")
|
||||||
|
val resultTask = project.registerTask<KotlinNativeLinkArtifactTask>(
|
||||||
|
lowerCamelCaseName("assemble", name, buildType.visibleName, kind.taskNameClassifier, target.presetName, taskNameSuffix),
|
||||||
|
listOf(target, kind.compilerOutputKind)
|
||||||
|
) { task ->
|
||||||
|
task.description = "Assemble ${kind.description} '$name' for a target '${target.name}'."
|
||||||
|
task.enabled = target.enabledOnCurrentHost
|
||||||
|
task.baseName = name
|
||||||
|
task.destinationDir = destinationDir
|
||||||
|
task.optimized = buildType.optimized
|
||||||
|
task.debuggable = buildType.debuggable
|
||||||
|
task.linkerOptions = linkerOptions
|
||||||
|
task.binaryOptions = binaryOptions
|
||||||
|
task.isStaticFramework = isStatic
|
||||||
|
task.embedBitcode = embedBitcode ?: buildType.embedBitcode(target)
|
||||||
|
task.librariesConfiguration = librariesConfigurationName
|
||||||
|
task.exportLibrariesConfiguration = exportConfigurationName
|
||||||
|
task.kotlinOptions(kotlinOptionsFn)
|
||||||
|
}
|
||||||
|
project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).dependsOn(resultTask)
|
||||||
|
return resultTask
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user