Implement CopyCommonizeCInteropForIdeTask to survive build folder cleaning

This commit is contained in:
sebastian.sellmair
2021-03-10 16:56:08 +01:00
committed by Space
parent a53df56781
commit 261934d881
6 changed files with 121 additions and 34 deletions
@@ -61,7 +61,7 @@ class CInteropCommonizerTaskTest {
CInteropCommonizationParameters(
CommonizerTarget(LINUX_X64, MACOS_X64), setOf(linuxInterop.identifier, macosInterop.identifier)
),
task.findSupportingCommonizationParameters(nativeMainCompilation)
task.getCommonizationParameters(nativeMainCompilation)
)
}
@@ -85,7 +85,7 @@ class CInteropCommonizerTaskTest {
.single { it.defaultSourceSet == nativeMain }
assertNull(
task.findSupportingCommonizationParameters(nativeMainCompilation),
task.getCommonizationParameters(nativeMainCompilation),
"Expected no CInteropCommonizerTarget from nativeMain, since one target has not defined any cinterop"
)
}
@@ -119,19 +119,19 @@ class CInteropCommonizerTaskTest {
CInteropCommonizationParameters(
SharedCommonizerTarget(CommonizerTarget(IOS_X64, IOS_ARM64), CommonizerTarget(MACOS_X64), CommonizerTarget(LINUX_X64)),
setOf(linuxInterop, macosInterop, iosX64Interop, iosArm64Interop)
), task.findSupportingCommonizationParameters(sharedNativeCompilation(nativeMain))
), task.getCommonizationParameters(sharedNativeCompilation(nativeMain))
)
assertEquals(
CInteropCommonizationParameters(
SharedCommonizerTarget(CommonizerTarget(IOS_X64, IOS_ARM64), CommonizerTarget(MACOS_X64), CommonizerTarget(LINUX_X64)),
setOf(linuxInterop, macosInterop, iosX64Interop, iosArm64Interop)
), task.findSupportingCommonizationParameters(sharedNativeCompilation(iosMain))
), task.getCommonizationParameters(sharedNativeCompilation(iosMain))
)
assertTrue(
task.findSupportingCommonizationParameters(sharedNativeCompilation(iosMain))!! in
task.findSupportingCommonizationParameters(sharedNativeCompilation(nativeMain))!!,
task.getCommonizationParameters(sharedNativeCompilation(iosMain))!! in
task.getCommonizationParameters(sharedNativeCompilation(nativeMain))!!,
"Expected CInteropCommonizerTarget of iosMain to be fully contained in nativeMain"
)
}
@@ -24,6 +24,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.CompilationSourceSetUtil.compilati
import org.jetbrains.kotlin.gradle.plugin.sources.*
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.targets.native.internal.commonizeCInteropTask
import org.jetbrains.kotlin.gradle.targets.native.internal.copyCommonizeCInteropForIdeTask
import org.jetbrains.kotlin.gradle.targets.native.internal.getLibraries
import org.jetbrains.kotlin.gradle.tasks.*
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
@@ -322,11 +324,13 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
}
if (this is KotlinSharedNativeCompilation) {
project.commonizeCInteropTask?.let { commonizeCInteropTask ->
val commonizerOutput = project.files(commonizeCInteropTask.map { it.getLibraries(this) })
compileDependencyFiles = compileDependencyFiles.plus(commonizerOutput)
project.commonizeCInteropTask?.let { task ->
compileDependencyFiles = compileDependencyFiles.plus(task.getLibraries(this))
}
project.copyCommonizeCInteropForIdeTask?.let { task ->
val libraries = task.getLibraries(this)
kotlinSourceSetsIncludingDefault.forEach { sourceSet ->
project.dependencies.add(sourceSet.implementationMetadataConfigurationName, commonizerOutput)
project.dependencies.add(sourceSet.implementationMetadataConfigurationName, libraries)
}
}
}
@@ -0,0 +1,44 @@
/*
* 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.internal
import org.gradle.api.DefaultTask
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.descriptors.commonizer.HierarchicalCommonizerOutputLayout
import org.jetbrains.kotlin.descriptors.commonizer.prettyName
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation
import java.io.File
internal abstract class AbstractCInteropCommonizerTask : DefaultTask() {
@get:OutputDirectory
abstract val outputDirectory: File
internal fun outputDirectory(parameters: CInteropCommonizationParameters): File {
return outputDirectory
.resolve(parameters.commonizerTarget.prettyName)
.resolve(parameters.interops.map { it.interopName }.distinct().joinToString("-"))
}
internal abstract fun getCommonizationParameters(compilation: KotlinSharedNativeCompilation): CInteropCommonizationParameters?
internal fun getLibraries(compilation: KotlinSharedNativeCompilation): FileCollection {
val fileProvider = project.provider<Set<File>> {
val parameters = getCommonizationParameters(compilation) ?: return@provider emptySet()
HierarchicalCommonizerOutputLayout.getTargetDirectory(outputDirectory(parameters), parameters.commonizerTarget)
.listFiles().orEmpty().toSet()
}
return project.files(fileProvider) { fileCollection ->
fileCollection.builtBy(this)
}
}
}
internal fun TaskProvider<out AbstractCInteropCommonizerTask>.getLibraries(compilation: KotlinSharedNativeCompilation): FileCollection {
return compilation.target.project.files(map { it.getLibraries(compilation) })
}
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.gradle.api.provider.Provider
@@ -14,9 +13,7 @@ import org.gradle.workers.WorkParameters
import org.jetbrains.kotlin.compilerRunner.GradleCliCommonizer
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerTarget
import org.jetbrains.kotlin.descriptors.commonizer.HierarchicalCommonizerOutputLayout
import org.jetbrains.kotlin.descriptors.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.descriptors.commonizer.prettyName
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.CInteropSettings
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
@@ -31,7 +28,7 @@ import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
import org.jetbrains.kotlin.konan.target.KonanTarget
import java.io.File
internal open class CInteropCommonizerTask : DefaultTask() {
internal open class CInteropCommonizerTask : AbstractCInteropCommonizerTask() {
internal data class CInteropGist(
@get:Input val identifier: CInteropIdentifier,
@@ -45,6 +42,8 @@ internal open class CInteropCommonizerTask : DefaultTask() {
val allSourceSetNames: Provider<List<String>> = sourceSets.map { it.resolveAllDependsOnSourceSets().map(Any::toString) }
}
override val outputDirectory: File = project.buildDir.resolve("classes/kotlin/commonizer")
@get:Nested
internal var cinterops = setOf<CInteropGist>()
private set
@@ -98,25 +97,6 @@ internal open class CInteropCommonizerTask : DefaultTask() {
)
}
private fun outputDirectory(parameters: CInteropCommonizationParameters): File {
return project.buildDir.resolve("classes/kotlin/commonizer")
.resolve(parameters.commonizerTarget.prettyName)
.resolve(parameters.interops.map { it.interopName }.distinct().joinToString("-"))
}
internal fun getLibraries(compilation: KotlinSharedNativeCompilation): FileCollection {
val fileProvider = project.provider<Set<File>> {
val parameters = findSupportingCommonizationParameters(compilation) ?: return@provider emptySet()
HierarchicalCommonizerOutputLayout
.getTargetDirectory(outputDirectory(parameters), parameters.commonizerTarget)
.listFiles().orEmpty().toSet()
}
return project.files(fileProvider) { fileCollection ->
fileCollection.builtBy(this)
}
}
@Nested
internal fun getCommonizationParameters(): Set<CInteropCommonizationParameters> {
val sharedNativeCompilations = (project.multiplatformExtensionOrNull ?: return emptySet())
@@ -140,7 +120,7 @@ internal open class CInteropCommonizerTask : DefaultTask() {
.run(::removeRedundantParameters)
}
internal fun findSupportingCommonizationParameters(compilation: KotlinSharedNativeCompilation): CInteropCommonizationParameters? {
override fun getCommonizationParameters(compilation: KotlinSharedNativeCompilation): CInteropCommonizationParameters? {
val supportedParameters = getCommonizationParameters().filter { parameters -> parameters.supports(compilation) }
if (supportedParameters.isEmpty()) return null
assert(supportedParameters.size == 1) {
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.internal.isInIdeaSync
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.locateTask
@@ -55,6 +56,22 @@ internal val Project.commonizeCInteropTask: TaskProvider<CInteropCommonizerTask>
return null
}
internal val Project.copyCommonizeCInteropForIdeTask: TaskProvider<CopyCommonizeCInteropForIdeTask>?
get() {
if (isCInteropCommonizationEnabled) {
return locateOrRegisterTask(
"copyCommonizeCInteropForIde",
invokeWhenRegistered = { if (isInIdeaSync) commonizeTask.dependsOn(this) },
configureTask = {
group = "interop"
description = "Copies the output of ${commonizeCInteropTask?.get()?.name} into " +
"the root projects .gradle folder for the IDE"
}
)
}
return null
}
internal val Project.commonizeNativeDistributionTask: TaskProvider<NativeDistributionCommonizerTask>
get() = locateOrRegisterTask(
"commonizeNativeDistribution",
@@ -0,0 +1,42 @@
/*
* 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.internal
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinSharedNativeCompilation
import java.io.File
internal open class CopyCommonizeCInteropForIdeTask : AbstractCInteropCommonizerTask() {
private val commonizeCInteropTask: TaskProvider<CInteropCommonizerTask>
get() = project.commonizeCInteropTask ?: throw IllegalStateException("Missing commonizeCInteropTask")
@get:InputFiles
@get:PathSensitive(PathSensitivity.ABSOLUTE)
val cInteropCommonizerTaskOutputDirectories: Provider<Set<File>> =
commonizeCInteropTask.map { it.getAllOutputDirectories() }
@get:OutputDirectory
override val outputDirectory: File = project.rootDir.resolve(".gradle/kotlin/commonizer")
.resolve(project.path.removePrefix(":").replace(":", "/"))
override fun getCommonizationParameters(compilation: KotlinSharedNativeCompilation): CInteropCommonizationParameters? {
return commonizeCInteropTask.get().getCommonizationParameters(compilation)
}
@TaskAction
protected fun copy() {
outputDirectory.mkdirs()
for (parameters in commonizeCInteropTask.get().getCommonizationParameters()) {
val source = commonizeCInteropTask.get().outputDirectory(parameters)
if (!source.exists()) continue
val target = outputDirectory(parameters)
if (target.exists()) target.deleteRecursively()
source.copyRecursively(target, true)
}
}
}