diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/exec/ExecuteCommand.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/exec/ExecuteCommand.kt index 6d085468442..d5de7e9297d 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/exec/ExecuteCommand.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/exec/ExecuteCommand.kt @@ -91,7 +91,7 @@ open class Command(initialCommand: List) { val process = builder.start() val code = process.waitFor() - if (handleError) handleExitCode(code) + if (handleError) handleExitCode(code, outputFile.readLines()) return Result(code, outputFile.readLines()) } finally { @@ -101,8 +101,11 @@ open class Command(initialCommand: List) { class Result(val exitCode: Int, val outputLines: List) - private fun handleExitCode(code: Int) { - if (code != 0) throw KonanExternalToolFailure("The ${command[0]} command returned non-zero exit code: $code.", command[0]) + private fun handleExitCode(code: Int, output: List = emptyList()) { + if (code != 0) throw KonanExternalToolFailure(""" + The ${command[0]} command returned non-zero exit code: $code. + output: ${output.joinToString("\n")} + """.trimIndent(), command[0]) } private fun log() { diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Apple.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Apple.kt index d223e58ced8..63181138fe0 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Apple.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Apple.kt @@ -44,6 +44,11 @@ class AppleConfigurablesImpl( XcodePartsProvider.InternalServer -> absolute(toolchainDependency) } + override val absoluteAdditionalToolsDir: String get() = when (xcodePartsProvider) { + is XcodePartsProvider.Local -> xcodePartsProvider.xcode.additionalTools + XcodePartsProvider.InternalServer -> absolute(additionalToolsDir) + } + override val dependencies get() = super.dependencies + when (xcodePartsProvider) { is XcodePartsProvider.Local -> emptyList() XcodePartsProvider.InternalServer -> listOf(sdkDependency, toolchainDependency) diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt index a9e8d170bcf..5fb43c8c978 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.konan.file.File class ClangArgs(private val configurables: Configurables) : Configurables by configurables { - val targetArg = if (configurables is NonAppleConfigurables) + val targetArg = if (configurables is TargetableConfigurables) configurables.targetArg else null diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt index 94c07099064..48265ac8f43 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt @@ -18,6 +18,39 @@ package org.jetbrains.kotlin.konan.target import org.jetbrains.kotlin.konan.properties.* +interface ClangFlags : TargetableExternalStorage { + val clangFlags get() = targetList("clangFlags") + val clangNooptFlags get() = targetList("clangNooptFlags") + val clangOptFlags get() = targetList("clangOptFlags") + val clangDebugFlags get() = targetList("clangDebugFlags") + val clangDynamicFlags get() = targetList("clangDynamicFlags") +} + +interface LlvmLtoFlags : TargetableExternalStorage { + val llvmLtoNooptFlags get() = targetList("llvmLtoNooptFlags") + val llvmLtoOptFlags get() = targetList("llvmLtoOptFlags") + val llvmLtoFlags get() = targetList("llvmLtoFlags") + val llvmLtoDynamicFlags get() = targetList("llvmLtoDynamicFlags") +} + +interface LlcFlags : TargetableExternalStorage { + val llcFlags get() = targetList("llcFlags") + val llcNooptFlags get() = targetList("llcNooptFlags") + val llcOptFlags get() = targetList("llcOptFlags") + val llcDebugFlags get() = targetList("llcDebugFlags") +} + +interface OptFlags : TargetableExternalStorage { + val optFlags get() = targetList("optFlags") + val optNooptFlags get() = targetList("optNooptFlags") + val optOptFlags get() = targetList("optOptFlags") + val optDebugFlags get() = targetList("optDebugFlags") +} + +interface LldFlags : TargetableExternalStorage { + val lldFlags get() = targetList("lld") +} + interface Configurables : TargetableExternalStorage { val target: KonanTarget @@ -27,16 +60,13 @@ interface Configurables : TargetableExternalStorage { val libffiDir get() = hostString("libffiDir") // TODO: Delegate to a map? - val llvmLtoNooptFlags get() = targetList("llvmLtoNooptFlags") - val llvmLtoOptFlags get() = targetList("llvmLtoOptFlags") - val llvmLtoFlags get() = targetList("llvmLtoFlags") - val llvmLtoDynamicFlags get() = targetList("llvmLtoDynamicFlags") val entrySelector get() = targetList("entrySelector") val linkerOptimizationFlags get() = targetList("linkerOptimizationFlags") val linkerKonanFlags get() = targetList("linkerKonanFlags") val linkerNoDebugFlags get() = targetList("linkerNoDebugFlags") val linkerDynamicFlags get() = targetList("linkerDynamicFlags") val llvmDebugOptFlags get() = targetList("llvmDebugOptFlags") + val llvmDebugLlcFlags get() = targetList("llvmDebugLlcFlags") val targetSysRoot get() = targetString("targetSysRoot") // Notice: these ones are host-target. @@ -47,19 +77,21 @@ interface Configurables : TargetableExternalStorage { val absoluteLlvmHome get() = absolute(llvmHome) } -interface NonAppleConfigurables : Configurables { +interface TargetableConfigurables : Configurables { val targetArg get() = targetString("quadruple") } -interface AppleConfigurables : Configurables { +interface AppleConfigurables : Configurables, ClangFlags { val arch get() = targetString("arch")!! val osVersionMin get() = targetString("osVersionMin")!! val osVersionMinFlagLd get() = targetString("osVersionMinFlagLd")!! + val additionalToolsDir get() = hostString("additionalToolsDir") + val absoluteAdditionalToolsDir get() = absolute(additionalToolsDir) } -interface MingwConfigurables : NonAppleConfigurables +interface MingwConfigurables : TargetableConfigurables, LlvmLtoFlags -interface LinuxBasedConfigurables : NonAppleConfigurables { +interface LinuxBasedConfigurables : TargetableConfigurables, LlvmLtoFlags { val gccToolchain get() = hostString("gccToolchain") val absoluteGccToolchain get() = absolute(gccToolchain) @@ -72,24 +104,10 @@ interface LinuxBasedConfigurables : NonAppleConfigurables { interface LinuxConfigurables : LinuxBasedConfigurables interface LinuxMIPSConfigurables : LinuxBasedConfigurables interface RaspberryPiConfigurables : LinuxBasedConfigurables -interface AndroidConfigurables : NonAppleConfigurables +interface AndroidConfigurables : TargetableConfigurables -interface WasmConfigurables : NonAppleConfigurables { +interface WasmConfigurables : TargetableConfigurables, OptFlags, LlcFlags, LldFlags - val llcFlags get() = targetList("llcFlags") - val llcNooptFlags get() = targetList("llcNooptFlags") - val llcOptFlags get() = targetList("llcOptFlags") - val llcDebugFlags get() = targetList("llcDebugFlags") - - val optFlags get() = targetList("optFlags") - val optNooptFlags get() = targetList("optNooptFlags") - val optOptFlags get() = targetList("optOptFlags") - val optDebugFlags get() = targetList("optDebugFlags") - - val lldFlags get() = targetList("lld") -} - -interface ZephyrConfigurables : NonAppleConfigurables { +interface ZephyrConfigurables : TargetableConfigurables { val boardSpecificClangFlags get() = targetList("boardSpecificClangFlags") -} - +} \ No newline at end of file diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Xcode.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Xcode.kt index ff1d581de0c..39631ac8c1e 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Xcode.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Xcode.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.konan.target -import org.jetbrains.kotlin.konan.KonanExternalToolFailure import org.jetbrains.kotlin.konan.exec.Command import org.jetbrains.kotlin.konan.file.File @@ -26,6 +25,8 @@ interface Xcode { val iphoneosSdk: String val iphonesimulatorSdk: String val version: String + // Xcode.app/Contents/Developer/usr + val additionalTools: String companion object { val current: Xcode by lazy { @@ -41,6 +42,11 @@ private object CurrentXcode : Xcode { File(ldPath).parentFile.parentFile.parentFile.absolutePath } + override val additionalTools: String by lazy { + val bitcodeBuildToolPath = xcrun("-f", "bitcode-build-tool") + File(bitcodeBuildToolPath).parentFile.absolutePath + } + override val macosxSdk by lazy { getSdkPath("macosx") } override val iphoneosSdk by lazy { getSdkPath("iphoneos") } override val iphonesimulatorSdk by lazy { getSdkPath("iphonesimulator") }