From 1315fdaf563a81eee2bc5a8059045aafcf6f9412 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Mon, 9 Aug 2021 20:22:37 +0700 Subject: [PATCH] [K/N] Proper MinGW cross-compilation support --- kotlin-native/konan/konan.properties | 31 ++++++++++++++----- .../kotlin/konan/target/Configurables.kt | 4 +-- .../jetbrains/kotlin/konan/target/Linker.kt | 16 +++++----- .../kotlin/konan/target/HostManager.kt | 12 +++++-- 4 files changed, 43 insertions(+), 20 deletions(-) diff --git a/kotlin-native/konan/konan.properties b/kotlin-native/konan/konan.properties index 14de0684dce..32be2bad41a 100644 --- a/kotlin-native/konan/konan.properties +++ b/kotlin-native/konan/konan.properties @@ -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 diff --git a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt index f89ebbd4683..47c6b79cbee 100644 --- a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt +++ b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt @@ -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 diff --git a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt index b589587b453..c6e2fc7574c 100644 --- a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt +++ b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt @@ -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"))) } } diff --git a/native/utils/src/org/jetbrains/kotlin/konan/target/HostManager.kt b/native/utils/src/org/jetbrains/kotlin/konan/target/HostManager.kt index ba687a6341b..94a8e53632f 100644 --- a/native/utils/src/org/jetbrains/kotlin/konan/target/HostManager.kt +++ b/native/utils/src/org/jetbrains/kotlin/konan/target/HostManager.kt @@ -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> = mapOf( - LINUX_X64 to setOf(MINGW_X86, MINGW_X64) + zephyrSubtargets, - MACOS_X64 to setOf(MINGW_X86, MINGW_X64) + zephyrSubtargets, - MINGW_X64 to setOf() + zephyrSubtargets, + LINUX_X64 to zephyrSubtargets.toSet(), + MACOS_X64 to zephyrSubtargets.toSet(), + MINGW_X64 to zephyrSubtargets.toSet(), MACOS_ARM64 to emptySet() )