Refactor Android, android_x64 support. (#3306)

This commit is contained in:
Nikolay Igotti
2019-09-04 14:50:14 +03:00
committed by GitHub
parent ee4dbfaa67
commit 66b813a6a2
11 changed files with 136 additions and 70 deletions
@@ -59,9 +59,9 @@ private class LlvmPipelineConfiguration(context: Context) {
KonanTarget.LINUX_ARM64 -> "generic"
KonanTarget.ANDROID_ARM32 -> "arm7tdmi"
KonanTarget.ANDROID_ARM64 -> "cortex-a57"
KonanTarget.ANDROID_X64 -> "x86-64"
KonanTarget.LINUX_MIPS32 -> "mips32r2"
KonanTarget.LINUX_MIPSEL32 -> "mips32r2"
KonanTarget.ANDROID_X64 -> TODO("implement me")
KonanTarget.WATCHOS_ARM64 -> TODO("implement me")
KonanTarget.WATCHOS_X64 -> TODO("implement me")
KonanTarget.TVOS_ARM64 -> TODO("implement me")
+55 -30
View File
@@ -343,63 +343,88 @@ dynamicLinker.linux_mipsel32 = /lib/ld.so.1
abiSpecificLibraries.linux_mipsel32 =
# Android ARM32, based on NDK for android-21.
targetToolchain.macos_x64-android_arm32 = target-toolchain-21-osx-android_arm32
# TODO: split dependencies to host-dependent and host-independent parts.
targetToolchain.macos_x64-android_arm32 = target-toolchain-1-osx-android_ndk
dependencies.macos_x64-android_arm32 = \
clang-llvm-6.0.1-darwin-macos \
target-sysroot-21-android_arm32 \
target-toolchain-21-osx-android_arm32 \
target-sysroot-1-android_ndk \
target-toolchain-1-osx-android_ndk \
libffi-3.2.1-3-darwin-macos
targetToolchain.linux_x64-android_arm32 = target-toolchain-21-linux-android_arm32
targetToolchain.linux_x64-android_arm32 = target-toolchain-1-linux-android_ndk
dependencies.linux_x64-android_arm32 = \
clang-llvm-6.0.1-linux-x86-64 \
target-sysroot-21-android_arm32 \
target-toolchain-21-linux-android_arm32 \
target-sysroot-1-android_ndk \
target-toolchain-1-linux-android_ndk \
libffi-3.2.1-2-linux-x86-64
targetToolchain.mingw_x64-android_arm32 = target-toolchain-21-windows-android_arm32
targetToolchain.mingw_x64-android_arm32 = target-toolchain-1-windows-android_ndk
dependencies.mingw_x64-android_arm32 = \
msys2-mingw-w64-x86_64-gcc-7.3.0-clang-llvm-lld-6.0.1-2 \
target-sysroot-21-android_arm32 \
target-toolchain-21-windows-android_arm32 \
target-sysroot-1-android_ndk \
target-toolchain-1-windows-android_ndk \
libffi-3.2.1-mingw-w64-x86-64
quadruple.android_arm32 = arm-linux-androideabi
entrySelector.android_arm32 = -Wl,--defsym -Wl,main=Konan_main
entrySelector.android_arm32 = -Wl,--defsym -Wl,main=Konan_main
clangFlags.android_arm32 = -cc1 -target-cpu arm7tdmi -emit-obj -disable-llvm-optzns -x ir -femulated-tls -mrelocation-model pic
clangOptFlags.android_arm32 = -O3 -ffunction-sections
linkerNoDebugFlags.android_arm32 = -Wl,-S
clangNooptFlags.android_arm32 = -O1
targetSysRoot.android_arm32 = target-sysroot-21-android_arm32
linkerKonanFlags.android_arm32 = -lm -latomic -lstdc++ -landroid
targetSysRoot.android_arm32 = target-sysroot-1-android_ndk
linkerKonanFlags.android_arm32 = -lm -lstdc++ -landroid -llog -latomic
# Android ARM64, based on NDK for android-21.
targetToolchain.macos_x64-android_arm64 = target-toolchain-21-osx-android_arm64
# TODO: split dependencies to host-dependent and host-independent parts.
dependencies.macos_x64-android_arm64 = \
# Android ARM64, based on NDK.
targetToolchain.macos_x64-android_x64 = target-toolchain-1-osx-android_ndk
dependencies.macos_x64-android_x64 = \
clang-llvm-6.0.1-darwin-macos \
target-sysroot-21-android_arm64 \
target-toolchain-21-osx-android_arm64 \
target-sysroot-1-android_ndk \
target-toolchain-1-osx-android_ndk \
libffi-3.2.1-3-darwin-macos
targetToolchain.linux_x64-android_arm64 = target-toolchain-21-linux-android_arm64
dependencies.linux_x64-android_arm64 = \
targetToolchain.linux_x64-android_x64 = target-toolchain-1-linux-android_ndk
dependencies.linux_x64-android_x64 = \
clang-llvm-6.0.1-linux-x86-64 \
target-sysroot-21-android_arm64 \
target-toolchain-21-linux-android_arm64 \
target-sysroot-1-android_ndk \
target-toolchain-1-linux-android_ndk \
libffi-3.2.1-2-linux-x86-64
targetToolchain.mingw_x64-android_arm64 = target-toolchain-21-windows-android_arm64
dependencies.mingw_x64-android_arm64 = \
targetToolchain.mingw_x64-android_x64 = target-toolchain-1-windows-android_ndk
dependencies.mingw_x64-android_x64 = \
msys2-mingw-w64-x86_64-gcc-7.3.0-clang-llvm-lld-6.0.1-2 \
target-sysroot-21-android_arm64 \
target-toolchain-21-windows-android_arm64 \
target-sysroot-1-android_ndk \
target-toolchain-1-windows-android_ndk \
libffi-3.2.1-mingw-w64-x86-64
quadruple.android_arm64 = aarch64-linux-android
entrySelector.android_arm64 = -Wl,--defsym -Wl,main=Konan_main
clangFlags.android_arm64 = -cc1 -target-cpu cortex-a57 -emit-obj -disable-llvm-passes -x ir -femulated-tls -mrelocation-model pic
targetSysRoot.android_arm64 = target-sysroot-21-android_arm64
linkerKonanFlags.android_arm64 = -lm -latomic -lstdc++ -landroid
targetSysRoot.android_arm64 = target-sysroot-1-android_ndk
linkerKonanFlags.android_arm64 = -lm -lstdc++ -landroid -llog -latomic
linkerNoDebugFlags.android_arm64 = -Wl,-S
# Android X64, based on NDK.
targetToolchain.macos_x64-android_arm64 = target-toolchain-1-osx-android_ndk
dependencies.macos_x64-android_arm64 = \
clang-llvm-6.0.1-darwin-macos \
target-sysroot-1-android_ndk \
target-toolchain-1-osx-android_ndk \
libffi-3.2.1-3-darwin-macos
targetToolchain.linux_x64-android_arm64 = target-toolchain-1-linux-android_ndk
dependencies.linux_x64-android_arm64 = \
clang-llvm-6.0.1-linux-x86-64 \
target-sysroot-1-android_ndk \
target-toolchain-1-linux-android_ndk \
libffi-3.2.1-2-linux-x86-64
targetToolchain.mingw_x64-android_arm64 = target-toolchain-1-windows-android_ndk
dependencies.mingw_x64-android_arm64 = \
msys2-mingw-w64-x86_64-gcc-7.3.0-clang-llvm-lld-6.0.1-2 \
target-sysroot-1-android_ndk \
target-toolchain-1-windows-android_ndk \
libffi-3.2.1-mingw-w64-x86-64
quadruple.android_x64 = x86_64-linux-android
entrySelector.android_x64 = -Wl,--defsym -Wl,main=Konan_main
clangFlags.android_x64 = -cc1 -target-cpu x86-64 -emit-obj -disable-llvm-passes -x ir -femulated-tls -mrelocation-model pic
targetSysRoot.android_x64 = target-sysroot-1-android_ndk
linkerKonanFlags.android_x64 = -lm -lstdc++ -landroid -llog -latomic
linkerNoDebugFlags.android_ax64 = -Wl,-S
# Windows x86-64, based on mingw-w64.
llvmHome.mingw_x64 = msys2-mingw-w64-x86_64-gcc-7.3.0-clang-llvm-lld-6.0.1-2
targetToolchain.mingw_x64 = msys2-mingw-w64-x86_64-gcc-7.3.0-clang-llvm-lld-6.0.1-2
@@ -508,4 +533,4 @@ llcNooptFlags.wasm32 = -O1
llcOptFlags.wasm32 = -O3
llcDebugFlags.wasm32 = -O0
# TODO: make explicit list of external symbols
lld.wasm32 = --allow-undefined --no-entry --global-base=0 --no-threads
lld.wasm32 = --allow-undefined --no-entry --global-base=0 --no-threads
+20 -5
View File
@@ -1,13 +1,28 @@
depends = posix
package = platform.android
headers = jni.h android/api-level.h android/asset_manager.h android/asset_manager_jni.h android/bitmap.h \
android/configuration.h android/dlext.h android/input.h android/keycodes.h android/log.h \
android/looper.h android/native_activity.h android/native_window.h android/native_window_jni.h \
android/obb.h android/rect.h android/sensor.h android/storage_manager.h android/tts.h \
headers = jni.h stdbool.h \
android/NeuralNetworks.h \
android/api-level.h android/asset_manager.h android/asset_manager_jni.h \
android/bitmap.h \
android/choreographer.h android/configuration.h \
android/data_space.h android/dlext.h \
android/fdsan.h android/font.h android/font_matcher.h \
android/hardware_buffer.h android/hardware_buffer_jni.h \
android/input.h \
android/keycodes.h \
android/log.h android/looper.h \
android/multinetwork.h \
android/native_activity.h android/native_window.h android/ndk-version.h \
android/obb.h \
android/rect.h \
android/sensor.h android/set_abort_message.h android/sharedmem.h android/sharedmem_jni.h \
android/storage_manager.h android/surface_texture.h android/surface_texture_jni.h \
android/sync.h android/system_fonts.h \
android/trace.h \
android/versioning.h \
android/window.h
headerFilter = **
linkerOpts = -landroid -llog -ljnigraphics
---
+5 -5
View File
@@ -1,12 +1,12 @@
depends = posix
package = platform.linux
headers = byteswap.h elf.h endian.h features.h lastlog.h link.h \
malloc.h mntent.h nsswitch.h pathconf.h termio.h thread_db.h \
uchar.h util.h \
malloc.h mntent.h termio.h \
uchar.h \
sys/epoll.h sys/inotify.h sys/klog.h sys/sendfile.h \
sys/sysconf.h sys/sysinfo.h sys/utime.h \
net/if_ether.h net/if_packet.h netinet/ether.h netinet/in6.h netpacket/packet.h
sys/sysconf.h sys/sysinfo.h \
linux/if_ether.h linux/utime.h \
net/if_packet.h netinet/ether.h netinet/in6.h netpacket/packet.h
headers.android_arm32 = time64.h
headerFilter = **
+1 -1
View File
@@ -3,4 +3,4 @@ package = platform.media
headers = media/NdkMediaCodec.h media/NdkMediaCrypto.h media/NdkMediaDrm.h media/NdkMediaError.h \
media/NdkMediaExtractor.h media/NdkMediaFormat.h media/NdkMediaMuxer.h
headerFilter = media/**
linkerOpts = -lmediandk
linkerOpts = -lmediandk
+4 -4
View File
@@ -3,15 +3,15 @@ package = platform.posix
headers = alloca.h ar.h assert.h complex.h dirent.h dlfcn.h err.h errno.h fcntl.h \
fenv.h fnmatch.h fts.h ftw.h getopt.h grp.h inttypes.h libgen.h limits.h \
locale.h math.h memory.h netdb.h paths.h poll.h \
pthread.h pwd.h regex.h resolv.h sched.h search.h semaphore.h setjmp.h sgtty.h signal.h \
stdatomic.h stdint.h stdio.h stdlib.h string.h strings.h syslog.h termios.h \
pthread.h pwd.h regex.h resolv.h sched.h search.h semaphore.h setjmp.h signal.h \
stdatomic.h stdbool.h stdint.h stdio.h stdlib.h string.h strings.h syslog.h termios.h \
time.h ucontext.h unistd.h utime.h utmp.h wchar.h wctype.h xlocale.h \
net/ethernet.h net/if.h net/if_arp.h net/route.h \
netinet/icmp6.h netinet/if_ether.h netinet/in.h netinet/in_systm.h \
netinet/ip.h netinet/ip6.h netinet/ip_icmp.h netinet/tcp.h netinet/udp.h \
sys/ioctl.h sys/ipc.h sys/mman.h sys/poll.h sys/ptrace.h \
sys/queue.h sys/select.h sys/shm.h sys/stat.h \
sys/syslimits.h sys/time.h sys/times.h sys/utsname.h sys/wait.h
sys/time.h sys/times.h sys/utsname.h sys/wait.h
linkerOpts = -ldl
@@ -42,4 +42,4 @@ static int init_sockets() {
}
static void deinit_sockets() {
}
}
@@ -25,6 +25,7 @@
#include <unistd.h>
#include <pthread.h>
#include <sys/errno.h>
#include <sys/types.h>
#include <sys/socket.h>
@@ -18,6 +18,19 @@ package org.jetbrains.kotlin.konan.target
import org.jetbrains.kotlin.konan.file.File
internal object Android {
const val API = "21"
private val architectureMap = mapOf(
// KonanTarget.X86 to "x86",
KonanTarget.ANDROID_X64 to "x86_64",
KonanTarget.ANDROID_ARM32 to "arm",
KonanTarget.ANDROID_ARM64 to "arm64"
)
fun architectureDirForTarget(target: KonanTarget) =
"android-${API}/arch-${architectureMap.getValue(target)}"
}
class ClangArgs(private val configurables: Configurables) : Configurables by configurables {
val targetArg = if (configurables is TargetableConfigurables)
@@ -72,22 +85,19 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
KonanTarget.IOS_X64 ->
listOf("-stdlib=libc++", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=9.0.0")
KonanTarget.ANDROID_ARM32 ->
listOf("-target", targetArg!!,
"--sysroot=$absoluteTargetSysRoot",
// HACKS!
"-I$absoluteTargetSysRoot/usr/include/c++/4.9.x",
"-I$absoluteTargetSysRoot/usr/include/c++/4.9.x/arm-linux-androideabi")
KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, 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")
}
KonanTarget.ANDROID_ARM64 ->
listOf("-target", targetArg!!,
"--sysroot=$absoluteTargetSysRoot",
// HACKS!
"-I$absoluteTargetSysRoot/usr/include/c++/4.9.x",
"-I$absoluteTargetSysRoot/usr/include/c++/4.9.x/aarch64-linux-android")
// By default wasm target forces `hidden` visibility which causes
// linkage problems.
// By default WASM target forces `hidden` visibility which causes linkage problems.
KonanTarget.WASM32 ->
listOf("-target", targetArg!!,
"-fno-rtti",
@@ -103,7 +113,6 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
"-Xclang", "-isystem$absoluteTargetSysRoot/include/compat",
"-Xclang", "-isystem$absoluteTargetSysRoot/include/libc")
KonanTarget.ANDROID_X64 -> TODO("implement me")
KonanTarget.WATCHOS_ARM64 -> TODO("implement me")
KonanTarget.WATCHOS_X64 -> TODO("implement me")
KonanTarget.TVOS_ARM64 -> TODO("implement me")
@@ -239,6 +248,15 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
"-DKONAN_ARM64=1",
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
KonanTarget.ANDROID_X64 ->
listOf("-D__ANDROID__",
"-DUSE_GCC_UNWIND=1",
"-DUSE_ELF_SYMBOLS=1",
"-DELFSIZE=64",
"-DKONAN_ANDROID=1",
"-DKONAN_X64=1",
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
KonanTarget.WASM32 ->
listOf("-DKONAN_WASM=1",
"-DKONAN_NO_FFI=1",
@@ -250,7 +268,6 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
"-DKONAN_NO_MEMMEM",
"-DKONAN_NO_CTORS_SECTION=1")
KonanTarget.ANDROID_X64 -> TODO("implement me")
KonanTarget.WATCHOS_ARM64 -> TODO("implement me")
KonanTarget.WATCHOS_X64 -> TODO("implement me")
KonanTarget.TVOS_ARM64 -> TODO("implement me")
@@ -44,13 +44,12 @@ fun loadConfigurables(target: KonanTarget, properties: Properties, baseDir: Stri
LinuxMIPSConfigurablesImpl(target, properties, baseDir)
KonanTarget.MACOS_X64, KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 ->
AppleConfigurablesImpl(target, properties, baseDir)
KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64 ->
KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, KonanTarget.ANDROID_X64 ->
AndroidConfigurablesImpl(target, properties, baseDir)
KonanTarget.MINGW_X64, KonanTarget.MINGW_X86 ->
MingwConfigurablesImpl(target, properties, baseDir)
KonanTarget.WASM32 ->
WasmConfigurablesImpl(target, properties, baseDir)
KonanTarget.ANDROID_X64 -> TODO("unimplemented: $target")
KonanTarget.WATCHOS_ARM64, KonanTarget.WATCHOS_X64 -> TODO("unimplemented: $target")
KonanTarget.TVOS_ARM64, KonanTarget.TVOS_X64 -> TODO("unimplemented: $target")
is KonanTarget.ZEPHYR ->
@@ -108,13 +108,23 @@ open class AndroidLinker(targetProperties: AndroidConfigurables)
return staticGnuArCommands(ar, executable, objectFiles, libraries)
val dynamic = kind == LinkerOutputKind.DYNAMIC_LIBRARY
// liblog.so must be linked in, as we use its functionality in runtime.
val toolchainSysroot = "${absoluteTargetToolchain}/sysroot"
val architectureDir = Android.architectureDirForTarget(target)
val apiSysroot = "$absoluteTargetSysRoot/$architectureDir"
val clangTarget = targetArg!!
val libDirs = listOf(
"--sysroot=$apiSysroot",
if (target == KonanTarget.ANDROID_X64) "-L$apiSysroot/usr/lib64" else "-L$apiSysroot/usr/lib",
"-L$toolchainSysroot/usr/lib/$clangTarget/${Android.API}",
"-L$toolchainSysroot/usr/lib/$clangTarget")
return listOf(Command(clang).apply {
+"-o"
+executable
+"-fPIC"
+"-shared"
+"-llog"
+"-target"
+targetArg!!
+libDirs
+objectFiles
if (optimize) +linkerOptimizationFlags
if (!debug) +linkerNoDebugFlags
@@ -429,13 +439,12 @@ fun linker(configurables: Configurables): LinkerFlags =
LinuxBasedLinker(configurables as LinuxMIPSConfigurables)
KonanTarget.MACOS_X64, KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 ->
MacOSBasedLinker(configurables as AppleConfigurables)
KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64 ->
KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, KonanTarget.ANDROID_X64 ->
AndroidLinker(configurables as AndroidConfigurables)
KonanTarget.MINGW_X64, KonanTarget.MINGW_X86 ->
MingwLinker(configurables as MingwConfigurables)
KonanTarget.WASM32 ->
WasmLinker(configurables as WasmConfigurables)
KonanTarget.ANDROID_X64 -> TODO("implement me")
KonanTarget.WATCHOS_ARM64 -> TODO("implement me")
KonanTarget.WATCHOS_X64 -> TODO("implement me")
KonanTarget.TVOS_ARM64 -> TODO("implement me")
@@ -49,7 +49,7 @@ class PlatformManager(distribution: Distribution = Distribution(), experimental:
* TODO: Don't forget to delete this field and replace all its usages to `enabled`.
*/
val filteredOutEnabledButNotSupported
get() = enabled.filterNot { it == KonanTarget.ANDROID_X64 || it == KonanTarget.WATCHOS_X64 || it == KonanTarget.WATCHOS_ARM64 ||
get() = enabled.filterNot { it == KonanTarget.WATCHOS_X64 || it == KonanTarget.WATCHOS_ARM64 ||
it == KonanTarget.TVOS_X64 || it == KonanTarget.TVOS_ARM64}
}