Make Configurables more flexible (#9)

* Separated CLI tools into interfaces.
* Added `additionalToolsDir ` to `AppleConfigurables`
This commit is contained in:
Sergey Bogolepov
2019-05-15 12:19:51 +07:00
committed by Ilya Matveev
parent 5503b12a17
commit c6f06ef51e
5 changed files with 63 additions and 31 deletions
@@ -91,7 +91,7 @@ open class Command(initialCommand: List<String>) {
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<String>) {
class Result(val exitCode: Int, val outputLines: List<String>)
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<String> = 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() {
@@ -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)
@@ -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
@@ -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")
}
}
@@ -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") }