Provide aggregate link tasks

This commit is contained in:
Ilya Matveev
2018-12-13 13:05:40 +07:00
parent ea21662bed
commit 0bcb253e53
5 changed files with 47 additions and 33 deletions
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.dsl
import org.gradle.api.*
import org.gradle.api.plugins.ExtensionAware
import org.gradle.util.WrapUtil
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
@@ -44,6 +45,7 @@ open class KotlinNativeBinaryContainer @Inject constructor(
get() = target.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME)
private val nameToBinary = mutableMapOf<String, NativeBinary>()
internal val prefixGroups: NamedDomainObjectSet<PrefixGroup> = WrapUtil.toNamedDomainObjectSet(PrefixGroup::class.java)
// region DSL getters.
private fun generateName(prefix: String, buildType: NativeBuildType, outputKindClassifier: String) =
@@ -116,25 +118,32 @@ open class KotlinNativeBinaryContainer @Inject constructor(
buildTypes: Collection<NativeBuildType>,
create: (name: String, baseName: String, buildType: NativeBuildType, compilation: KotlinNativeCompilation) -> T,
configure: T.() -> Unit
) = buildTypes.forEach { buildType ->
val name = generateName(namePrefix, buildType, outputKind.taskNameClassifier)
require(name !in nameToBinary) {
"Cannot create binary $name: binary with such a name already exists"
) {
val prefixGroup = prefixGroups.findByName(namePrefix) ?: PrefixGroup(namePrefix).also {
prefixGroups.add(it)
}
require(outputKind.availableFor(target.konanTarget)) {
"Cannot create binary $name: ${outputKind.taskNameClassifier.decapitalize()} binaries are not available for target ${target.name}"
}
buildTypes.forEach { buildType ->
val name = generateName(namePrefix, buildType, outputKind.taskNameClassifier)
val binary = create(name, baseName, buildType, defaultCompilation)
add(binary)
nameToBinary[binary.name] = binary
// Allow accessing binaries as properties of the container in Groovy DSL.
if (this is ExtensionAware) {
extensions.add(binary.name, binary)
require(name !in nameToBinary) {
"Cannot create binary $name: binary with such a name already exists"
}
require(outputKind.availableFor(target.konanTarget)) {
"Cannot create binary $name: ${outputKind.taskNameClassifier.decapitalize()} binaries are not available for target ${target.name}"
}
val binary = create(name, baseName, buildType, defaultCompilation)
add(binary)
prefixGroup.binaries.add(binary)
nameToBinary[binary.name] = binary
// Allow accessing binaries as properties of the container in Groovy DSL.
if (this is ExtensionAware) {
extensions.add(binary.name, binary)
}
binary.configure()
}
binary.configure()
}
internal fun defaultTestExecutable(
@@ -150,4 +159,14 @@ open class KotlinNativeBinaryContainer @Inject constructor(
configure
)
// endregion.
internal inner class PrefixGroup(
private val name: String
) : Named {
override fun getName(): String = name
val binaries: DomainObjectSet<NativeBinary> = WrapUtil.toDomainObjectSet(NativeBinary::class.java)
val linkTaskName: String
get() = lowerCamelCaseName("link", name, target.targetName)
}
}
@@ -464,10 +464,7 @@ open class KotlinNativeTargetConfigurator(
// endregion.
// region Task creation.
private fun Project.createLinkTask(binary: NativeBinary) {
// TODO: drop compilation.linkAllTaskName
// TODO: drop compilation.binaryTasks
// TODO: Provide a link all task.
private fun Project.createLinkTask(target: KotlinNativeTarget, binary: NativeBinary) {
tasks.create(
binary.linkTaskName,
KotlinNativeLink::class.java
@@ -479,6 +476,8 @@ open class KotlinNativeTargetConfigurator(
enabled = target.konanTarget.enabledOnCurrentHost
destinationDir = binary.outputDirectory
addCompilerPlugins()
tasks.maybeCreate(target.artifactsTaskName).dependsOn(this)
}
}
@@ -531,11 +530,9 @@ open class KotlinNativeTargetConfigurator(
if (compilation.compilationName == KotlinCompilation.MAIN_COMPILATION_NAME) {
project.tasks.getByName(compilation.target.artifactsTaskName).apply {
dependsOn(compileTask)
dependsOn(compilation.linkAllTaskName)
}
project.tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).apply {
dependsOn(compileTask)
dependsOn(compilation.linkAllTaskName)
}
createRegularKlibArtifact(compilation, compileTask)
}
@@ -614,13 +611,20 @@ open class KotlinNativeTargetConfigurator(
protected fun configureBinaries(target: KotlinNativeTarget) {
val project = target.project
target.binaries.all {
project.createLinkTask(it)
project.createLinkTask(target, it)
}
target.binaries.withType(Executable::class.java).all {
project.createRunTask(it)
}
target.binaries.prefixGroups.all { prefixGroup ->
val linkGroupTask = project.tasks.maybeCreate(prefixGroup.linkTaskName)
prefixGroup.binaries.all {
linkGroupTask.dependsOn(it.linkTaskName)
}
}
// Create binaries for output kinds declared using the old DSL.
project.whenEvaluated {
target.compilations.all { compilation ->
@@ -16,14 +16,13 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.io.File
// TODO: Extract API.
// TODO: Should the baseName be a var?
/**
* A base class representing a final binary produced by the Kotlin/Native compiler
* @param name - a name of the DSL entity.
* @param baseName - a base name for the output binary file. E.g. for baseName foo we produce binaries foo.kexe, libfoo.so, foo.framework.
* @param buildType - type of a binary: debug (not optimized, debuggable) or release (optimized, not debuggable)
* @param compilation - a compilation used to produce this binary.
*
*/
@@ -401,14 +401,6 @@ class KotlinNativeCompilation(
override val processResourcesTaskName: String
get() = disambiguateName("processResources")
// TODO: Add linkAll task and add a deprecation here.
val linkAllTaskName: String
get() = lowerCamelCaseName(
"link",
compilationName.takeIf { it != "main" }.orEmpty(),
target.disambiguationClassifier
)
fun linkTaskName(kind: NativeOutputKind, buildType: NativeBuildType): String =
lowerCamelCaseName(
"link",
@@ -208,7 +208,7 @@ class KotlinNativeTarget(
}
override val artifactsTaskName: String
get() = disambiguateName("link")
get() = disambiguateName("binaries")
override val publishable: Boolean
get() = konanTarget.enabledOnCurrentHost