Printing linker error message from gradle MPP plugin (#3979)

This commit is contained in:
LepilkinaElena
2020-03-13 17:06:22 +03:00
committed by GitHub
parent 4e9ea6803a
commit 966402adf5
2 changed files with 20 additions and 7 deletions
@@ -133,7 +133,7 @@ internal class Linker(val context: Context) {
it.execute() it.execute()
} }
} catch (e: KonanExternalToolFailure) { } catch (e: KonanExternalToolFailure) {
context.reportCompilationError("${e.toolName} invocation reported errors") context.reportCompilationError("${e.toolName} invocation reported errors\n${e.message}")
} }
return executable return executable
} }
@@ -16,9 +16,10 @@
package org.jetbrains.kotlin.konan.exec package org.jetbrains.kotlin.konan.exec
import java.lang.ProcessBuilder
import java.lang.ProcessBuilder.Redirect
import org.jetbrains.kotlin.konan.KonanExternalToolFailure import org.jetbrains.kotlin.konan.KonanExternalToolFailure
import java.io.BufferedReader
import java.io.InputStreamReader
import java.lang.ProcessBuilder.Redirect
open class Command(initialCommand: List<String>) { open class Command(initialCommand: List<String>) {
@@ -42,28 +43,33 @@ open class Command(initialCommand: List<String>) {
var logger: ((() -> String)->Unit)? = null var logger: ((() -> String)->Unit)? = null
private var stdError: List<String> = emptyList()
fun logWith(newLogger: ((() -> String)->Unit)): Command { fun logWith(newLogger: ((() -> String)->Unit)): Command {
logger = newLogger logger = newLogger
return this return this
} }
open fun runProcess(): Int { open fun runProcess(): Int {
stdError = emptyList()
val builder = ProcessBuilder(command) val builder = ProcessBuilder(command)
builder.redirectOutput(Redirect.INHERIT) builder.redirectOutput(Redirect.INHERIT)
builder.redirectInput(Redirect.INHERIT) builder.redirectInput(Redirect.INHERIT)
builder.redirectError(Redirect.INHERIT)
val process = builder.start() val process = builder.start()
val reader = BufferedReader(InputStreamReader(process.errorStream))
stdError = reader.readLines()
val exitCode = process.waitFor() val exitCode = process.waitFor()
return exitCode return exitCode
} }
open fun execute() { open fun execute() {
log() log()
val code = runProcess() val code = runProcess()
handleExitCode(code) handleExitCode(code, stdError)
} }
/** /**
@@ -104,8 +110,15 @@ open class Command(initialCommand: List<String>) {
private fun handleExitCode(code: Int, output: List<String> = emptyList()) { private fun handleExitCode(code: Int, output: List<String> = emptyList()) {
if (code != 0) throw KonanExternalToolFailure(""" if (code != 0) throw KonanExternalToolFailure("""
The ${command[0]} command returned non-zero exit code: $code. The ${command[0]} command returned non-zero exit code: $code.
output: ${output.joinToString("\n")} output:
${output.joinToString("\n")}
""".trimIndent(), command[0]) """.trimIndent(), command[0])
// Show warnings in case of success linkage.
if (stdError.isNotEmpty()) {
stdError.joinToString("\n").also { message ->
logger?.let { it { message } } ?: println(message)
}
}
} }
private fun log() { private fun log() {