From c779ce2e6df25c606845a4f904ddf2fa38f7c61f Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Mon, 30 Nov 2020 17:52:10 +0700 Subject: [PATCH] Minor refactoring and reformatting of ClangArgs --- .../kotlin/konan/target/ClangArgs.kt | 264 ++++++++++-------- 1 file changed, 146 insertions(+), 118 deletions(-) diff --git a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt index 9216ffcda4e..a68cf734494 100644 --- a/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt +++ b/kotlin-native/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt @@ -33,151 +33,179 @@ internal object Android { class ClangArgs(private val configurables: Configurables) : Configurables by configurables { - val targetArg = if (configurables is TargetableConfigurables) + private val targetArg = if (configurables is TargetableConfigurables) configurables.targetArg else null + private val clangArgsSpecificForKonanSources + get() = runtimeDefinitions.map { "-D$it" } + + private val binDir = when (HostManager.host) { + KonanTarget.LINUX_X64 -> "$absoluteTargetToolchain/bin" + KonanTarget.MINGW_X64 -> "$absoluteTargetToolchain/bin" + KonanTarget.MACOS_X64 -> "$absoluteTargetToolchain/usr/bin" + else -> throw TargetSupportException("Unexpected host platform") + } + + // TODO: Use buildList + private val commonClangArgs: List = mutableListOf>().apply { + add(listOf("-B$binDir", "-fno-stack-protector")) + if (configurables is GccConfigurables) { + add(listOf("--gcc-toolchain=${configurables.absoluteGccToolchain}")) + } + if (configurables is TargetableConfigurables) { + add(listOf("-target", configurables.targetArg!!)) + } + }.flatten() + private val osVersionMin: String get() { require(configurables is AppleConfigurables) return configurables.osVersionMin } - val specificClangArgs: List - get() { - val result = when (target) { - KonanTarget.LINUX_X64 -> - listOf("--sysroot=$absoluteTargetSysRoot") + - if (target != host) listOf("-target", targetArg!!) else emptyList() + private val specificClangArgs: List = when (target) { + KonanTarget.LINUX_X64 -> listOf( + "--sysroot=$absoluteTargetSysRoot", + ) - KonanTarget.LINUX_ARM32_HFP -> - listOf("-target", targetArg!!, - "-mfpu=vfp", "-mfloat-abi=hard", - "--sysroot=$absoluteTargetSysRoot", - // TODO: those two are hacks. - "-I$absoluteTargetSysRoot/usr/include/c++/4.8.3", - "-I$absoluteTargetSysRoot/usr/include/c++/4.8.3/arm-linux-gnueabihf") + KonanTarget.LINUX_ARM32_HFP -> listOf( + "-mfpu=vfp", "-mfloat-abi=hard", + "--sysroot=$absoluteTargetSysRoot", + // TODO: those two are hacks. + "-I$absoluteTargetSysRoot/usr/include/c++/4.8.3", + "-I$absoluteTargetSysRoot/usr/include/c++/4.8.3/arm-linux-gnueabihf" + ) - KonanTarget.LINUX_ARM64 -> - listOf("-target", targetArg!!, - "--sysroot=$absoluteTargetSysRoot", - "-I$absoluteTargetSysRoot/usr/include/c++/7", - "-I$absoluteTargetSysRoot/usr/include/c++/7/aarch64-linux-gnu") + KonanTarget.LINUX_ARM64 -> listOf( + "--sysroot=$absoluteTargetSysRoot", + "-I$absoluteTargetSysRoot/usr/include/c++/7", + "-I$absoluteTargetSysRoot/usr/include/c++/7/aarch64-linux-gnu" + ) - KonanTarget.LINUX_MIPS32 -> - listOf("-target", targetArg!!, - "--sysroot=$absoluteTargetSysRoot", - "-I$absoluteTargetSysRoot/usr/include/c++/4.9.4", - "-I$absoluteTargetSysRoot/usr/include/c++/4.9.4/mips-unknown-linux-gnu") + KonanTarget.LINUX_MIPS32 -> listOf( + "--sysroot=$absoluteTargetSysRoot", + "-I$absoluteTargetSysRoot/usr/include/c++/4.9.4", + "-I$absoluteTargetSysRoot/usr/include/c++/4.9.4/mips-unknown-linux-gnu" + ) - KonanTarget.LINUX_MIPSEL32 -> - listOf("-target", targetArg!!, - "--sysroot=$absoluteTargetSysRoot", - "-I$absoluteTargetSysRoot/usr/include/c++/4.9.4", - "-I$absoluteTargetSysRoot/usr/include/c++/4.9.4/mipsel-unknown-linux-gnu") + KonanTarget.LINUX_MIPSEL32 -> listOf( + "--sysroot=$absoluteTargetSysRoot", + "-I$absoluteTargetSysRoot/usr/include/c++/4.9.4", + "-I$absoluteTargetSysRoot/usr/include/c++/4.9.4/mipsel-unknown-linux-gnu" + ) - KonanTarget.MINGW_X64, KonanTarget.MINGW_X86 -> - listOf("-target", targetArg!!, "--sysroot=$absoluteTargetSysRoot", "-Xclang", "-flto-visibility-public-std") + KonanTarget.MINGW_X64, KonanTarget.MINGW_X86 -> listOf( + "--sysroot=$absoluteTargetSysRoot", "-Xclang", + "-flto-visibility-public-std" + ) - KonanTarget.MACOS_X64 -> - listOf("--sysroot=$absoluteTargetSysRoot", "-mmacosx-version-min=$osVersionMin") + KonanTarget.MACOS_X64 -> listOf( + "--sysroot=$absoluteTargetSysRoot", + "-mmacosx-version-min=$osVersionMin" + ) - KonanTarget.IOS_ARM32 -> - listOf("-stdlib=libc++", "-arch", "armv7", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=$osVersionMin") + KonanTarget.IOS_ARM32 -> listOf( + "-stdlib=libc++", + "-arch", "armv7", + "-isysroot", absoluteTargetSysRoot, + "-miphoneos-version-min=$osVersionMin" + ) - KonanTarget.IOS_ARM64 -> - listOf("-stdlib=libc++", "-arch", "arm64", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=$osVersionMin") + KonanTarget.IOS_ARM64 -> listOf( + "-stdlib=libc++", + "-arch", "arm64", + "-isysroot", absoluteTargetSysRoot, + "-miphoneos-version-min=$osVersionMin" + ) - KonanTarget.IOS_X64 -> - listOf("-stdlib=libc++", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=$osVersionMin") + KonanTarget.IOS_X64 -> listOf( + "-stdlib=libc++", + "-isysroot", absoluteTargetSysRoot, + "-miphoneos-version-min=$osVersionMin" + ) - KonanTarget.TVOS_ARM64 -> - listOf("-stdlib=libc++", "-arch", "arm64", "-isysroot", absoluteTargetSysRoot, "-mtvos-version-min=$osVersionMin") + KonanTarget.TVOS_ARM64 -> listOf( + "-stdlib=libc++", + "-arch", "arm64", + "-isysroot", absoluteTargetSysRoot, + "-mtvos-version-min=$osVersionMin" + ) - KonanTarget.TVOS_X64 -> - listOf("-stdlib=libc++", "-isysroot", absoluteTargetSysRoot, "-mtvos-simulator-version-min=$osVersionMin") + KonanTarget.TVOS_X64 -> listOf( + "-stdlib=libc++", + "-isysroot", absoluteTargetSysRoot, + "-mtvos-simulator-version-min=$osVersionMin" + ) - KonanTarget.WATCHOS_ARM64, - KonanTarget.WATCHOS_ARM32 -> - listOf("-stdlib=libc++", "-arch", "armv7k", "-isysroot", absoluteTargetSysRoot, "-mwatchos-version-min=$osVersionMin") + KonanTarget.WATCHOS_ARM64, + KonanTarget.WATCHOS_ARM32 -> listOf( + "-stdlib=libc++", + "-arch", "armv7k", + "-isysroot", absoluteTargetSysRoot, + "-mwatchos-version-min=$osVersionMin" + ) - KonanTarget.WATCHOS_X86 -> - listOf("-stdlib=libc++", "-arch", "i386", "-isysroot", absoluteTargetSysRoot, "-mwatchos-simulator-version-min=$osVersionMin") + KonanTarget.WATCHOS_X86 -> listOf( + "-stdlib=libc++", + "-arch", "i386", + "-isysroot", absoluteTargetSysRoot, + "-mwatchos-simulator-version-min=$osVersionMin" + ) - KonanTarget.WATCHOS_X64 -> - listOf("-stdlib=libc++", "-isysroot", absoluteTargetSysRoot, "-mwatchos-simulator-version-min=$osVersionMin") + KonanTarget.WATCHOS_X64 -> listOf( + "-stdlib=libc++", + "-isysroot", absoluteTargetSysRoot, + "-mwatchos-simulator-version-min=$osVersionMin" + ) - KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, - KonanTarget.ANDROID_X86, KonanTarget.ANDROID_X64 -> { - val clangTarget = targetArg!! - val architectureDir = Android.architectureDirForTarget(target) - val toolchainSysroot = "$absoluteTargetToolchain/sysroot" - listOf("-target", clangTarget, - "-D__ANDROID_API__=${Android.API}", - "--sysroot=$absoluteTargetSysRoot/$architectureDir", - "-I$toolchainSysroot/usr/include/c++/v1", - "-I$toolchainSysroot/usr/include", - "-I$toolchainSysroot/usr/include/$clangTarget") - } - - // By default WASM target forces `hidden` visibility which causes linkage problems. - KonanTarget.WASM32 -> - listOf("-target", targetArg!!, - "-fno-rtti", - "-fno-exceptions", - "-fvisibility=default", - "-D_LIBCPP_ABI_VERSION=2", - "-D_LIBCPP_NO_EXCEPTIONS=1", - "-nostdinc", - "-Xclang", "-nobuiltininc", - "-Xclang", "-nostdsysteminc", - "-Xclang", "-isystem$absoluteTargetSysRoot/include/libcxx", - "-Xclang", "-isystem$absoluteTargetSysRoot/lib/libcxxabi/include", - "-Xclang", "-isystem$absoluteTargetSysRoot/include/compat", - "-Xclang", "-isystem$absoluteTargetSysRoot/include/libc") - - is KonanTarget.ZEPHYR -> - listOf("-target", targetArg!!, - "-fno-rtti", - "-fno-exceptions", - "-fno-asynchronous-unwind-tables", - "-fno-pie", - "-fno-pic", - "-fshort-enums", - "-nostdinc", - // TODO: make it a libGcc property? - // We need to get rid of wasm sysroot first. - "-isystem $targetToolchain/../lib/gcc/arm-none-eabi/7.2.1/include", - "-isystem $targetToolchain/../lib/gcc/arm-none-eabi/7.2.1/include-fixed", - "-isystem$absoluteTargetSysRoot/include/libcxx", - "-isystem$absoluteTargetSysRoot/include/libc" - ) + - (configurables as ZephyrConfigurables).constructClangArgs() - } - return result + KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, + KonanTarget.ANDROID_X86, KonanTarget.ANDROID_X64 -> { + val clangTarget = targetArg!! + val architectureDir = Android.architectureDirForTarget(target) + val toolchainSysroot = "$absoluteTargetToolchain/sysroot" + listOf( + "-D__ANDROID_API__=${Android.API}", + "--sysroot=$absoluteTargetSysRoot/$architectureDir", + "-I$toolchainSysroot/usr/include/c++/v1", + "-I$toolchainSysroot/usr/include", + "-I$toolchainSysroot/usr/include/$clangTarget" + ) } - val clangArgsSpecificForKonanSources - get() = runtimeDefinitions.map { "-D$it" } + // By default WASM target forces `hidden` visibility which causes linkage problems. + KonanTarget.WASM32 -> listOf( + "-fno-rtti", + "-fno-exceptions", + "-fvisibility=default", + "-D_LIBCPP_ABI_VERSION=2", + "-D_LIBCPP_NO_EXCEPTIONS=1", + "-nostdinc", + "-Xclang", "-nobuiltininc", + "-Xclang", "-nostdsysteminc", + "-Xclang", "-isystem$absoluteTargetSysRoot/include/libcxx", + "-Xclang", "-isystem$absoluteTargetSysRoot/lib/libcxxabi/include", + "-Xclang", "-isystem$absoluteTargetSysRoot/include/compat", + "-Xclang", "-isystem$absoluteTargetSysRoot/include/libc" + ) - private val host = HostManager.host - - private val binDir = when (host) { - KonanTarget.LINUX_X64 -> "$absoluteTargetToolchain/bin" - KonanTarget.MINGW_X64 -> "$absoluteTargetToolchain/bin" - KonanTarget.MACOS_X64 -> "$absoluteTargetToolchain/usr/bin" - else -> throw TargetSupportException("Unexpected host platform") + is KonanTarget.ZEPHYR -> listOf( + "-fno-rtti", + "-fno-exceptions", + "-fno-asynchronous-unwind-tables", + "-fno-pie", + "-fno-pic", + "-fshort-enums", + "-nostdinc", + // TODO: make it a libGcc property? + // We need to get rid of wasm sysroot first. + "-isystem $targetToolchain/../lib/gcc/arm-none-eabi/7.2.1/include", + "-isystem $targetToolchain/../lib/gcc/arm-none-eabi/7.2.1/include-fixed", + "-isystem$absoluteTargetSysRoot/include/libcxx", + "-isystem$absoluteTargetSysRoot/include/libc" + ) + (configurables as ZephyrConfigurables).constructClangArgs() } - private val extraHostClangArgs = - if (configurables is GccConfigurables) { - listOf("--gcc-toolchain=${configurables.absoluteGccToolchain}") - } else { - emptyList() - } - - val commonClangArgs = listOf("-B$binDir", "-fno-stack-protector") + extraHostClangArgs - val clangPaths = listOf("$absoluteLlvmHome/bin", binDir) private val jdkDir by lazy { @@ -202,10 +230,10 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con // We workaround the problem with -isystem flag below. listOf("-isystem", "$absoluteLlvmHome/lib/clang/$llvmVersion/include", *clangArgs) - val targetClangCmd + private val targetClangCmd = listOf("${absoluteLlvmHome}/bin/clang") + clangArgs - val targetClangXXCmd + private val targetClangXXCmd = listOf("${absoluteLlvmHome}/bin/clang++") + clangArgs fun clangC(vararg userArgs: String) = targetClangCmd + userArgs.asList()