diff --git a/platformLibs/build.gradle b/platformLibs/build.gradle index 381fdb52076..bbe5070a3c1 100644 --- a/platformLibs/build.gradle +++ b/platformLibs/build.gradle @@ -71,6 +71,7 @@ project.rootProject.ext.platformManager.enabled.each { target -> def libTask = konanArtifacts."$libName"."$targetName" libTask.dependsOn df.config.depends.collect{ defFileToLibName(targetName, it) } libTask.dependsOn ":${targetName}CrossDist" + libTask.enableParallel = true task "$libName"(type: KlibInstall) { klib = libTask.artifact diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanBuildingTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanBuildingTask.kt index f4098842b70..ead0f233cbf 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanBuildingTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanBuildingTask.kt @@ -47,7 +47,7 @@ abstract class KonanBuildingTask: KonanArtifactWithLibrariesTask(), KonanBuildin protected abstract fun buildArgs(): List @TaskAction - fun run() { + open fun run() { destinationDir.mkdirs() if (dumpParameters) { dumpProperties(this) } toolRunner.run(buildArgs()) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanInteropTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanInteropTask.kt index e891c52d830..8d8484a1ce2 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanInteropTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanInteropTask.kt @@ -18,9 +18,13 @@ package org.jetbrains.kotlin.gradle.plugin.tasks import groovy.lang.Closure import org.gradle.api.Action +import org.gradle.api.Project import org.gradle.api.file.FileCollection +import org.gradle.api.invocation.Gradle import org.gradle.api.tasks.* import org.gradle.util.ConfigureUtil +import org.gradle.workers.IsolationMode +import org.gradle.workers.WorkerExecutor import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.KonanInteropSpec.IncludeDirectoriesSpec import org.jetbrains.kotlin.gradle.plugin.model.KonanModelArtifact @@ -30,11 +34,14 @@ import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.Distribution import org.jetbrains.kotlin.konan.target.KonanTarget import java.io.File +import java.util.concurrent.ConcurrentHashMap +import javax.inject.Inject /** * A task executing cinterop tool with the given args and compiling the stubs produced by this tool. */ -open class KonanInteropTask: KonanBuildingTask(), KonanInteropSpec { + +open class KonanInteropTask @Inject constructor(val workerExecutor: WorkerExecutor) : KonanBuildingTask(), KonanInteropSpec { @Internal override val toolRunner: KonanToolRunner = KonanInteropRunner(project, project.konanExtension.jvmArgs) @@ -53,6 +60,8 @@ open class KonanInteropTask: KonanBuildingTask(), KonanInteropSpec { // Interop stub generator parameters ------------------------------------- + @Internal var enableParallel: Boolean = false + @InputFile lateinit var defFile: File @Optional @Input var packageName: String? = null @@ -179,5 +188,33 @@ open class KonanInteropTask: KonanBuildingTask(), KonanInteropSpec { ) } // endregion + + internal class RunTool @Inject constructor( + val taskName: String, + val args: List + ) : Runnable { + + + override fun run() { + val toolRunner = interchangeBox.remove(taskName) ?: error(":(") + toolRunner.run(args) + } + } + + override fun run() { + destinationDir.mkdirs() + if (dumpParameters) { dumpProperties(this) } + val args = buildArgs() + if (enableParallel) { + interchangeBox[this.path] = toolRunner + workerExecutor.submit(RunTool::class.java) { + it.isolationMode = IsolationMode.NONE + it.params(this.path, args) + } + } else { + toolRunner.run(args) + } + } } +internal val interchangeBox = ConcurrentHashMap() \ No newline at end of file