Android NDK support and build system refactoring (#585)

This commit is contained in:
Nikolay Igotti
2017-05-24 00:20:19 +03:00
committed by GitHub
parent 48742b7f3f
commit 42197a2bec
26 changed files with 404 additions and 232 deletions
@@ -49,8 +49,10 @@ private fun maybeExecuteHelper(configuration: CompilerConfiguration) {
}
}
class K2Native : CLICompiler<K2NativeCompilerArguments>() {
private fun suffixIfNot(name: String, suffix: String) =
if (name.endsWith(suffix)) name else "$name$suffix"
class K2Native : CLICompiler<K2NativeCompilerArguments>() {
override fun doExecute(arguments : K2NativeCompilerArguments,
configuration : CompilerConfiguration,
@@ -109,11 +111,11 @@ class K2Native : CLICompiler<K2NativeCompilerArguments>() {
val library = arguments.outputFile ?: "library"
if (arguments.nolink)
put(LIBRARY_NAME, library)
put(LIBRARY_FILE, "${library}.klib")
put(LIBRARY_FILE, suffixIfNot(library, ".klib"))
val program = arguments.outputFile ?: "program"
if (!arguments.nolink) {
put(PROGRAM_NAME,program)
put(EXECUTABLE_FILE,"${program}.kexe")
put(PROGRAM_NAME, program)
put(EXECUTABLE_FILE, suffixIfNot(program, ".kexe"))
}
// This is a decision we could change
val module = if (arguments.nolink) library else program
@@ -23,9 +23,9 @@ class Distribution(val config: CompilerConfiguration) {
val targetManager = TargetManager(config)
val target = targetManager.currentName
val suffix = targetManager.currentSuffix()
val hostSuffix = TargetManager.host.suffix
init { if (!targetManager.crossCompile) assert(suffix == hostSuffix) }
val hostSuffix = targetManager.hostSuffix()
val hostTargetSuffix = targetManager.hostTargetSuffix()
val targetSuffix = targetManager.targetSuffix()
private fun findUserHome() = File(System.getProperty("user.home")).absolutePath
val userHome = findUserHome()
@@ -45,32 +45,23 @@ class Distribution(val config: CompilerConfiguration) {
val klib = "$konanHome/klib"
val dependenciesDir = "$konanHome/dependencies"
val dependencies = properties.propertyList("dependencies.$suffix")
val dependencies = properties.propertyList("dependencies.$hostTargetSuffix")
val stdlib = "$klib/stdlib"
val runtime = config.get(KonanConfigKeys.RUNTIME_FILE)
?: "$stdlib/$target/native/runtime.bc"
val llvmHome = "$dependenciesDir/${properties.propertyString("llvmHome.$hostSuffix")}"
val sysRoot = "$dependenciesDir/${properties.propertyString("sysRoot.$hostSuffix")}"
val libGcc = "$dependenciesDir/${properties.propertyString("libGcc.$suffix")}"
val targetSysRoot = if (properties.hasProperty("targetSysRoot.$suffix")) {
"$dependenciesDir/${properties.propertyString("targetSysRoot.$suffix")}"
} else {
sysRoot
}
val libffi = "$dependenciesDir/${properties.propertyString("libffiDir.$suffix")}/lib/libffi.a"
val hostSysRoot = "$dependenciesDir/${properties.propertyString("targetSysRoot.$hostSuffix")}"
val targetSysRoot = "$dependenciesDir/${properties.propertyString("targetSysRoot.$targetSuffix")}"
val targetToolchain = "$dependenciesDir/${properties.propertyString("targetToolchain.$hostTargetSuffix")}"
val libffi =
"$dependenciesDir/${properties.propertyString("libffiDir.$targetSuffix")}/lib/libffi.a"
val llvmBin = "$llvmHome/bin"
val llvmLib = "$llvmHome/lib"
val llvmOpt = "$llvmBin/opt"
val llvmLlc = "$llvmBin/llc"
val llvmLto = "$llvmBin/llvm-lto"
val llvmLink = "$llvmBin/llvm-link"
val libCppAbi = "$llvmLib/libc++abi.a"
val libLTO = when (TargetManager.host) {
KonanTarget.MACBOOK -> "$llvmLib/libLTO.dylib"
KonanTarget.LINUX -> "$llvmLib/libLTO.so"
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.backend.konan.library.KonanLibrarySearchPathResolver
import org.jetbrains.kotlin.backend.konan.util.profile
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.backend.konan.util.File
@@ -39,7 +39,7 @@ public class KonanProperties(val propertyFile: String) {
fun propertyList(key: String, suffix: String? = null): List<String> {
val value = properties.getProperty(key.suffix(suffix))
return value?.split(' ') ?: listOf<String>()
return value?.split(' ') ?: emptyList()
}
fun hasProperty(key: String, suffix: String? = null): Boolean
@@ -16,12 +16,12 @@
package org.jetbrains.kotlin.backend.konan
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
enum class KonanTarget(val suffix: String, var enabled: Boolean = false) {
ANDROID_ARM32("android_arm32"),
IPHONE("ios"),
IPHONE_SIM("ios-sim"),
IPHONE_SIM("ios_sim"),
LINUX("linux"),
MACBOOK("osx"),
RASPBERRYPI("raspberrypi")
@@ -38,11 +38,13 @@ class TargetManager(val config: CompilerConfiguration) {
KonanTarget.LINUX -> {
KonanTarget.LINUX.enabled = true
KonanTarget.RASPBERRYPI.enabled = true
KonanTarget.ANDROID_ARM32.enabled = true
}
KonanTarget.MACBOOK -> {
KonanTarget.MACBOOK.enabled = true
KonanTarget.IPHONE.enabled = true
KonanTarget.IPHONE_SIM.enabled = true
KonanTarget.ANDROID_ARM32.enabled = true
}
else ->
error("Unknown host platform: $host")
@@ -78,10 +80,10 @@ class TargetManager(val config: CompilerConfiguration) {
}
}
fun currentSuffix(): String {
return host.suffix +
if (host != current) "-${current.suffix}" else ""
}
fun hostSuffix() = host.suffix
fun hostTargetSuffix() =
if (current == host) host.suffix else "${host.suffix}-${current.suffix}"
fun targetSuffix() = current.suffix
companion object {
fun host_os(): String {
@@ -109,7 +111,5 @@ class TargetManager(val config: CompilerConfiguration) {
else -> error("Unknown host target: ${host_os()} ${host_arch()}")
}
}
val crossCompile = (host != current)
}
@@ -29,67 +29,72 @@ typealias ExecutableFile = String
internal abstract class PlatformFlags(val distribution: Distribution) {
val properties = distribution.properties
val hostSuffix = TargetManager.host.suffix
val targetSuffix = distribution.suffix
val arch = propertyTargetString("arch")
val hostSuffix = distribution.hostTargetSuffix
val targetSuffix = distribution.targetSuffix
open val llvmLtoNooptFlags
= propertyHostList("llvmLtoNooptFlags")
open val llvmLtoOptFlags
= propertyHostList("llvmLtoOptFlags")
= propertyTargetList("llvmLtoNooptFlags")
open val llvmLtoOptFlags
= propertyTargetList("llvmLtoOptFlags")
open val llvmLtoFlags
= propertyHostList("llvmLtoFlags")
= propertyTargetList("llvmLtoFlags")
open val entrySelector
= propertyHostList("entrySelector")
= propertyTargetList("entrySelector")
open val linkerOptimizationFlags
= propertyHostList("linkerOptimizationFlags")
= propertyTargetList("linkerOptimizationFlags")
open val linkerKonanFlags
= propertyHostList("linkerKonanFlags")
= propertyTargetList("linkerKonanFlags")
abstract val linker: String
abstract fun linkCommand(objectFiles: List<ObjectFile>,
abstract fun linkCommand(objectFiles: List<ObjectFile>,
executable: ExecutableFile, optimize: Boolean): List<String>
protected fun propertyHostString(name: String)
= properties.propertyString(name, hostSuffix)!!
protected fun propertyHostList(name: String)
protected fun propertyHostList(name: String)
= properties.propertyList(name, hostSuffix)
protected fun propertyTargetString(name: String)
protected fun propertyTargetString(name: String)
= properties.propertyString(name, targetSuffix)!!
protected fun propertyTargetList(name: String)
= properties.propertyList(name, targetSuffix)
protected fun propertyCommonString(name: String)
= properties.propertyString(name, null)!!
protected fun propertyCommonList(name: String)
= properties.propertyList(name, null)
}
internal open class AndroidPlatform(distribution: Distribution)
: PlatformFlags(distribution) {
private val prefix = "${distribution.targetToolchain}/bin/"
private val clang = "$prefix/clang"
override fun linkCommand(objectFiles: List<String>, executable: String, optimize: Boolean): List<String> {
return mutableListOf<String>(clang, "-o", executable, "-fPIC", "-shared") +
objectFiles +
(if (optimize) linkerOptimizationFlags else emptyList()) +
linkerKonanFlags
}
}
internal open class MacOSBasedPlatform(distribution: Distribution)
: PlatformFlags(distribution) {
override val linker = "${distribution.sysRoot}/usr/bin/ld"
// TODO: move 'ld' out of the host sysroot, as it doesn't belong here.
private val linker = "${distribution.hostSysRoot}/usr/bin/ld"
private val dsymutil = "${distribution.llvmBin}/llvm-dsymutil"
open val osVersionMin = listOf(
propertyTargetString("osVersionMinFlagLd"),
propertyTargetString("osVersionMin")+".0")
open val sysRoot = distribution.sysRoot
open val targetSysRoot = distribution.targetSysRoot
open val osVersionMin by lazy {
listOf(
propertyTargetString("osVersionMinFlagLd"),
propertyTargetString("osVersionMin") + ".0")
}
override fun linkCommand(objectFiles: List<String>, executable: String, optimize: Boolean): List<String> {
return mutableListOf<String>(linker, "-demangle") +
listOf("-object_path_lto", "temporary.o", "-lto_library", distribution.libLTO) +
listOf( "-dynamic", "-arch", arch) +
osVersionMin +
listOf("-syslibroot", "$targetSysRoot",
"-o", executable) +
objectFiles +
if (optimize) linkerOptimizationFlags else {listOf<String>()} +
linkerKonanFlags +
listOf("-lSystem")
return mutableListOf(linker, "-demangle") +
listOf("-object_path_lto", "temporary.o", "-lto_library", distribution.libLTO) +
listOf("-dynamic", "-arch", propertyTargetString("arch")) +
osVersionMin +
listOf("-syslibroot", distribution.targetSysRoot, "-o", executable) +
objectFiles +
(if (optimize) linkerOptimizationFlags else emptyList()) +
linkerKonanFlags + listOf("-lSystem")
}
open fun dsymutilCommand(executable: ExecutableFile): List<String> {
@@ -104,29 +109,21 @@ internal open class MacOSBasedPlatform(distribution: Distribution)
internal open class LinuxBasedPlatform(distribution: Distribution)
: PlatformFlags(distribution) {
open val sysRoot = distribution.sysRoot
open val targetSysRoot = distribution.targetSysRoot
val targetSysRoot = distribution.targetSysRoot
val llvmLib = distribution.llvmLib
val libGcc = distribution.libGcc
override val linker = "${distribution.sysRoot}/../bin/ld.gold"
open val pluginOptimizationFlags =
propertyHostList("pluginOptimizationFlags")
open val dynamicLinker =
propertyTargetString("dynamicLinker")
open val specificLibs
val libGcc = "$targetSysRoot/${propertyTargetString("libGcc")!!}"
val linker = "${distribution.targetToolchain}/bin/ld.gold"
val pluginOptimizationFlags = propertyTargetList("pluginOptimizationFlags")
val specificLibs
= propertyTargetList("abiSpecificLibraries").map{it -> "-L${targetSysRoot}/$it"}
override fun linkCommand(objectFiles: List<String>, executable: String, optimize: Boolean): List<String> {
// TODO: Can we extract more to the konan.properties?
return mutableListOf<String>("$linker",
return mutableListOf(linker,
"--sysroot=${targetSysRoot}",
"-export-dynamic", "-z", "relro", "--hash-style=gnu",
"--build-id", "--eh-frame-hdr", // "-m", "elf_x86_64",
"-dynamic-linker", dynamicLinker,
"-dynamic-linker", propertyTargetString("dynamicLinker"),
"-o", executable,
"${targetSysRoot}/usr/lib64/crt1.o", "${targetSysRoot}/usr/lib64/crti.o", "${libGcc}/crtbegin.o",
"-L${llvmLib}", "-L${libGcc}") +
@@ -147,22 +144,19 @@ internal class LinkStage(val context: Context) {
val config = context.config.configuration
val targetManager = context.config.targetManager
private val distribution =
context.config.distribution
private val properties = distribution.properties
private val distribution = context.config.distribution
val platform = when (TargetManager.host) {
KonanTarget.LINUX ->
val platform = when (context.config.targetManager.current) {
KonanTarget.LINUX, KonanTarget.RASPBERRYPI ->
LinuxBasedPlatform(distribution)
KonanTarget.MACBOOK ->
KonanTarget.MACBOOK, KonanTarget.IPHONE, KonanTarget.IPHONE_SIM ->
MacOSBasedPlatform(distribution)
KonanTarget.ANDROID_ARM32 ->
AndroidPlatform(distribution)
else ->
error("Unexpected host platform")
error("Unexpected target platform: ${context.config.targetManager.current}")
}
val suffix = targetManager.currentSuffix()
val optimize = config.get(KonanConfigKeys.OPTIMIZATION) ?: false
val nomain = config.get(KonanConfigKeys.NOMAIN) ?: false
val emitted = context.bitcodeFileName
@@ -187,18 +181,6 @@ internal class LinkStage(val context: Context) {
return combined
}
fun llvmLlc(file: BitcodeFile): ObjectFile {
val tmpObjectFile = File.createTempFile(File(file).name, ".o")
tmpObjectFile.deleteOnExit()
val objectFile = tmpObjectFile.absolutePath
val command = listOf(distribution.llvmLlc, "-o", objectFile, "-filetype=obj") +
properties.propertyList("llvmLlcFlags.$suffix") + listOf(file)
runTool(*command.toTypedArray())
return objectFile
}
fun asLinkerArgs(args: List<String>): List<String> {
val result = mutableListOf<String>()
for (arg in args) {
@@ -220,8 +202,7 @@ internal class LinkStage(val context: Context) {
// So we stick to "-alias _main _konan_main" on Mac.
// And just do the same on Linux.
val entryPointSelector: List<String>
get() = if (nomain) listOf()
else platform.entrySelector
get() = if (nomain) emptyList() else platform.entrySelector
fun link(objectFiles: List<ObjectFile>): ExecutableFile {
val executable = config.get(KonanConfigKeys.EXECUTABLE_FILE)!!
@@ -265,7 +246,7 @@ internal class LinkStage(val context: Context) {
fun linkStage() {
context.log{"# Compiler root: ${distribution.konanHome}"}
val bitcodeFiles = listOf<BitcodeFile>(emitted) +
val bitcodeFiles = listOf(emitted) +
libraries.map{it -> it.bitcodePaths}.flatten()
var objectFiles: List<String> = listOf()
@@ -187,7 +187,7 @@ internal fun ContextUtils.addGlobal(name: String, type: LLVMTypeRef,
assert(LLVMGetNamedGlobal(context.llvmModule, name) == null)
val result = LLVMAddGlobal(context.llvmModule, type, name)!!
if (threadLocal)
LLVMSetThreadLocalMode(result, LLVMThreadLocalMode.LLVMLocalExecTLSModel)
LLVMSetThreadLocalMode(result, runtime.tlsMode)
return result
}
@@ -198,12 +198,12 @@ internal fun ContextUtils.importGlobal(name: String, type: LLVMTypeRef,
assert (getGlobalType(found) == type)
assert (LLVMGetInitializer(found) == null)
if (threadLocal)
assert(LLVMGetThreadLocalMode(found) == LLVMThreadLocalMode.LLVMLocalExecTLSModel)
assert(LLVMGetThreadLocalMode(found) == runtime.tlsMode)
return found
} else {
val result = LLVMAddGlobal(context.llvmModule, type, name)!!
if (threadLocal)
LLVMSetThreadLocalMode(result, LLVMThreadLocalMode.LLVMLocalExecTLSModel)
LLVMSetThreadLocalMode(result, runtime.tlsMode)
return result
}
}
@@ -42,6 +42,10 @@ class Runtime(bitcodeFile: String) {
val target = LLVMGetTarget(llvmModule)!!.toKString()
// TODO: deduce TLS model from explicit config parameter.
val tlsMode = if (target.indexOf("android") != -1)
LLVMThreadLocalMode.LLVMGeneralDynamicTLSModel else LLVMThreadLocalMode.LLVMLocalExecTLSModel
val dataLayout = LLVMGetDataLayout(llvmModule)!!.toKString()
val targetData = LLVMCreateTargetData(dataLayout)!!
+90 -43
View File
@@ -1,4 +1,3 @@
#
# Copyright 2010-2017 JetBrains s.r.o.
#
@@ -19,11 +18,13 @@
llvmVersion = 3.9.0
dependenciesUrl = http://download.jetbrains.com/kotlin/native
# macbook
arch.osx = x86_64
sysRoot.osx = target-sysroot-1-darwin-macos
libffiDir.osx = libffi-3.2.1-2-darwin-macos
# Mac OS X.
llvmHome.osx = clang-llvm-3.9.0-darwin-macos
targetToolchain.osx = clang-llvm-3.9.0-darwin-macos
arch.osx = x86_64
targetSysRoot.osx = target-sysroot-1-darwin-macos
libffiDir.osx = libffi-3.2.1-2-darwin-macos
llvmLtoFlags.osx = -exported-symbol=_Konan_main
llvmLtoOptFlags.osx = -O3 -function-sections
llvmLtoNooptFlags.osx = -O1
@@ -37,38 +38,55 @@ dependencies.osx = target-sysroot-1-darwin-macos \
libffi-3.2.1-2-darwin-macos \
clang-llvm-3.9.0-darwin-macos
# iphone
arch.osx-ios = arm64
targetSysRoot.osx-ios = target-sysroot-2-darwin-ios
libffiDir.osx-ios = libffi-3.2.1-2-darwin-ios
osVersionMinFlagLd.osx-ios = -iphoneos_version_min
osVersionMinFlagClang.osx-ios = -miphoneos-version-min
osVersionMin.osx-ios = 8.0
# Apple iOS.
targetToolchain.osx-ios = clang-llvm-3.9.0-darwin-macos
dependencies.osx-ios = target-sysroot-1-darwin-macos \
libffi-3.2.1-2-darwin-ios \
clang-llvm-3.9.0-darwin-macos \
target-sysroot-2-darwin-ios
# iphone_sim
arch.osx-ios-sim = x86_64
targetSysRoot.osx-ios-sim = target-sysroot-1-darwin-ios-sim
libffiDir.osx-ios-sim = libffi-3.2.1-2-darwin-ios-sim
osVersionMinFlagLd.osx-ios-sim = -ios_simulator_version_min
osVersionMinFlagClang.osx-ios-sim = -mios-simulator-version-min
osVersionMin.osx-ios-sim = 8.0
dependencies.osx-ios-sim = target-sysroot-1-darwin-macos \
libffi-3.2.1-2-darwin-ios-sim \
clang-llvm-3.9.0-darwin-macos \
target-sysroot-1-darwin-ios-sim
arch.ios = arm64
entrySelector.ios = -alias _Konan_main _main
targetSysRoot.ios = target-sysroot-2-darwin-ios
libffiDir.ios = libffi-3.2.1-2-darwin-ios
llvmLtoFlags.ios = -exported-symbol=_Konan_main
llvmLtoOptFlags.ios = -O3 -function-sections
llvmLtoNooptFlags.ios = -O1
linkerKonanFlags.ios = -lc++
linkerOptimizationFlags.ios = -dead_strip
osVersionMinFlagLd.ios = -iphoneos_version_min
osVersionMinFlagClang.ios = -miphoneos-version-min
osVersionMin.ios = 8.0
# linux
arch.linux = x86_64
quadruple.linux = x86_64-unknown-linux-gnu
sysRoot.linux = target-gcc-toolchain-3-linux-x86-64/x86_64-unknown-linux-gnu/sysroot
libffiDir.linux = libffi-3.2.1-2-linux-x86-64
# Apple iOS simulator.
targetToolchain.osx-ios_sim = clang-llvm-3.9.0-darwin-macos
dependencies.osx-ios_sim = target-sysroot-1-darwin-macos \
libffi-3.2.1-2-darwin-ios_sim \
clang-llvm-3.9.0-darwin-macos \
target-sysroot-1-darwin-ios_sim
arch.ios_sim = x86_64
entrySelector.ios_sim = -alias _Konan_main _main
targetSysRoot.ios_sim = target-sysroot-1-darwin-ios-sim
libffiDir.ios_sim = libffi-3.2.1-2-darwin-ios-sim
llvmLtoFlags.ios_sim = -exported-symbol=_Konan_main
llvmLtoOptFlags.ios_sim = -O3 -function-sections
llvmLtoNooptFlags.ios_sim = -O1
linkerKonanFlags.ios_sim = -lc++
linkerOptimizationFlags.ios_sim = -dead_strip
osVersionMinFlagLd.ios_sim = -ios_simulator_version_min
osVersionMinFlagClang.ios_sim = -mios-simulator-version-min
osVersionMin.ios_sim = 8.0
# Linux x86-64.
llvmHome.linux = clang-llvm-3.9.0-linux-x86-64
libGcc.linux = target-gcc-toolchain-3-linux-x86-64/lib/gcc/x86_64-unknown-linux-gnu/4.8.5
gccToolChain.linux = target-gcc-toolchain-3-linux-x86-64
targetToolchain.linux = target-gcc-toolchain-3-linux-x86-64/x86_64-unknown-linux-gnu
quadruple.linux = x86_64-unknown-linux-gnu
targetSysRoot.linux = target-gcc-toolchain-3-linux-x86-64/x86_64-unknown-linux-gnu/sysroot
libffiDir.linux = libffi-3.2.1-2-linux-x86-64
# targetSysroot-relative.
libGcc.linux = ../../lib/gcc/x86_64-unknown-linux-gnu/4.8.5
llvmLtoFlags.linux = -exported-symbol=Konan_main
llvmLtoOptFlags.linux = -O3 -function-sections
llvmLtoNooptFlags.linux = -O1
@@ -79,28 +97,57 @@ pluginOptimizationFlags.linux = -plugin-opt=mcpu=x86-64 -plugin-opt=O3
dynamicLinker.linux = /lib64/ld-linux-x86-64.so.2
entrySelector.linux = --defsym main=Konan_main
# targetSysRoot relative
abiSpecificLibraries = ../lib64 lib64 usr/lib64
abiSpecificLibraries.linux = ../lib64 lib64 usr/lib64
dependencies.linux = \
clang-llvm-3.9.0-linux-x86-64 \
target-gcc-toolchain-3-linux-x86-64 \
libffi-3.2.1-2-linux-x86-64
# Raspberry Pi
arch.linux-raspberrypi = armv6
quadruple.linux-raspberrypi = armv6-unknown-linux-gnueabihf
targetSysRoot.linux-raspberrypi = target-sysroot-1-raspberrypi
libffiDir.linux-raspberrypi = libffi-3.2.1-2-raspberrypi
libGcc.linux-raspberrypi = target-sysroot-1-raspberrypi/lib/gcc/arm-linux-gnueabihf/4.8.3/
gccToolChain.linux-raspberrypi = target-gcc-toolchain-3-linux-x86-64
dynamicLinker.linux-raspberrypi = /lib/ld-linux-armhf.so.3
# targetSysRoot relative
abiSpecificLibraries = \
../lib/arm-linux-gnueabihf \
lib/arm-linux-gnueabihf \
usr/lib/arm-linux-gnueabihf
targetToolchain.linux-raspberrypi = target-gcc-toolchain-3-linux-x86-64/x86_64-unknown-linux-gnu
dependencies.linux-raspberrypi = \
clang-llvm-3.9.0-linux-x86-64 \
target-gcc-toolchain-3-linux-x86-64 \
target-sysroot-1-raspberrypi \
libffi-3.2.1-2-linux-x86-64 \
libffi-3.2.1-2-raspberrypi
quadruple.raspberrypi = armv6-unknown-linux-gnueabihf
entrySelector.raspberrypi = --defsym main=Konan_main
linkerOptimizationFlags.raspberrypi = --gc-sections
targetSysRoot.raspberrypi = target-sysroot-1-raspberrypi
# We could reuse host toolchain here.
libffiDir.raspberrypi = libffi-3.2.1-2-raspberrypi
linkerKonanFlags.raspberrypi = -Bstatic -lstdc++ -Bdynamic -ldl -lm -lpthread
# targetSysroot-relative.
libGcc.raspberrypi = lib/gcc/arm-linux-gnueabihf/4.8.3
llvmLtoFlags.raspberrypi = -exported-symbol=Konan_main
dynamicLinker.raspberrypi = /lib/ld-linux-armhf.so.3
llvmLtoFlags.linux = -exported-symbol=Konan_main
# targetSysRoot relative
abiSpecificLibraries.raspberrypi = \
../lib/arm-linux-gnueabihf \
lib/arm-linux-gnueabihf \
usr/lib/arm-linux-gnueabihf
# Android ARM32, based on NDK for android-21.
targetToolchain.osx-android_arm32 = target-toolchain-21-osx-android_arm32
# TODO: split dependencies to host-dependent and host-independent parts.
dependencies.osx-android_arm32 = \
clang-llvm-3.9.0-darwin-macos \
target-sysroot-21-android_arm32 \
target-toolchain-21-osx-android_arm32 \
libffi-3.2.1-2-android_arm32
targetToolchain.linux-android_arm32 = target-toolchain-21-linux-android_arm32
dependencies.linux-android_arm32 = \
clang-llvm-3.9.0-linux-x86-64 \
target-sysroot-21-android_arm32 \
target-toolchain-21-linux-android_arm32 \
libffi-3.2.1-2-android_arm32
quadruple.android_arm32 = arm-linux-androideabi
entrySelector.android_arm32 = -Wl,--defsym -Wl,main=Konan_main
llvmLtoFlags.android_arm32 = -exported-symbol=Konan_main -emulated-tls
targetSysRoot.android_arm32 = target-sysroot-21-android_arm32
libffiDir.android_arm32 = libffi-3.2.1-2-android_arm32
linkerKonanFlags.android_arm32 = -lm -latomic -lstdc++