K/N: Refactor KotlinNativePluginSearchPathResolver

Get rid of dependency on KonanPaths project component
This commit is contained in:
Dmitriy Dolovov
2018-09-07 12:05:53 +03:00
committed by Mikhail Glukhikh
parent b157e9d5a1
commit dd203830a8
8 changed files with 159 additions and 151 deletions
@@ -8,15 +8,17 @@ package org.jetbrains.kotlin.konan.target
import org.jetbrains.kotlin.konan.target.KonanTarget.*
import org.jetbrains.kotlin.konan.util.Named
enum class Family(val exeSuffix:String, val dynamicPrefix: String, val dynamicSuffix: String,
val staticPrefix: String, val staticSuffix: String) {
OSX ("kexe", "lib", "dylib", "lib", "a"),
IOS ("kexe", "lib", "dylib", "lib", "a"),
LINUX ("kexe", "lib", "so" , "lib", "a"),
MINGW ("exe" , "" , "dll" , "lib", "a"),
ANDROID ("so" , "lib", "so" , "lib", "a"),
WASM ("wasm", "" , "wasm" , "", "wasm"),
ZEPHYR ("o" , "lib", "a" , "lib", "a")
enum class Family(
val exeSuffix: String, val dynamicPrefix: String, val dynamicSuffix: String,
val staticPrefix: String, val staticSuffix: String
) {
OSX("kexe", "lib", "dylib", "lib", "a"),
IOS("kexe", "lib", "dylib", "lib", "a"),
LINUX("kexe", "lib", "so", "lib", "a"),
MINGW("exe", "", "dll", "lib", "a"),
ANDROID("so", "lib", "so", "lib", "a"),
WASM("wasm", "", "wasm", "", "wasm"),
ZEPHYR("o", "lib", "a", "lib", "a")
}
enum class Architecture(val bitness: Int) {
@@ -29,18 +31,18 @@ enum class Architecture(val bitness: Int) {
}
sealed class KonanTarget(override val name: String, val family: Family, val architecture: Architecture) : Named {
object ANDROID_ARM32 : KonanTarget( "android_arm32", Family.ANDROID, Architecture.ARM32)
object ANDROID_ARM64 : KonanTarget( "android_arm64", Family.ANDROID, Architecture.ARM64)
object IOS_ARM32 : KonanTarget( "ios_arm32", Family.IOS, Architecture.ARM32)
object IOS_ARM64 : KonanTarget( "ios_arm64", Family.IOS, Architecture.ARM64)
object IOS_X64 : KonanTarget( "ios_x64", Family.IOS, Architecture.X64)
object LINUX_X64 : KonanTarget( "linux_x64", Family.LINUX, Architecture.X64)
object MINGW_X64 : KonanTarget( "mingw_x64", Family.MINGW, Architecture.X64)
object MACOS_X64 : KonanTarget( "macos_x64", Family.OSX, Architecture.X64)
object LINUX_ARM32_HFP :KonanTarget( "linux_arm32_hfp", Family.LINUX, Architecture.ARM32)
object LINUX_MIPS32 : KonanTarget( "linux_mips32", Family.LINUX, Architecture.MIPS32)
object LINUX_MIPSEL32 : KonanTarget( "linux_mipsel32", Family.LINUX, Architecture.MIPSEL32)
object WASM32 : KonanTarget( "wasm32", Family.WASM, Architecture.WASM32)
object ANDROID_ARM32 : KonanTarget("android_arm32", Family.ANDROID, Architecture.ARM32)
object ANDROID_ARM64 : KonanTarget("android_arm64", Family.ANDROID, Architecture.ARM64)
object IOS_ARM32 : KonanTarget("ios_arm32", Family.IOS, Architecture.ARM32)
object IOS_ARM64 : KonanTarget("ios_arm64", Family.IOS, Architecture.ARM64)
object IOS_X64 : KonanTarget("ios_x64", Family.IOS, Architecture.X64)
object LINUX_X64 : KonanTarget("linux_x64", Family.LINUX, Architecture.X64)
object MINGW_X64 : KonanTarget("mingw_x64", Family.MINGW, Architecture.X64)
object MACOS_X64 : KonanTarget("macos_x64", Family.OSX, Architecture.X64)
object LINUX_ARM32_HFP : KonanTarget("linux_arm32_hfp", Family.LINUX, Architecture.ARM32)
object LINUX_MIPS32 : KonanTarget("linux_mips32", Family.LINUX, Architecture.MIPS32)
object LINUX_MIPSEL32 : KonanTarget("linux_mipsel32", Family.LINUX, Architecture.MIPSEL32)
object WASM32 : KonanTarget("wasm32", Family.WASM, Architecture.WASM32)
// Tunable targets
class ZEPHYR(val subName: String, val genericName: String = "zephyr") :
@@ -49,6 +51,23 @@ sealed class KonanTarget(override val name: String, val family: Family, val arch
override fun toString() = name
}
// TODO: need a better way to enumerated predefined targets.
object PredefinedKonanTargets {
val ALL = listOf(
ANDROID_ARM32, ANDROID_ARM64,
IOS_ARM32, IOS_ARM64, IOS_X64,
LINUX_X64, LINUX_ARM32_HFP, LINUX_MIPS32, LINUX_MIPSEL32,
MINGW_X64,
MACOS_X64,
KonanTarget.WASM32
)
private val ALL_BY_NAME = ALL.associate { it.name to it }
fun getByName(name: String) = ALL_BY_NAME[name]
}
fun hostTargetSuffix(host: KonanTarget, target: KonanTarget) =
if (target == host) host.name else "${host.name}-${target.name}"
@@ -58,11 +77,11 @@ enum class CompilerOutputKind {
},
DYNAMIC {
override fun suffix(target: KonanTarget?) = ".${target!!.family.dynamicSuffix}"
override fun prefix(target: KonanTarget?) = "${target!!.family.dynamicPrefix}"
override fun prefix(target: KonanTarget?) = target!!.family.dynamicPrefix
},
STATIC {
override fun suffix(target: KonanTarget?) = ".${target!!.family.staticSuffix}"
override fun prefix(target: KonanTarget?) = "${target!!.family.staticPrefix}"
override fun prefix(target: KonanTarget?) = target!!.family.staticPrefix
},
FRAMEWORK {
override fun suffix(target: KonanTarget?): String = ".framework"
@@ -80,22 +99,21 @@ enum class CompilerOutputKind {
interface TargetManager {
val target: KonanTarget
val targetName : String
fun list() : Unit
val targetName: String
fun list()
val hostTargetSuffix: String
val targetSuffix: String
}
/** */
interface SubTargetProvider {
fun availableSubTarget(genericName: String): List<String>
}
private class NoSubTargets: SubTargetProvider {
private class NoSubTargets : SubTargetProvider {
override fun availableSubTarget(genericName: String): List<String> = emptyList()
}
private class TargetManagerImpl(val userRequest: String?, val hostManager: HostManager): TargetManager {
private class TargetManagerImpl(val userRequest: String?, val hostManager: HostManager) : TargetManager {
override val target = determineCurrent()
override val targetName
get() = target.visibleName
@@ -125,24 +143,15 @@ open class HostManager(subtargetProvider: SubTargetProvider = NoSubTargets()) {
fun targetManager(userRequest: String? = null): TargetManager = TargetManagerImpl(userRequest, this)
// TODO: need a better way to enumerated predefined targets.
private val predefinedTargets = listOf(
KonanTarget.ANDROID_ARM32, ANDROID_ARM64,
IOS_ARM32, IOS_ARM64, IOS_X64,
LINUX_X64, LINUX_ARM32_HFP, LINUX_MIPS32, LINUX_MIPSEL32,
MINGW_X64,
MACOS_X64,
WASM32)
private val zephyrSubtargets = subtargetProvider.availableSubTarget("zephyr").map { ZEPHYR(it) }
private val configurableSubtargets = zephyrSubtargets
val targetValues: List<KonanTarget> by lazy {
predefinedTargets + configurableSubtargets
PredefinedKonanTargets.ALL + configurableSubtargets
}
val targets = targetValues.associate{ it.visibleName to it }
val targets = targetValues.associate { it.visibleName to it }
fun toKonanTargets(names: Iterable<String>): List<KonanTarget> {
return names.map {
@@ -160,9 +169,7 @@ open class HostManager(subtargetProvider: SubTargetProvider = NoSubTargets()) {
fun targetByName(name: String): KonanTarget {
if (name == "host") return host
val target = targets[resolveAlias(name)]
if (target == null) throw TargetSupportException("Unknown target name: $name")
return target
return targets[resolveAlias(name)] ?: throw TargetSupportException("Unknown target name: $name")
}
val enabled: List<KonanTarget> by lazy {
@@ -203,7 +210,7 @@ open class HostManager(subtargetProvider: SubTargetProvider = NoSubTargets()) {
javaOsName == "Mac OS X" -> "osx"
javaOsName == "Linux" -> "linux"
javaOsName.startsWith("Windows") -> "windows"
else -> throw TargetSupportException("Unknown operating system: ${javaOsName}")
else -> throw TargetSupportException("Unknown operating system: $javaOsName")
}
}
@@ -214,10 +221,10 @@ open class HostManager(subtargetProvider: SubTargetProvider = NoSubTargets()) {
}
val jniHostPlatformIncludeDir: String
get() = when(host) {
get() = when (host) {
KonanTarget.MACOS_X64 -> "darwin"
KonanTarget.LINUX_X64 -> "linux"
KonanTarget.MINGW_X64 ->"win32"
KonanTarget.MINGW_X64 -> "win32"
else -> throw TargetSupportException("Unknown host: $host.")
}
@@ -225,47 +232,48 @@ open class HostManager(subtargetProvider: SubTargetProvider = NoSubTargets()) {
val javaArch = System.getProperty("os.arch")
return when (javaArch) {
"x86_64" -> "x86_64"
"amd64" -> "x86_64"
"arm64" -> "arm64"
else -> throw TargetSupportException("Unknown hardware platform: ${javaArch}")
"amd64" -> "x86_64"
"arm64" -> "arm64"
else -> throw TargetSupportException("Unknown hardware platform: $javaArch")
}
}
val host: KonanTarget = when (host_os()) {
"osx" -> KonanTarget.MACOS_X64
"osx" -> KonanTarget.MACOS_X64
"linux" -> KonanTarget.LINUX_X64
"windows" -> KonanTarget.MINGW_X64
else -> throw TargetSupportException("Unknown host target: ${host_os()} ${host_arch()}")
}
val hostIsMac = (host == KonanTarget.MACOS_X64)
val hostIsMac = (host == KonanTarget.MACOS_X64)
val hostIsLinux = (host == KonanTarget.LINUX_X64)
val hostIsMingw = (host == KonanTarget.MINGW_X64)
val hostSuffix get() = host.name
@JvmStatic
val hostName get() = host.name
val hostName
get() = host.name
val knownTargetTemplates = listOf("zephyr")
private val targetAliasResolutions = mapOf(
"linux" to "linux_x64",
"macbook" to "macos_x64",
"macos" to "macos_x64",
"imac" to "macos_x64",
"linux" to "linux_x64",
"macbook" to "macos_x64",
"macos" to "macos_x64",
"imac" to "macos_x64",
"raspberrypi" to "linux_arm32_hfp",
"iphone32" to "ios_arm32",
"iphone" to "ios_arm64",
"ipad" to "ios_arm64",
"ios" to "ios_arm64",
"iphone_sim" to "ios_x64",
"mingw" to "mingw_x64"
"iphone32" to "ios_arm32",
"iphone" to "ios_arm64",
"ipad" to "ios_arm64",
"ios" to "ios_arm64",
"iphone_sim" to "ios_x64",
"mingw" to "mingw_x64"
)
private val targetAliases: Map<String, List<String>> by lazy {
val result = mutableMapOf<String, MutableList<String>>()
targetAliasResolutions.entries.forEach {
result.getOrPut(it.value, { mutableListOf() } ).add(it.key)
result.getOrPut(it.value, { mutableListOf() }).add(it.key)
}
result
}
@@ -276,4 +284,4 @@ open class HostManager(subtargetProvider: SubTargetProvider = NoSubTargets()) {
}
}
class TargetSupportException (message: String = "", cause: Throwable? = null) : Exception(message, cause)
class TargetSupportException(message: String = "", cause: Throwable? = null) : Exception(message, cause)
@@ -5,7 +5,8 @@
package org.jetbrains.kotlin.konan.util
val <T : Enum<T>> T.visibleName get() = name.toLowerCase()
val <T : Enum<T>> T.visibleName get() = name.toLowerCase()
interface Named {
val name: String
val visibleName get() = name