Fixing problem of hanging wait for jps process in idea by using a native-platform lib for platform-specific daemon execution
Adding native-platform uberjar contents to kotlin jps plugin jar
This commit is contained in:
Generated
+1
@@ -22,6 +22,7 @@
|
||||
<element id="module-output" name="kotlinr" />
|
||||
<element id="module-output" name="rmi-interface" />
|
||||
<element id="module-output" name="deserialization" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/dependencies/native-platform-uberjar.jar" path-in-jar="/" />
|
||||
</root>
|
||||
</artifact>
|
||||
</component>
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
<component name="libraryTable">
|
||||
<library name="native-platform-uberjar">
|
||||
<CLASSES>
|
||||
<root url="jar://$PROJECT_DIR$/dependencies/native-platform-uberjar.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
||||
@@ -592,11 +592,13 @@
|
||||
<pathelement path="${bootstrap.runtime}"/>
|
||||
<pathelement path="${bootstrap.reflect}"/>
|
||||
<pathelement path="${kotlin-home}/lib/kotlin-compiler.jar"/>
|
||||
<pathelement path="${dependencies.dir}/native-platform-uberjar.jar"/>
|
||||
</classpath>
|
||||
</kotlinc>
|
||||
|
||||
<jar destfile="${kotlin-home}/lib/kotlinr.jar">
|
||||
<fileset dir="${output}/classes/kotlinr"/>
|
||||
<zipfileset src="${dependencies.dir}/native-platform-uberjar.jar" includes="**" />
|
||||
<zipfileset file="${kotlin-home}/build.txt" prefix="META-INF"/>
|
||||
</jar>
|
||||
</target>
|
||||
|
||||
@@ -11,5 +11,6 @@
|
||||
<orderEntry type="module" module-name="rmi-interface" />
|
||||
<orderEntry type="module" module-name="frontend.java" />
|
||||
<orderEntry type="module" module-name="util" />
|
||||
<orderEntry type="library" name="native-platform-uberjar" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.rmi.kotlinr
|
||||
|
||||
import net.rubygrapefruit.platform.ProcessLauncher
|
||||
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
|
||||
import org.jetbrains.kotlin.progress.CompilationCanceledStatus
|
||||
import org.jetbrains.kotlin.rmi.*
|
||||
@@ -317,31 +318,41 @@ public object KotlinCompilerClient {
|
||||
}
|
||||
// TODO add os detection to specify option more precisely
|
||||
val platformSpecificOptions = listOf("-Djava.awt.headless=true") // hide daemon in OS X
|
||||
val args = listOf(javaExecutable.absolutePath, "-cp", compilerId.compilerClasspath.joinToString(File.pathSeparator)) +
|
||||
val args = listOf(
|
||||
javaExecutable.absolutePath, "-cp", compilerId.compilerClasspath.joinToString(File.pathSeparator)) +
|
||||
platformSpecificOptions +
|
||||
daemonJVMOptions.mappers.flatMap { it.toArgs("-") } +
|
||||
COMPILER_DAEMON_CLASS_FQN +
|
||||
daemonOptions.mappers.flatMap { it.toArgs(COMPILE_DAEMON_CMDLINE_OPTIONS_PREFIX) } +
|
||||
compilerId.mappers.flatMap { it.toArgs(COMPILE_DAEMON_CMDLINE_OPTIONS_PREFIX) }
|
||||
reportingTargets.report(DaemonReportCategory.DEBUG, "starting the daemon as: " + args.joinToString(" "))
|
||||
val processBuilder = ProcessBuilder(args).redirectErrorStream(true)
|
||||
val processBuilder = ProcessBuilder(args)
|
||||
processBuilder.redirectErrorStream(true)
|
||||
// assuming daemon process is deaf and (mostly) silent, so do not handle streams
|
||||
val daemon = processBuilder.start()
|
||||
val daemonLauncher = net.rubygrapefruit.platform.Native.get(ProcessLauncher::class.java)
|
||||
val daemon = daemonLauncher.start(processBuilder)
|
||||
|
||||
var isEchoRead = Semaphore(1)
|
||||
isEchoRead.acquire()
|
||||
|
||||
val stdoutThread =
|
||||
thread {
|
||||
daemon.inputStream
|
||||
.reader()
|
||||
.forEachLine {
|
||||
if (daemonOptions.runFilesPath.isNotEmpty() && it.contains(daemonOptions.runFilesPath)) {
|
||||
isEchoRead.release()
|
||||
return@forEachLine
|
||||
try {
|
||||
daemon.inputStream
|
||||
.reader()
|
||||
.forEachLine {
|
||||
if (daemonOptions.runFilesPath.isNotEmpty() && it.contains(daemonOptions.runFilesPath)) {
|
||||
isEchoRead.release()
|
||||
return@forEachLine
|
||||
}
|
||||
reportingTargets.report(DaemonReportCategory.DEBUG, it, "daemon")
|
||||
}
|
||||
reportingTargets.report(DaemonReportCategory.DEBUG, it, "daemon")
|
||||
}
|
||||
}
|
||||
finally {
|
||||
daemon.inputStream.close()
|
||||
daemon.outputStream.close()
|
||||
daemon.errorStream.close()
|
||||
}
|
||||
}
|
||||
try {
|
||||
// trying to wait for process
|
||||
|
||||
+47
-1
@@ -45,6 +45,10 @@
|
||||
|
||||
<property name="dependencies.info.file" value="dependencies/dependencies.properties"/>
|
||||
|
||||
<property name="gradle.libs.repo" value="http://repo.gradle.org/gradle/libs-releases-local"/>
|
||||
|
||||
<property name="native-platform-lib-version" value="0.10"/>
|
||||
|
||||
<property file="${dependencies.info.file}" prefix="dependencies.info.prev"/>
|
||||
|
||||
<target name="update" depends="fetch-third-party,fetch-annotations" description="Update dependencies">
|
||||
@@ -118,8 +122,50 @@
|
||||
<move file="dependencies/apache-ant-@{version}" tofile="dependencies/@{folderName}"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
|
||||
<target name="make-native-platform-uberjar" depends="override-version">
|
||||
<property name="dependencies" value="dependencies"/>
|
||||
<property name="download" value="${dependencies}/download"/>
|
||||
<property name="server" value="${gradle.libs.repo}"/>
|
||||
<property name="version" value="${native-platform-lib-version}"/>
|
||||
<property name="common.name" value="native-platform"/>
|
||||
<property name="common.prefix" value="${server}/net/rubygrapefruit/${common.name}"/>
|
||||
|
||||
<macrodef name="get-lib">
|
||||
<attribute name="suffix"/>
|
||||
<sequential>
|
||||
<get src="${common.prefix}@{suffix}/${version}/${common.name}@{suffix}-${version}.jar" dest="${download}/${common.name}@{suffix}.jar" usetimestamp="true"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
|
||||
<target name="fetch-third-party" depends="override-version">
|
||||
<mkdir dir="${dependencies}"/>
|
||||
<mkdir dir="${download}"/>
|
||||
|
||||
<get-lib suffix=""/>
|
||||
<get-lib suffix="-windows-amd64"/>
|
||||
<get-lib suffix="-windows-i386"/>
|
||||
<get-lib suffix="-osx-amd64"/>
|
||||
<get-lib suffix="-osx-i386"/>
|
||||
<get-lib suffix="-linux-amd64"/>
|
||||
<get-lib suffix="-linux-i386"/>
|
||||
<get-lib suffix="-freebsd-amd64"/>
|
||||
<get-lib suffix="-freebsd-i386"/>
|
||||
|
||||
<jar destfile="${dependencies}/${common.name}-uberjar.jar">
|
||||
<zipfileset src="${download}/${common.name}.jar" includes="**" />
|
||||
<zipfileset src="${download}/${common.name}-windows-amd64.jar" includes="**" />
|
||||
<zipfileset src="${download}/${common.name}-windows-i386.jar" includes="**" />
|
||||
<zipfileset src="${download}/${common.name}-osx-amd64.jar" includes="**" />
|
||||
<zipfileset src="${download}/${common.name}-osx-i386.jar" includes="**" />
|
||||
<zipfileset src="${download}/${common.name}-linux-amd64.jar" includes="**" />
|
||||
<zipfileset src="${download}/${common.name}-linux-i386.jar" includes="**" />
|
||||
<zipfileset src="${download}/${common.name}-freebsd-amd64.jar" includes="**" />
|
||||
<zipfileset src="${download}/${common.name}-freebsd-i386.jar" includes="**" />
|
||||
</jar>
|
||||
|
||||
</target>
|
||||
|
||||
<target name="fetch-third-party" depends="override-version,make-native-platform-uberjar">
|
||||
<mkdir dir="dependencies"/>
|
||||
<mkdir dir="dependencies/download"/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user