[K/N] Proper MinGW cross-compilation support

This commit is contained in:
Sergey Bogolepov
2021-08-09 20:22:37 +07:00
committed by Space
parent 6953d29922
commit 1315fdaf56
4 changed files with 43 additions and 20 deletions
+24 -7
View File
@@ -874,11 +874,14 @@ runtimeDefinitions.android_x64 = __ANDROID__ USE_GCC_UNWIND=1 USE_ELF_SYMBOLS=1
# Windows x86-64, based on mingw-w64.
llvmHome.mingw_x64 = $llvm.mingw_x64.dev
targetToolchain.mingw_x64 = msys2-mingw-w64-x86_64-1
libffiDir.mingw_x64 = libffi-3.3-windows-x64-1
windowsKitParts.mingw_x64 = windows-kit-x64-v1-alpha2
msvcParts.mingw_x64 = msvc-x64-v1-alpha2
lldLocation.mingw_x64 = lld-12.0.1-windows-x64/ld.lld.exe
linker.mingw_x64 = lld-12.0.1-windows-x64/ld.lld.exe
linker.linux_x64-mingw_x64 = $targetToolchain.linux_x64-mingw_x64/bin/ld.lld
linker.macos_x64-mingw_x64 = $targetToolchain.macos_x64-mingw_x64/bin/ld.lld
linker.macos_arm64-mingw_x64 = $targetToolchain.macos_arm64-mingw_x64/bin/ld.lld
windows-kit-x64-v1-alpha2.default = \
remote:internal
@@ -886,13 +889,19 @@ windows-kit-x64-v1-alpha2.default = \
msvc-x64-v1-alpha2.default = \
remote:internal
targetToolchain.linux_x64-mingw_x64 = msys2-mingw-w64-x86_64-1
targetToolchain.macos_x64-mingw_x64 = msys2-mingw-w64-x86_64-1
targetToolchain.mingw_x64 = msys2-mingw-w64-x86_64-1
targetToolchain.linux_x64-mingw_x64 = $llvmHome.linux_x64
targetToolchain.macos_x64-mingw_x64 = $llvmHome.macos_x64
targetToolchain.macos_arm64-mingw_x64 = $llvmHome.macos_arm64
# for Windows we are currently using LLDB 9
dependencies.mingw_x64 = \
lldb-2-windows \
lld-12.0.1-windows-x64 \
msys2-mingw-w64-x86_64-1
dependencies.linux_x64-mingw_x64 = msys2-mingw-w64-x86_64-1
dependencies.macos_x64-mingw_x64 = msys2-mingw-w64-x86_64-1
dependencies.macos_arm64-mingw_x64 = msys2-mingw-w64-x86_64-1
targetTriple.mingw_x64 = x86_64-pc-windows-gnu
targetSysRoot.mingw_x64 = msys2-mingw-w64-x86_64-1
@@ -916,16 +925,24 @@ runtimeDefinitions.mingw_x64 = USE_GCC_UNWIND=1 USE_PE_COFF_SYMBOLS=1 KONAN_WIND
# Windows i686, based on mingw-w64.
targetToolchain.mingw_x64-mingw_x86 = msys2-mingw-w64-i686-clang-llvm-lld-compiler_rt-8.0.1
lldLocation.mingw_x86 = lld-12.0.1-windows-x64/ld.lld.exe
targetToolchain.linux_x64-mingw_x86 = $llvmHome.linux_x64
targetToolchain.macos_x64-mingw_x86 = $llvmHome.macos_x64
targetToolchain.macos_arm64-mingw_x86 = $llvmHome.macos_arm64
linker.mingw_x64-mingw_x86 = lld-12.0.1-windows-x64/ld.lld.exe
linker.linux_x64-mingw_x86 = $targetToolchain.linux_x64-mingw_x86/bin/ld.lld
linker.macos_x64-mingw_x86 = $targetToolchain.macos_x64-mingw_x86/bin/ld.lld
linker.macos_arm64-mingw_x86 = $targetToolchain.macos_arm64-mingw_x86/bin/ld.lld
dependencies.mingw_x64-mingw_x86 = \
msys2-mingw-w64-i686-clang-llvm-lld-compiler_rt-8.0.1 \
lld-12.0.1-windows-x64
targetToolchain.linux_x64-mingw_x86 = msys2-mingw-w64-i686-clang-llvm-lld-compiler_rt-8.0.1
targetToolchain.macos_x64-mingw_x86 = msys2-mingw-w64-i686-clang-llvm-lld-compiler_rt-8.0.1
dependencies.linux_x64-mingw_x86 = \
msys2-mingw-w64-i686-clang-llvm-lld-compiler_rt-8.0.1
dependencies.macos_x64-mingw_x86 = \
msys2-mingw-w64-i686-clang-llvm-lld-compiler_rt-8.0.1
dependencies.macos_arm64-mingw_x86 = \
msys2-mingw-w64-i686-clang-llvm-lld-compiler_rt-8.0.1
targetTriple.mingw_x86 = i686-pc-windows-gnu
targetSysRoot.mingw_x86 = msys2-mingw-w64-i686-clang-llvm-lld-compiler_rt-8.0.1
@@ -105,8 +105,8 @@ interface AppleConfigurables : Configurables, ClangFlags {
}
interface MingwConfigurables : Configurables, ClangFlags {
val lldLocation get() = targetString("lldLocation")!!
val absoluteLldLocation get() = absolute(lldLocation)
val linker get() = hostTargetString("linker")!!
val absoluteLinker get() = absolute(linker)
val windowsKit: WindowsKit
val msvc: Msvc
@@ -422,8 +422,13 @@ class GccBasedLinker(targetProperties: GccConfigurables)
class MingwLinker(targetProperties: MingwConfigurables)
: LinkerFlags(targetProperties), MingwConfigurables by targetProperties {
private val ar = "$absoluteTargetToolchain/bin/ar"
private val linker = "$absoluteLlvmHome/bin/clang++"
// TODO: Maybe always use llvm-ar?
private val ar = if (HostManager.hostIsMingw) {
"$absoluteTargetToolchain/bin/ar"
} else {
"$absoluteLlvmHome/bin/llvm-ar"
}
private val clang = "$absoluteLlvmHome/bin/clang++"
override val useCompilerDriverAsLinker: Boolean get() = true
@@ -483,12 +488,7 @@ class MingwLinker(targetProperties: MingwConfigurables)
+additionalArguments
}
return listOf(when {
HostManager.hostIsMingw -> Command(linker)
else -> Command("wine64", "$linker.exe")
}.constructLinkerArguments(
additionalArguments = listOf("-fuse-ld=$absoluteLldLocation")
))
return listOf(Command(clang).constructLinkerArguments(additionalArguments = listOf("-fuse-ld=$absoluteLinker")))
}
}
@@ -53,6 +53,8 @@ open class HostManager(
LINUX_ARM64,
LINUX_MIPS32,
LINUX_MIPSEL32,
MINGW_X86,
MINGW_X64,
ANDROID_X86,
ANDROID_X64,
ANDROID_ARM32,
@@ -89,6 +91,8 @@ open class HostManager(
LINUX_X64,
LINUX_ARM32_HFP,
LINUX_ARM64,
MINGW_X86,
MINGW_X64,
ANDROID_X86,
ANDROID_X64,
ANDROID_ARM32,
@@ -113,6 +117,8 @@ open class HostManager(
LINUX_X64,
LINUX_ARM32_HFP,
LINUX_ARM64,
MINGW_X86,
MINGW_X64,
ANDROID_X86,
ANDROID_X64,
ANDROID_ARM32,
@@ -122,9 +128,9 @@ open class HostManager(
)
private val enabledExperimentalByHost: Map<KonanTarget, Set<KonanTarget>> = mapOf(
LINUX_X64 to setOf(MINGW_X86, MINGW_X64) + zephyrSubtargets,
MACOS_X64 to setOf(MINGW_X86, MINGW_X64) + zephyrSubtargets,
MINGW_X64 to setOf<KonanTarget>() + zephyrSubtargets,
LINUX_X64 to zephyrSubtargets.toSet(),
MACOS_X64 to zephyrSubtargets.toSet(),
MINGW_X64 to zephyrSubtargets.toSet(),
MACOS_ARM64 to emptySet()
)