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="kotlinr" />
|
||||||
<element id="module-output" name="rmi-interface" />
|
<element id="module-output" name="rmi-interface" />
|
||||||
<element id="module-output" name="deserialization" />
|
<element id="module-output" name="deserialization" />
|
||||||
|
<element id="extracted-dir" path="$PROJECT_DIR$/dependencies/native-platform-uberjar.jar" path-in-jar="/" />
|
||||||
</root>
|
</root>
|
||||||
</artifact>
|
</artifact>
|
||||||
</component>
|
</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.runtime}"/>
|
||||||
<pathelement path="${bootstrap.reflect}"/>
|
<pathelement path="${bootstrap.reflect}"/>
|
||||||
<pathelement path="${kotlin-home}/lib/kotlin-compiler.jar"/>
|
<pathelement path="${kotlin-home}/lib/kotlin-compiler.jar"/>
|
||||||
|
<pathelement path="${dependencies.dir}/native-platform-uberjar.jar"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
</kotlinc>
|
</kotlinc>
|
||||||
|
|
||||||
<jar destfile="${kotlin-home}/lib/kotlinr.jar">
|
<jar destfile="${kotlin-home}/lib/kotlinr.jar">
|
||||||
<fileset dir="${output}/classes/kotlinr"/>
|
<fileset dir="${output}/classes/kotlinr"/>
|
||||||
|
<zipfileset src="${dependencies.dir}/native-platform-uberjar.jar" includes="**" />
|
||||||
<zipfileset file="${kotlin-home}/build.txt" prefix="META-INF"/>
|
<zipfileset file="${kotlin-home}/build.txt" prefix="META-INF"/>
|
||||||
</jar>
|
</jar>
|
||||||
</target>
|
</target>
|
||||||
|
|||||||
@@ -11,5 +11,6 @@
|
|||||||
<orderEntry type="module" module-name="rmi-interface" />
|
<orderEntry type="module" module-name="rmi-interface" />
|
||||||
<orderEntry type="module" module-name="frontend.java" />
|
<orderEntry type="module" module-name="frontend.java" />
|
||||||
<orderEntry type="module" module-name="util" />
|
<orderEntry type="module" module-name="util" />
|
||||||
|
<orderEntry type="library" name="native-platform-uberjar" level="project" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.rmi.kotlinr
|
package org.jetbrains.kotlin.rmi.kotlinr
|
||||||
|
|
||||||
|
import net.rubygrapefruit.platform.ProcessLauncher
|
||||||
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
|
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
|
||||||
import org.jetbrains.kotlin.progress.CompilationCanceledStatus
|
import org.jetbrains.kotlin.progress.CompilationCanceledStatus
|
||||||
import org.jetbrains.kotlin.rmi.*
|
import org.jetbrains.kotlin.rmi.*
|
||||||
@@ -317,31 +318,41 @@ public object KotlinCompilerClient {
|
|||||||
}
|
}
|
||||||
// TODO add os detection to specify option more precisely
|
// TODO add os detection to specify option more precisely
|
||||||
val platformSpecificOptions = listOf("-Djava.awt.headless=true") // hide daemon in OS X
|
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 +
|
platformSpecificOptions +
|
||||||
daemonJVMOptions.mappers.flatMap { it.toArgs("-") } +
|
daemonJVMOptions.mappers.flatMap { it.toArgs("-") } +
|
||||||
COMPILER_DAEMON_CLASS_FQN +
|
COMPILER_DAEMON_CLASS_FQN +
|
||||||
daemonOptions.mappers.flatMap { it.toArgs(COMPILE_DAEMON_CMDLINE_OPTIONS_PREFIX) } +
|
daemonOptions.mappers.flatMap { it.toArgs(COMPILE_DAEMON_CMDLINE_OPTIONS_PREFIX) } +
|
||||||
compilerId.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(" "))
|
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
|
// 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)
|
var isEchoRead = Semaphore(1)
|
||||||
isEchoRead.acquire()
|
isEchoRead.acquire()
|
||||||
|
|
||||||
val stdoutThread =
|
val stdoutThread =
|
||||||
thread {
|
thread {
|
||||||
daemon.inputStream
|
try {
|
||||||
.reader()
|
daemon.inputStream
|
||||||
.forEachLine {
|
.reader()
|
||||||
if (daemonOptions.runFilesPath.isNotEmpty() && it.contains(daemonOptions.runFilesPath)) {
|
.forEachLine {
|
||||||
isEchoRead.release()
|
if (daemonOptions.runFilesPath.isNotEmpty() && it.contains(daemonOptions.runFilesPath)) {
|
||||||
return@forEachLine
|
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 {
|
try {
|
||||||
// trying to wait for process
|
// trying to wait for process
|
||||||
|
|||||||
+47
-1
@@ -45,6 +45,10 @@
|
|||||||
|
|
||||||
<property name="dependencies.info.file" value="dependencies/dependencies.properties"/>
|
<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"/>
|
<property file="${dependencies.info.file}" prefix="dependencies.info.prev"/>
|
||||||
|
|
||||||
<target name="update" depends="fetch-third-party,fetch-annotations" description="Update dependencies">
|
<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}"/>
|
<move file="dependencies/apache-ant-@{version}" tofile="dependencies/@{folderName}"/>
|
||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</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"/>
|
||||||
<mkdir dir="dependencies/download"/>
|
<mkdir dir="dependencies/download"/>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user