Compile multiplatform projects with daemon
This commit is contained in:
+2
@@ -47,6 +47,7 @@ interface KotlinLogger {
|
|||||||
abstract class KotlinCompilerRunner<in Env : CompilerEnvironment> {
|
abstract class KotlinCompilerRunner<in Env : CompilerEnvironment> {
|
||||||
protected val K2JVM_COMPILER = "org.jetbrains.kotlin.cli.jvm.K2JVMCompiler"
|
protected val K2JVM_COMPILER = "org.jetbrains.kotlin.cli.jvm.K2JVMCompiler"
|
||||||
protected val K2JS_COMPILER = "org.jetbrains.kotlin.cli.js.K2JSCompiler"
|
protected val K2JS_COMPILER = "org.jetbrains.kotlin.cli.js.K2JSCompiler"
|
||||||
|
protected val K2METADATA_COMPILER = "org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler"
|
||||||
protected val INTERNAL_ERROR = ExitCode.INTERNAL_ERROR.toString()
|
protected val INTERNAL_ERROR = ExitCode.INTERNAL_ERROR.toString()
|
||||||
|
|
||||||
protected abstract val log: KotlinLogger
|
protected abstract val log: KotlinLogger
|
||||||
@@ -148,6 +149,7 @@ abstract class KotlinCompilerRunner<in Env : CompilerEnvironment> {
|
|||||||
val targetPlatform = when (compilerClassName) {
|
val targetPlatform = when (compilerClassName) {
|
||||||
K2JVM_COMPILER -> CompileService.TargetPlatform.JVM
|
K2JVM_COMPILER -> CompileService.TargetPlatform.JVM
|
||||||
K2JS_COMPILER -> CompileService.TargetPlatform.JS
|
K2JS_COMPILER -> CompileService.TargetPlatform.JS
|
||||||
|
K2METADATA_COMPILER -> CompileService.TargetPlatform.METADATA
|
||||||
else -> throw IllegalArgumentException("Unknown compiler type $compilerClassName")
|
else -> throw IllegalArgumentException("Unknown compiler type $compilerClassName")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -31,7 +31,8 @@ interface CompileService : Remote {
|
|||||||
|
|
||||||
enum class TargetPlatform : Serializable {
|
enum class TargetPlatform : Serializable {
|
||||||
JVM,
|
JVM,
|
||||||
JS
|
JS,
|
||||||
|
METADATA
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.daemon
|
|||||||
import org.jetbrains.kotlin.cli.common.CLICompiler
|
import org.jetbrains.kotlin.cli.common.CLICompiler
|
||||||
import org.jetbrains.kotlin.cli.js.K2JSCompiler
|
import org.jetbrains.kotlin.cli.js.K2JSCompiler
|
||||||
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
|
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
|
||||||
|
import org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler
|
||||||
import org.jetbrains.kotlin.daemon.common.*
|
import org.jetbrains.kotlin.daemon.common.*
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
@@ -125,9 +126,11 @@ object KotlinCompileDaemon {
|
|||||||
val compilerSelector = object : CompilerSelector {
|
val compilerSelector = object : CompilerSelector {
|
||||||
private val jvm by lazy { K2JVMCompiler() }
|
private val jvm by lazy { K2JVMCompiler() }
|
||||||
private val js by lazy { K2JSCompiler() }
|
private val js by lazy { K2JSCompiler() }
|
||||||
|
private val metadata by lazy { K2MetadataCompiler() }
|
||||||
override fun get(targetPlatform: CompileService.TargetPlatform): CLICompiler<*> = when (targetPlatform) {
|
override fun get(targetPlatform: CompileService.TargetPlatform): CLICompiler<*> = when (targetPlatform) {
|
||||||
CompileService.TargetPlatform.JVM -> jvm
|
CompileService.TargetPlatform.JVM -> jvm
|
||||||
CompileService.TargetPlatform.JS -> js
|
CompileService.TargetPlatform.JS -> js
|
||||||
|
CompileService.TargetPlatform.METADATA -> metadata
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// timer with a daemon thread, meaning it should not prevent JVM to exit normally
|
// timer with a daemon thread, meaning it should not prevent JVM to exit normally
|
||||||
|
|||||||
+10
-5
@@ -22,22 +22,18 @@ import org.gradle.api.Project
|
|||||||
import org.jetbrains.kotlin.cli.common.ExitCode
|
import org.jetbrains.kotlin.cli.common.ExitCode
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
|
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
|
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
|
||||||
|
import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
|
||||||
import org.jetbrains.kotlin.config.Services
|
import org.jetbrains.kotlin.config.Services
|
||||||
import org.jetbrains.kotlin.daemon.client.RemoteOutputStreamServer
|
import org.jetbrains.kotlin.daemon.client.RemoteOutputStreamServer
|
||||||
import org.jetbrains.kotlin.daemon.common.IncrementalCompilationServicesFacade
|
|
||||||
import org.jetbrains.kotlin.daemon.common.LoopbackNetworkInterface
|
|
||||||
import org.jetbrains.kotlin.daemon.common.SOCKET_ANY_FREE_PORT
|
import org.jetbrains.kotlin.daemon.common.SOCKET_ANY_FREE_PORT
|
||||||
import org.jetbrains.kotlin.gradle.plugin.ParentLastURLClassLoader
|
import org.jetbrains.kotlin.gradle.plugin.ParentLastURLClassLoader
|
||||||
import org.jetbrains.kotlin.gradle.plugin.kotlinDebug
|
import org.jetbrains.kotlin.gradle.plugin.kotlinDebug
|
||||||
import org.jetbrains.kotlin.incremental.ChangedFiles
|
|
||||||
import org.jetbrains.kotlin.incremental.classpathAsList
|
import org.jetbrains.kotlin.incremental.classpathAsList
|
||||||
import org.jetbrains.kotlin.incremental.destinationAsFile
|
import org.jetbrains.kotlin.incremental.destinationAsFile
|
||||||
import org.jetbrains.kotlin.incremental.makeModuleFile
|
import org.jetbrains.kotlin.incremental.makeModuleFile
|
||||||
import java.io.*
|
import java.io.*
|
||||||
import java.rmi.server.UnicastRemoteObject
|
|
||||||
import kotlin.concurrent.thread
|
import kotlin.concurrent.thread
|
||||||
|
|
||||||
internal const val KOTLIN_COMPILER_EXECUTION_STRATEGY_PROPERTY = "kotlin.compiler.execution.strategy"
|
internal const val KOTLIN_COMPILER_EXECUTION_STRATEGY_PROPERTY = "kotlin.compiler.execution.strategy"
|
||||||
@@ -101,6 +97,15 @@ internal class GradleCompilerRunner(private val project: Project) : KotlinCompil
|
|||||||
return runCompiler(K2JS_COMPILER, args, additionalArguments, environment)
|
return runCompiler(K2JS_COMPILER, args, additionalArguments, environment)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun runMetadataCompiler(
|
||||||
|
kotlinSources: List<File>,
|
||||||
|
args: K2MetadataCompilerArguments,
|
||||||
|
environment: GradleCompilerEnvironment
|
||||||
|
): ExitCode {
|
||||||
|
val additionalArguments = kotlinSources.joinToString(separator = " ") { it.absolutePath }
|
||||||
|
return runCompiler(K2METADATA_COMPILER, args, additionalArguments, environment)
|
||||||
|
}
|
||||||
|
|
||||||
override fun doRunCompiler(compilerClassName: String, argsArray: Array<String>, environment: GradleCompilerEnvironment): ExitCode {
|
override fun doRunCompiler(compilerClassName: String, argsArray: Array<String>, environment: GradleCompilerEnvironment): ExitCode {
|
||||||
with (project.logger) {
|
with (project.logger) {
|
||||||
kotlinDebug { "Kotlin compiler class: $compilerClassName" }
|
kotlinDebug { "Kotlin compiler class: $compilerClassName" }
|
||||||
|
|||||||
+12
-6
@@ -16,22 +16,25 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.tasks
|
package org.jetbrains.kotlin.gradle.tasks
|
||||||
|
|
||||||
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.tasks.compile.AbstractCompile
|
import org.gradle.api.tasks.compile.AbstractCompile
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments
|
import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments
|
||||||
import org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler
|
import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment
|
||||||
import org.jetbrains.kotlin.config.Services
|
import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner
|
||||||
|
import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl
|
||||||
import org.jetbrains.kotlin.incremental.ChangedFiles
|
import org.jetbrains.kotlin.incremental.ChangedFiles
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
internal open class KotlinCompileCommon : AbstractKotlinCompile<K2MetadataCompilerArguments>() {
|
internal open class KotlinCompileCommon : AbstractKotlinCompile<K2MetadataCompilerArguments>() {
|
||||||
override val compiler = K2MetadataCompiler()
|
|
||||||
|
|
||||||
override fun populateCompilerArguments(): K2MetadataCompilerArguments =
|
override fun populateCompilerArguments(): K2MetadataCompilerArguments =
|
||||||
K2MetadataCompilerArguments()
|
K2MetadataCompilerArguments()
|
||||||
|
|
||||||
override fun getSourceRoots(): SourceRoots =
|
override fun getSourceRoots(): SourceRoots =
|
||||||
SourceRoots.KotlinOnly.create(getSource())
|
SourceRoots.KotlinOnly.create(getSource())
|
||||||
|
|
||||||
|
override fun findKotlinCompilerJar(project: Project): File? =
|
||||||
|
findKotlinMetadataCompilerJar(project)
|
||||||
|
|
||||||
override fun callCompiler(args: K2MetadataCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) {
|
override fun callCompiler(args: K2MetadataCompilerArguments, sourceRoots: SourceRoots, changedFiles: ChangedFiles) {
|
||||||
val classpathList = classpath.files.toMutableList()
|
val classpathList = classpath.files.toMutableList()
|
||||||
val friendTask = friendTaskName?.let { project.tasks.findByName(it) } as? AbstractCompile
|
val friendTask = friendTaskName?.let { project.tasks.findByName(it) } as? AbstractCompile
|
||||||
@@ -43,8 +46,11 @@ internal open class KotlinCompileCommon : AbstractKotlinCompile<K2MetadataCompil
|
|||||||
freeArgs = sourceRoots.kotlinSourceFiles.map { it.canonicalPath }
|
freeArgs = sourceRoots.kotlinSourceFiles.map { it.canonicalPath }
|
||||||
}
|
}
|
||||||
|
|
||||||
val messageCollector = GradleMessageCollector(project.logger)
|
val messageCollector = GradleMessageCollector(logger)
|
||||||
val exitCode = compiler.exec(messageCollector, Services.EMPTY, args)
|
val outputItemCollector = OutputItemsCollectorImpl()
|
||||||
|
val compilerRunner = GradleCompilerRunner(project)
|
||||||
|
val environment = GradleCompilerEnvironment(compilerJar, messageCollector, outputItemCollector)
|
||||||
|
val exitCode = compilerRunner.runMetadataCompiler(sourceRoots.kotlinSourceFiles, args, environment)
|
||||||
throwGradleExceptionIfError(exitCode)
|
throwGradleExceptionIfError(exitCode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-13
@@ -58,7 +58,6 @@ const val KOTLIN_BUILD_DIR_NAME = "kotlin"
|
|||||||
const val USING_EXPERIMENTAL_INCREMENTAL_MESSAGE = "Using experimental kotlin incremental compilation"
|
const val USING_EXPERIMENTAL_INCREMENTAL_MESSAGE = "Using experimental kotlin incremental compilation"
|
||||||
|
|
||||||
abstract class AbstractKotlinCompile<T : CommonCompilerArguments>() : AbstractCompile() {
|
abstract class AbstractKotlinCompile<T : CommonCompilerArguments>() : AbstractCompile() {
|
||||||
abstract protected val compiler: CLICompiler<T>
|
|
||||||
abstract protected fun populateCompilerArguments(): T
|
abstract protected fun populateCompilerArguments(): T
|
||||||
|
|
||||||
// indicates that task should compile kotlin incrementally if possible
|
// indicates that task should compile kotlin incrementally if possible
|
||||||
@@ -130,8 +129,6 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments>() : AbstractCo
|
|||||||
}
|
}
|
||||||
|
|
||||||
open class KotlinCompile : AbstractKotlinCompile<K2JVMCompilerArguments>(), KotlinJvmCompile {
|
open class KotlinCompile : AbstractKotlinCompile<K2JVMCompilerArguments>(), KotlinJvmCompile {
|
||||||
override val compiler = K2JVMCompiler()
|
|
||||||
|
|
||||||
internal var parentKotlinOptionsImpl: KotlinJvmOptionsImpl? = null
|
internal var parentKotlinOptionsImpl: KotlinJvmOptionsImpl? = null
|
||||||
private val kotlinOptionsImpl = KotlinJvmOptionsImpl()
|
private val kotlinOptionsImpl = KotlinJvmOptionsImpl()
|
||||||
override val kotlinOptions: KotlinJvmOptions
|
override val kotlinOptions: KotlinJvmOptions
|
||||||
@@ -317,7 +314,6 @@ internal fun compileJvmNotIncrementally(
|
|||||||
}
|
}
|
||||||
|
|
||||||
open class Kotlin2JsCompile() : AbstractKotlinCompile<K2JSCompilerArguments>(), KotlinJsCompile {
|
open class Kotlin2JsCompile() : AbstractKotlinCompile<K2JSCompilerArguments>(), KotlinJsCompile {
|
||||||
override val compiler = K2JSCompiler()
|
|
||||||
private val kotlinOptionsImpl = KotlinJsOptionsImpl()
|
private val kotlinOptionsImpl = KotlinJsOptionsImpl()
|
||||||
override val kotlinOptions: KotlinJsOptions
|
override val kotlinOptions: KotlinJsOptions
|
||||||
get() = kotlinOptionsImpl
|
get() = kotlinOptionsImpl
|
||||||
@@ -378,15 +374,7 @@ open class Kotlin2JsCompile() : AbstractKotlinCompile<K2JSCompilerArguments>(),
|
|||||||
val compilerRunner = GradleCompilerRunner(project)
|
val compilerRunner = GradleCompilerRunner(project)
|
||||||
val environment = GradleCompilerEnvironment(compilerJar, messageCollector, outputItemCollector)
|
val environment = GradleCompilerEnvironment(compilerJar, messageCollector, outputItemCollector)
|
||||||
val exitCode = compilerRunner.runJsCompiler(sourceRoots.kotlinSourceFiles, args, environment)
|
val exitCode = compilerRunner.runJsCompiler(sourceRoots.kotlinSourceFiles, args, environment)
|
||||||
|
throwGradleExceptionIfError(exitCode)
|
||||||
when (exitCode) {
|
|
||||||
ExitCode.OK -> {
|
|
||||||
logger.kotlinInfo("Compilation succeeded")
|
|
||||||
}
|
|
||||||
ExitCode.COMPILATION_ERROR -> throw GradleException("Compilation error. See log for more details")
|
|
||||||
ExitCode.INTERNAL_ERROR -> throw GradleException("Internal compiler error. See log for more details")
|
|
||||||
else -> throw GradleException("Unexpected exit code: $exitCode")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
@@ -22,6 +22,7 @@ import java.util.zip.ZipFile
|
|||||||
|
|
||||||
private val K2JVM_COMPILER_CLASS = "org.jetbrains.kotlin.cli.jvm.K2JVMCompiler"
|
private val K2JVM_COMPILER_CLASS = "org.jetbrains.kotlin.cli.jvm.K2JVMCompiler"
|
||||||
private val K2JS_COMPILER_CLASS = "org.jetbrains.kotlin.cli.js.K2JSCompiler"
|
private val K2JS_COMPILER_CLASS = "org.jetbrains.kotlin.cli.js.K2JSCompiler"
|
||||||
|
private val K2METADATA_COMPILER_CLASS = "org.jetbrains.kotlin.cli.metadata.K2MetadataCompiler"
|
||||||
|
|
||||||
internal fun findKotlinJvmCompilerJar(project: Project): File? =
|
internal fun findKotlinJvmCompilerJar(project: Project): File? =
|
||||||
findKotlinCompilerJar(project, K2JVM_COMPILER_CLASS)
|
findKotlinCompilerJar(project, K2JVM_COMPILER_CLASS)
|
||||||
@@ -29,6 +30,9 @@ internal fun findKotlinJvmCompilerJar(project: Project): File? =
|
|||||||
internal fun findKotlinJsCompilerJar(project: Project): File? =
|
internal fun findKotlinJsCompilerJar(project: Project): File? =
|
||||||
findKotlinCompilerJar(project, K2JS_COMPILER_CLASS)
|
findKotlinCompilerJar(project, K2JS_COMPILER_CLASS)
|
||||||
|
|
||||||
|
internal fun findKotlinMetadataCompilerJar(project: Project): File? =
|
||||||
|
findKotlinCompilerJar(project, K2METADATA_COMPILER_CLASS)
|
||||||
|
|
||||||
private fun findKotlinCompilerJar(project: Project, compilerClassName: String): File? {
|
private fun findKotlinCompilerJar(project: Project, compilerClassName: String): File? {
|
||||||
fun Project.classpathJars(): Sequence<File> =
|
fun Project.classpathJars(): Sequence<File> =
|
||||||
buildscript.configurations.findByName("classpath")?.files?.asSequence() ?: emptySequence()
|
buildscript.configurations.findByName("classpath")?.files?.asSequence() ?: emptySequence()
|
||||||
|
|||||||
Reference in New Issue
Block a user