diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinNativeBinaryContainer.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinNativeBinaryContainer.kt index 87f29cfad6e..582abc9b4a2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinNativeBinaryContainer.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinNativeBinaryContainer.kt @@ -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() + internal val prefixGroups: NamedDomainObjectSet = 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, 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 = WrapUtil.toDomainObjectSet(NativeBinary::class.java) + + val linkTaskName: String + get() = lowerCamelCaseName("link", name, target.targetName) + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index b77b3130716..c1d19444eaf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -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 -> diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaries.kt index 6ec3e5871db..6974f47805f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaries.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/NativeBinaries.kt @@ -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. * */ diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt index 38a5cb35e55..0c155d29a60 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt @@ -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", diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt index 80425b5e3ed..412d796d849 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargets.kt @@ -208,7 +208,7 @@ class KotlinNativeTarget( } override val artifactsTaskName: String - get() = disambiguateName("link") + get() = disambiguateName("binaries") override val publishable: Boolean get() = konanTarget.enabledOnCurrentHost