Add basic support for Windows with mingw-w64
This commit is contained in:
committed by
SvyatoslavScherbina
parent
ed60732058
commit
d6b8b4fb0f
@@ -29,9 +29,6 @@ apply plugin: org.jetbrains.kotlin.NativeInteropPlugin
|
||||
|
||||
apply plugin: 'c'
|
||||
|
||||
def javaHome = System.getProperty('java.home')
|
||||
def compilerArgsForJniIncludes = ["", "linux", "darwin"].collect { "-I$javaHome/../include/$it" } as String[]
|
||||
|
||||
model {
|
||||
components {
|
||||
clangstubs(NativeLibrarySpec) {
|
||||
@@ -40,12 +37,18 @@ model {
|
||||
}
|
||||
|
||||
binaries.all {
|
||||
cCompiler.args compilerArgsForJniIncludes
|
||||
cCompiler.args hostCompilerArgsForJni
|
||||
cCompiler.args "-I$llvmDir/include"
|
||||
}
|
||||
|
||||
binaries.withType(SharedLibraryBinarySpec) {
|
||||
linker.args "$llvmDir/lib/${System.mapLibraryName("clang")}"
|
||||
final String libclang
|
||||
if (isWindows()) {
|
||||
libclang = "bin/libclang.dll"
|
||||
} else {
|
||||
libclang = "lib/${System.mapLibraryName("clang")}"
|
||||
}
|
||||
linker.args "$llvmDir/$libclang"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,9 +27,6 @@ buildscript {
|
||||
apply plugin: 'kotlin'
|
||||
apply plugin: 'c'
|
||||
|
||||
def javaHome = System.getProperty('java.home')
|
||||
def compilerArgsForJniIncludes = ["", "linux", "darwin"].collect { "-I$javaHome/../include/$it" } as String[]
|
||||
|
||||
model {
|
||||
components {
|
||||
callbacks(NativeLibrarySpec) {
|
||||
@@ -41,7 +38,7 @@ model {
|
||||
def host = rootProject.ext.host
|
||||
def hostLibffiDir = rootProject.ext.get("${host}LibffiDir")
|
||||
|
||||
cCompiler.args compilerArgsForJniIncludes
|
||||
cCompiler.args hostCompilerArgsForJni
|
||||
cCompiler.args "-I$hostLibffiDir/include"
|
||||
|
||||
linker.args "$hostLibffiDir/lib/libffi.a"
|
||||
|
||||
@@ -147,7 +147,7 @@ static JNIEnv* getCurrentEnv() {
|
||||
return env;
|
||||
}
|
||||
|
||||
jint JNI_OnLoad(JavaVM *vm_, void *reserved) {
|
||||
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm_, void *reserved) {
|
||||
vm = vm_;
|
||||
return JNI_VERSION_1_1;
|
||||
}
|
||||
|
||||
+1
-1
@@ -1277,7 +1277,7 @@ class StubGenerator(
|
||||
},
|
||||
|
||||
compilerArgs = configuration.library.compilerArgs + when (platform) {
|
||||
KotlinPlatform.JVM -> listOf("", "linux", "darwin").map {
|
||||
KotlinPlatform.JVM -> listOf("", "linux", "darwin", "win32").map {
|
||||
val javaHome = System.getProperty("java.home")
|
||||
"-I$javaHome/../include/$it"
|
||||
}
|
||||
|
||||
+16
-8
@@ -61,11 +61,11 @@ private fun parseArgs(args: Array<String>): Map<String, List<String>> {
|
||||
|
||||
private val host: String by lazy {
|
||||
val os = System.getProperty("os.name")
|
||||
when (os) {
|
||||
"Linux" -> "linux"
|
||||
"Windows" -> "win"
|
||||
"Mac OS X" -> "osx"
|
||||
"FreeBSD" -> "freebsd"
|
||||
when {
|
||||
os == "Linux" -> "linux"
|
||||
os.startsWith("Windows") -> "mingw"
|
||||
os == "Mac OS X" -> "osx"
|
||||
os == "FreeBSD" -> "freebsd"
|
||||
else -> {
|
||||
throw IllegalArgumentException("we don't know ${os} value")
|
||||
}
|
||||
@@ -87,7 +87,8 @@ private val knownTargets = mapOf(
|
||||
"iphone_sim" to "ios_sim",
|
||||
"ios_sim" to "ios_sim",
|
||||
"raspberrypi" to "raspberrypi",
|
||||
"android_arm32" to "android_arm32"
|
||||
"android_arm32" to "android_arm32",
|
||||
"mingw" to "mingw"
|
||||
)
|
||||
|
||||
|
||||
@@ -205,9 +206,13 @@ private fun Properties.defaultCompilerOpts(target: String, dependencies: String)
|
||||
val llvmHomeDir = getHostSpecific("llvmHome")!!
|
||||
val llvmHome = "$dependencies/$llvmHomeDir"
|
||||
|
||||
System.load("$llvmHome/lib/${System.mapLibraryName("clang")}")
|
||||
val libclang = when (host) {
|
||||
"mingw" -> "$llvmHome/bin/libclang.dll"
|
||||
else -> "$llvmHome/lib/${System.mapLibraryName("clang")}"
|
||||
}
|
||||
System.load(libclang)
|
||||
|
||||
val llvmVersion = getProperty("llvmVersion")!!
|
||||
val llvmVersion = getHostSpecific("llvmVersion")!!
|
||||
|
||||
// StubGenerator passes the arguments to libclang which
|
||||
// works not exactly the same way as the clang binary and
|
||||
@@ -234,6 +239,9 @@ private fun Properties.defaultCompilerOpts(target: String, dependencies: String)
|
||||
return archSelector + commonArgs + listOf(
|
||||
"-B$binDir", "--gcc-toolchain=$targetToolchain")
|
||||
}
|
||||
"mingw" -> {
|
||||
return archSelector + commonArgs + listOf("-B$targetSysRoot/bin")
|
||||
}
|
||||
else -> error("Unexpected target: ${target}")
|
||||
}
|
||||
}
|
||||
|
||||
+5
-3
@@ -62,9 +62,11 @@ class Distribution(val config: CompilerConfiguration) {
|
||||
val llvmLib = "$llvmHome/lib"
|
||||
|
||||
val llvmLto = "$llvmBin/llvm-lto"
|
||||
val libLTO = when (TargetManager.host) {
|
||||
KonanTarget.MACBOOK -> "$llvmLib/libLTO.dylib"
|
||||
KonanTarget.LINUX -> "$llvmLib/libLTO.so"
|
||||
|
||||
private val libLTODir = when (TargetManager.host) {
|
||||
KonanTarget.MACBOOK, KonanTarget.LINUX -> llvmLib
|
||||
KonanTarget.MINGW -> llvmBin
|
||||
else -> error("Don't know libLTO location for this platform.")
|
||||
}
|
||||
val libLTO = "$libLTODir/${System.mapLibraryName("LTO")}"
|
||||
}
|
||||
|
||||
+10
-4
@@ -23,6 +23,7 @@ enum class KonanTarget(val suffix: String, var enabled: Boolean = false) {
|
||||
IPHONE("ios"),
|
||||
IPHONE_SIM("ios_sim"),
|
||||
LINUX("linux"),
|
||||
MINGW("mingw"),
|
||||
MACBOOK("osx"),
|
||||
RASPBERRYPI("raspberrypi")
|
||||
}
|
||||
@@ -40,6 +41,9 @@ class TargetManager(val config: CompilerConfiguration) {
|
||||
KonanTarget.RASPBERRYPI.enabled = true
|
||||
KonanTarget.ANDROID_ARM32.enabled = true
|
||||
}
|
||||
KonanTarget.MINGW -> {
|
||||
KonanTarget.MINGW.enabled = true
|
||||
}
|
||||
KonanTarget.MACBOOK -> {
|
||||
KonanTarget.MACBOOK.enabled = true
|
||||
KonanTarget.IPHONE.enabled = true
|
||||
@@ -88,10 +92,11 @@ class TargetManager(val config: CompilerConfiguration) {
|
||||
companion object {
|
||||
fun host_os(): String {
|
||||
val javaOsName = System.getProperty("os.name")
|
||||
return when (javaOsName) {
|
||||
"Mac OS X" -> "osx"
|
||||
"Linux" -> "linux"
|
||||
else -> error("Unknown operating system: ${javaOsName}")
|
||||
return when {
|
||||
javaOsName == "Mac OS X" -> "osx"
|
||||
javaOsName == "Linux" -> "linux"
|
||||
javaOsName.startsWith("Windows") -> "windows"
|
||||
else -> error("Unknown operating system: ${javaOsName}")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,6 +113,7 @@ class TargetManager(val config: CompilerConfiguration) {
|
||||
val host: KonanTarget = when (host_os()) {
|
||||
"osx" -> KonanTarget.MACBOOK
|
||||
"linux" -> KonanTarget.LINUX
|
||||
"windows" -> KonanTarget.MINGW
|
||||
else -> error("Unknown host target: ${host_os()} ${host_arch()}")
|
||||
}
|
||||
}
|
||||
|
||||
+25
@@ -45,6 +45,8 @@ internal abstract class PlatformFlags(val distribution: Distribution) {
|
||||
open val linkerKonanFlags
|
||||
= propertyTargetList("linkerKonanFlags")
|
||||
|
||||
open val useCompilerDriverAsLinker: Boolean get() = false // TODO: refactor.
|
||||
|
||||
abstract fun linkCommand(objectFiles: List<ObjectFile>,
|
||||
executable: ExecutableFile, optimize: Boolean): List<String>
|
||||
|
||||
@@ -65,6 +67,8 @@ internal open class AndroidPlatform(distribution: Distribution)
|
||||
private val prefix = "${distribution.targetToolchain}/bin/"
|
||||
private val clang = "$prefix/clang"
|
||||
|
||||
override val useCompilerDriverAsLinker: Boolean get() = true
|
||||
|
||||
override fun linkCommand(objectFiles: List<String>, executable: String, optimize: Boolean): List<String> {
|
||||
return mutableListOf<String>(clang, "-o", executable, "-fPIC", "-shared") +
|
||||
objectFiles +
|
||||
@@ -140,6 +144,21 @@ internal open class LinuxBasedPlatform(distribution: Distribution)
|
||||
}
|
||||
}
|
||||
|
||||
internal open class MingwPlatform(distribution: Distribution)
|
||||
: PlatformFlags(distribution) {
|
||||
|
||||
val linker = "${distribution.targetToolchain}/bin/clang++"
|
||||
|
||||
override val useCompilerDriverAsLinker: Boolean get() = true
|
||||
|
||||
override fun linkCommand(objectFiles: List<String>, executable: String, optimize: Boolean): List<String> {
|
||||
return listOf(linker, "-o", executable) +
|
||||
objectFiles +
|
||||
(if (optimize) linkerOptimizationFlags else {listOf<String>()}) +
|
||||
linkerKonanFlags
|
||||
}
|
||||
}
|
||||
|
||||
internal class LinkStage(val context: Context) {
|
||||
|
||||
val config = context.config.configuration
|
||||
@@ -153,6 +172,8 @@ internal class LinkStage(val context: Context) {
|
||||
MacOSBasedPlatform(distribution)
|
||||
KonanTarget.ANDROID_ARM32 ->
|
||||
AndroidPlatform(distribution)
|
||||
KonanTarget.MINGW ->
|
||||
MingwPlatform(distribution)
|
||||
else ->
|
||||
error("Unexpected target platform: ${context.config.targetManager.current}")
|
||||
}
|
||||
@@ -182,6 +203,10 @@ internal class LinkStage(val context: Context) {
|
||||
}
|
||||
|
||||
fun asLinkerArgs(args: List<String>): List<String> {
|
||||
if (platform.useCompilerDriverAsLinker) {
|
||||
return args
|
||||
}
|
||||
|
||||
val result = mutableListOf<String>()
|
||||
for (arg in args) {
|
||||
// If user passes compiler arguments to us - transform them to linker ones.
|
||||
|
||||
+4
-1
@@ -20,6 +20,7 @@ package org.jetbrains.kotlin.backend.konan.llvm
|
||||
import kotlinx.cinterop.*
|
||||
import llvm.*
|
||||
import org.jetbrains.kotlin.backend.konan.Context
|
||||
import org.jetbrains.kotlin.backend.konan.KonanTarget
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
@@ -151,7 +152,9 @@ internal class CodeGenerator(override val context: Context) : ContextUtils {
|
||||
|
||||
private val needSlots: Boolean
|
||||
get() {
|
||||
return slotCount > 1 || localAllocs > 0
|
||||
return slotCount > 1 || localAllocs > 0 ||
|
||||
// Prevent empty cleanup on mingw to workaround LLVM bug:
|
||||
context.config.targetManager.current == KonanTarget.MINGW
|
||||
}
|
||||
|
||||
private fun releaseVars() {
|
||||
|
||||
+7
-1
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.konan.llvm
|
||||
import kotlinx.cinterop.*
|
||||
import llvm.*
|
||||
import org.jetbrains.kotlin.backend.konan.Context
|
||||
import org.jetbrains.kotlin.backend.konan.KonanTarget
|
||||
import org.jetbrains.kotlin.backend.konan.hash.GlobalHash
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
@@ -258,7 +259,12 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) {
|
||||
val throwExceptionFunction = importRtFunction("ThrowException")
|
||||
val appendToInitalizersTail = importRtFunction("AppendToInitializersTail")
|
||||
|
||||
val gxxPersonalityFunction = externalNounwindFunction("__gxx_personality_v0", functionType(int32Type, true))
|
||||
private val personalityFunctionName = when (context.config.targetManager.current) {
|
||||
KonanTarget.MINGW -> "__gxx_personality_seh0"
|
||||
else -> "__gxx_personality_v0"
|
||||
}
|
||||
|
||||
val gxxPersonalityFunction = externalNounwindFunction(personalityFunctionName, functionType(int32Type, true))
|
||||
val cxaBeginCatchFunction = externalNounwindFunction("__cxa_begin_catch", functionType(int8TypePtr, false, int8TypePtr))
|
||||
val cxaEndCatchFunction = externalNounwindFunction("__cxa_end_catch", functionType(voidType, false))
|
||||
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
#
|
||||
|
||||
# TODO: Do we need a $variable substitution mechanism here?
|
||||
llvmVersion = 3.9.0
|
||||
dependenciesUrl = http://download.jetbrains.com/kotlin/native
|
||||
|
||||
# Mac OS X.
|
||||
llvmVersion.osx = 3.9.0
|
||||
llvmHome.osx = clang-llvm-3.9.0-darwin-macos
|
||||
targetToolchain.osx = clang-llvm-3.9.0-darwin-macos
|
||||
|
||||
@@ -79,6 +79,7 @@ osVersionMinFlagClang.ios_sim = -mios-simulator-version-min
|
||||
osVersionMin.ios_sim = 8.0
|
||||
|
||||
# Linux x86-64.
|
||||
llvmVersion.linux = 3.9.0
|
||||
llvmHome.linux = clang-llvm-3.9.0-linux-x86-64
|
||||
targetToolchain.linux = target-gcc-toolchain-3-linux-x86-64/x86_64-unknown-linux-gnu
|
||||
|
||||
@@ -150,4 +151,23 @@ 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++
|
||||
linkerKonanFlags.android_arm32 = -lm -latomic -lstdc++
|
||||
|
||||
# Windows x86-64, based on mingw-w64.
|
||||
llvmVersion.mingw = 3.9.1
|
||||
llvmHome.mingw = msys2-mingw-w64-x86_64-gcc-6.3.0-clang-llvm-3.9.1-windows-x86-64
|
||||
targetToolchain.mingw = msys2-mingw-w64-x86_64-gcc-6.3.0-clang-llvm-3.9.1-windows-x86-64
|
||||
|
||||
quadruple.mingw = x86_64-w64-mingw32
|
||||
targetSysRoot.mingw = msys2-mingw-w64-x86_64-gcc-6.3.0-clang-llvm-3.9.1-windows-x86-64
|
||||
libffiDir.mingw = libffi-3.2.1-mingw-w64-x86-64
|
||||
llvmLtoFlags.mingw = -exported-symbol=Konan_main
|
||||
llvmLtoOptFlags.mingw = -O3 -function-sections
|
||||
llvmLtoNooptFlags.mingw = -O1
|
||||
linkerKonanFlags.mingw = -static-libgcc -static-libstdc++ \
|
||||
-Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamic
|
||||
linkerOptimizationFlags.mingw = -Wl,--gc-sections
|
||||
entrySelector.mingw = -Wl,--defsym,main=Konan_main
|
||||
dependencies.mingw = \
|
||||
msys2-mingw-w64-x86_64-gcc-6.3.0-clang-llvm-3.9.1-windows-x86-64 \
|
||||
libffi-3.2.1-mingw-w64-x86-64
|
||||
|
||||
@@ -30,6 +30,9 @@ linkerOpts.linux=\
|
||||
-Wl,-z,noexecstack \
|
||||
-lrt -ldl -lpthread -lz -lm
|
||||
|
||||
linkerOpts.mingw = -lole32 -luuid -static-libgcc -static-libstdc++ \
|
||||
-Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamic
|
||||
|
||||
excludedFunctions = LLVMInitializeAllAsmParsers LLVMInitializeAllAsmPrinters LLVMInitializeAllDisassemblers \
|
||||
LLVMInitializeAllTargetInfos LLVMInitializeAllTargetMCs LLVMInitializeAllTargets LLVMInitializeNativeTarget \
|
||||
LLVMInitializeNativeAsmParser LLVMInitializeNativeAsmPrinter LLVMInitializeNativeDisassembler
|
||||
|
||||
@@ -367,11 +367,19 @@ task hello3(type: RunKonanTest) {
|
||||
}
|
||||
|
||||
task hello4(type: RunKonanTest) {
|
||||
if (isWindows()) {
|
||||
// To be investigated.
|
||||
disabled = true
|
||||
}
|
||||
goldValue = "Hello\nПока\n"
|
||||
source = "runtime/basic/hello4.kt"
|
||||
}
|
||||
|
||||
task tostring0(type: RunKonanTest) {
|
||||
if (isWindows()) {
|
||||
// To be investigated.
|
||||
disabled = true
|
||||
}
|
||||
goldValue = "127\n-1\n239\nA\nЁ\nト\n1122334455\n112233445566778899\n3.14159\n1E+27\n1E-300\ntrue\nfalse\n"
|
||||
source = "runtime/basic/tostring0.kt"
|
||||
}
|
||||
@@ -387,6 +395,10 @@ task tostring2(type: RunKonanTest) {
|
||||
}
|
||||
|
||||
task tostring3(type: RunKonanTest) {
|
||||
if (isWindows()) {
|
||||
// Double.toString()
|
||||
disabled = true
|
||||
}
|
||||
goldValue = "-128\n127\n-32768\n32767\n" +
|
||||
"-2147483648\n2147483647\n-9223372036854775808\n9223372036854775807\n" +
|
||||
"1.4013E-45\n3.40282E+38\n-INF\nINF\n" +
|
||||
@@ -1212,11 +1224,19 @@ task moderately_large_array1(type: RunKonanTest) {
|
||||
}
|
||||
|
||||
task string_builder0(type: RunKonanTest) {
|
||||
if (isWindows()) {
|
||||
// To be investigated.
|
||||
disabled = true
|
||||
}
|
||||
goldValue = "OK\n"
|
||||
source = "runtime/text/string_builder0.kt"
|
||||
}
|
||||
|
||||
task string0(type: RunKonanTest) {
|
||||
if (isWindows()) {
|
||||
// To be investigated.
|
||||
disabled = true
|
||||
}
|
||||
goldValue = "true\ntrue\nПРИВЕТ\nпривет\nПока\ntrue\n"
|
||||
source = "runtime/text/string0.kt"
|
||||
}
|
||||
@@ -1860,7 +1880,8 @@ task interop4(type: RunInteropKonanTest) {
|
||||
}
|
||||
|
||||
task interop_echo_server(type: RunInteropKonanTest) {
|
||||
if (isLinux()) {
|
||||
if (!isMac()) {
|
||||
// Not supported or not tested.
|
||||
disabled = true
|
||||
}
|
||||
run = false
|
||||
|
||||
+65
-17
@@ -42,17 +42,38 @@ void setupClang(Project project) {
|
||||
|
||||
project.plugins.withType(NativeComponentPlugin) {
|
||||
project.model {
|
||||
toolChains {
|
||||
clang(Clang) {
|
||||
clangPath.each {
|
||||
path it
|
||||
if (isWindows()) {
|
||||
platforms {
|
||||
host {
|
||||
architecture 'x86_64'
|
||||
}
|
||||
}
|
||||
|
||||
eachPlatform { // TODO: will not work when cross-compiling
|
||||
[cCompiler, cppCompiler, linker].each {
|
||||
it.withArguments { it.addAll(hostClangArgs) }
|
||||
components {
|
||||
withType(NativeComponentSpec) {
|
||||
targetPlatform 'host'
|
||||
}
|
||||
}
|
||||
|
||||
toolChains {
|
||||
gcc(Gcc) {
|
||||
path "$mingwWithLlvmDir/bin"
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
toolChains {
|
||||
clang(Clang) {
|
||||
clangPath.each {
|
||||
path it
|
||||
}
|
||||
|
||||
eachPlatform { // TODO: will not work when cross-compiling
|
||||
[cCompiler, cppCompiler, linker].each {
|
||||
it.withArguments { it.addAll(hostClangArgs) }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -89,7 +110,12 @@ void setupCompilationFlags() {
|
||||
"-I$raspberrypiSysrootDir/usr/include/c++/4.8.3",
|
||||
"-I$raspberrypiSysrootDir/usr/include/c++/4.8.3/arm-linux-gnueabihf"]
|
||||
]
|
||||
} else {
|
||||
} else if (isWindows()) {
|
||||
ext.host = "mingw"
|
||||
ext.targetArgs <<
|
||||
[(ext.host):
|
||||
["-target", "x86_64-w64-mingw32", "--sysroot=${mingwWithLlvmDir}", "-DOMIT_BACKTRACE"]]
|
||||
} else {
|
||||
ext.host = "macbook"
|
||||
ext.targetArgs <<
|
||||
[(ext.host):
|
||||
@@ -102,15 +128,19 @@ void setupCompilationFlags() {
|
||||
// ["-stdlib=libc++", "-isysroot", "$iphoneSimSysrootDir", "-miphoneos-version-min=8.0.0"],
|
||||
]
|
||||
}
|
||||
ext.targetArgs << [
|
||||
"android_arm32":
|
||||
["-target", getTargetArg("android_arm32"),
|
||||
"--sysroot=$android_arm32SysrootDir",
|
||||
"-D__ANDROID__", "-DUSE_GCC_UNWIND=1", "-DELFSIZE=32",
|
||||
// HACKS!
|
||||
"-I$android_arm32SysrootDir/usr/include/c++/4.9.x",
|
||||
"-I$android_arm32SysrootDir/usr/include/c++/4.9.x/arm-linux-androideabi"]
|
||||
]
|
||||
|
||||
if (isLinux() || isMac()) {
|
||||
ext.targetArgs << [
|
||||
"android_arm32":
|
||||
["-target", getTargetArg("android_arm32"),
|
||||
"--sysroot=$android_arm32SysrootDir",
|
||||
"-D__ANDROID__", "-DUSE_GCC_UNWIND=1", "-DELFSIZE=32",
|
||||
// HACKS!
|
||||
"-I$android_arm32SysrootDir/usr/include/c++/4.9.x",
|
||||
"-I$android_arm32SysrootDir/usr/include/c++/4.9.x/arm-linux-androideabi"]
|
||||
]
|
||||
}
|
||||
|
||||
ext.targetList = ext.targetArgs.keySet() as List
|
||||
|
||||
if (isLinux()) {
|
||||
@@ -118,6 +148,8 @@ void setupCompilationFlags() {
|
||||
ext.clangArgs.addAll([
|
||||
"--gcc-toolchain=$gccToolchainDir"
|
||||
])
|
||||
} else if (isWindows()) {
|
||||
binDir = "$mingwWithLlvmDir/bin"
|
||||
} else {
|
||||
binDir = "$macbookSysrootDir/usr/bin"
|
||||
}
|
||||
@@ -127,6 +159,9 @@ void setupCompilationFlags() {
|
||||
|
||||
ext.clangPath << binDir
|
||||
ext.jvmArgs = ["-ea"]
|
||||
|
||||
File jdkHome = new File(System.getProperty('java.home')).absoluteFile.parentFile
|
||||
ext.hostCompilerArgsForJni = ["", jniHostPlatformIncludeDir()].collect { "-I$jdkHome/include/$it" } as String[]
|
||||
}
|
||||
|
||||
void loadLocalProperties() {
|
||||
@@ -157,6 +192,10 @@ class PlatformInfo {
|
||||
return osName == 'Mac OS X'
|
||||
}
|
||||
|
||||
boolean isWindows() {
|
||||
return osName.startsWith('Windows');
|
||||
}
|
||||
|
||||
boolean isLinux() {
|
||||
return osName == 'Linux'
|
||||
}
|
||||
@@ -176,6 +215,15 @@ class PlatformInfo {
|
||||
String simpleOsName() {
|
||||
if (isMac()) return 'macos'
|
||||
if (isLinux()) return 'linux'
|
||||
if (isWindows()) return 'windows'
|
||||
throw unsupportedPlatformException()
|
||||
}
|
||||
|
||||
String jniHostPlatformIncludeDir() {
|
||||
if (isMac()) return "darwin"
|
||||
if (isLinux()) return "linux"
|
||||
if (isWindows()) return "win32"
|
||||
|
||||
throw unsupportedPlatformException()
|
||||
}
|
||||
|
||||
|
||||
@@ -238,7 +238,7 @@ fun handleExceptionContinuation(x: (Throwable) -> Unit): Continuation<Any?> = ob
|
||||
"Test failed. Expected exit status: $expectedExitStatus, actual: ${execResult.exitValue}")
|
||||
}
|
||||
|
||||
if (goldValue != null && goldValue != out.toString()) {
|
||||
if (goldValue != null && goldValue != out.toString().replace(System.lineSeparator(), "\n")) {
|
||||
throw new TestFailedException("Test failed. Expected output: $goldValue, actual output: ${out.toString()}")
|
||||
}
|
||||
}
|
||||
@@ -266,6 +266,9 @@ class RunDriverKonanTest extends KonanTest {
|
||||
RunDriverKonanTest() {
|
||||
super()
|
||||
dependsOn(project.rootProject.tasks['cross_dist'])
|
||||
if (project.isWindows()) {
|
||||
this.disabled = true
|
||||
}
|
||||
}
|
||||
|
||||
void compileTest(List<String> filesToCompile, String exe) {
|
||||
|
||||
Vendored
+20
-6
@@ -111,6 +111,8 @@ abstract class NativeDep extends DefaultTask {
|
||||
return 'darwin-macos'
|
||||
} else if (project.isLinux() && project.isAmd64()) {
|
||||
return 'linux-x86-64'
|
||||
} else if (project.isWindows() && project.isAmd64()) {
|
||||
return 'windows-x86-64'
|
||||
} else {
|
||||
throw project.unsupportedPlatformException()
|
||||
}
|
||||
@@ -230,10 +232,6 @@ void dependencyTask(String target, DependencyTaskKind kind) {
|
||||
}
|
||||
}
|
||||
|
||||
task llvm(type: HelperNativeDep) {
|
||||
baseName = "clang-llvm-$llvmVersion-$host"
|
||||
}
|
||||
|
||||
if (isLinux()) {
|
||||
// The gcc toolchain contains the sysroot for linux platform.
|
||||
task gccToolchain(type: HelperNativeDep) {
|
||||
@@ -243,6 +241,12 @@ if (isLinux()) {
|
||||
dependencyTask("linux", LIBFFI)
|
||||
dependencyTask("raspberrypi", SYSROOT)
|
||||
dependencyTask("raspberrypi", LIBFFI)
|
||||
} else if (isWindows()) {
|
||||
task mingwWithLlvm(type: HelperNativeDep) {
|
||||
baseName = "msys2-mingw-w64-x86_64-gcc-6.3.0-clang-llvm-3.9.1-$host"
|
||||
}
|
||||
|
||||
dependencyTask("mingw", LIBFFI)
|
||||
} else {
|
||||
dependencyTask("macbook", SYSROOT)
|
||||
dependencyTask("macbook", LIBFFI)
|
||||
@@ -253,8 +257,14 @@ if (isLinux()) {
|
||||
// dependencyTask("iphoneSim", SYSROOT)
|
||||
}
|
||||
|
||||
dependencyTask("android_arm32", SYSROOT)
|
||||
dependencyTask("android_arm32", LIBFFI)
|
||||
if (isLinux() || isMac()) {
|
||||
task llvm(type: HelperNativeDep) {
|
||||
baseName = "clang-llvm-$llvmVersion-$host"
|
||||
}
|
||||
|
||||
dependencyTask("android_arm32", SYSROOT)
|
||||
dependencyTask("android_arm32", LIBFFI)
|
||||
}
|
||||
|
||||
task update(type: Copy) {
|
||||
dependsOn tasks.withType(NativeDep)
|
||||
@@ -263,3 +273,7 @@ task update(type: Copy) {
|
||||
tasks.withType(TgzNativeDep) {
|
||||
rootProject.ext.set("${name}Dir", outputDir.path)
|
||||
}
|
||||
|
||||
if (isWindows()) {
|
||||
rootProject.ext.set("llvmDir", mingwWithLlvmDir)
|
||||
}
|
||||
|
||||
@@ -1057,6 +1057,16 @@ KInt Kotlin_String_lastIndexOfChar(KString thiz, KChar ch, KInt fromIndex) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
static void* memmem(const void* big, size_t big_len, const void* little, size_t little_len) {
|
||||
for (size_t i = 0; i + little_len <= big_len; ++i) {
|
||||
void* pos = ((char*)big) + i;
|
||||
if (memcmp(little, pos, little_len) == 0) return pos;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
// TODO: or code up Knuth-Moris-Pratt.
|
||||
KInt Kotlin_String_indexOfString(KString thiz, KString other, KInt fromIndex) {
|
||||
if (fromIndex < 0 || fromIndex > thiz->count_ ||
|
||||
|
||||
Reference in New Issue
Block a user