@@ -934,39 +934,68 @@ elif run_os in ['linux-gnu', 'linux-gnueabihf', 'freebsd', 'windows-cygnus', 'wi
934
934
"clang++ -target %s %s" %
935
935
(config .variant_triple , clang_mcp_opt ))
936
936
config .target_ld = "ld -L%r" % (make_path (test_resource_dir , config .target_sdk_name ))
937
- elif run_os == 'linux-androideabi' :
937
+ elif run_os == 'linux-androideabi' or run_os == 'linux-android' :
938
+ def get_architecture_value (** kwargs ):
939
+ result = kwargs [run_cpu ]
940
+ if result is None :
941
+ if run_cpu == "armv7s" or run_cpu == "armv7k" :
942
+ result = kwargs ["armv7" ]
943
+ elif run_cpu == "arm64" :
944
+ result = kwards ["aarch64" ]
945
+ return result
946
+
947
+ ndk_platform_tuple = get_architecture_value (armv7 = "armeabi-v7a" ,
948
+ aarch64 = "arm64-v8a" )
949
+ ndk_platform_triple = get_architecture_value (armv7 = "arm-linux-androideabi" ,
950
+ aarch64 = "aarch64-linux-android" )
951
+ toolchain_directory_name = "{}-{}" .format (ndk_platform_triple , config .android_ndk_gcc_version )
952
+ tools_directory = make_path (config .android_ndk_path , "toolchains" ,
953
+ toolchain_directory_name , "prebuilt" , "linux-x86_64" ,
954
+ ndk_platform_triple , "bin" )
938
955
lit_config .note ("Testing Android " + config .variant_triple )
939
956
config .target_object_format = "elf"
940
957
config .target_shared_library_prefix = 'lib'
941
958
config .target_shared_library_suffix = ".so"
959
+ config .target_swiftmodule_name = get_architecture_value (armv7 = "arm.swiftmodule" ,
960
+ aarch64 = "arm64.swiftmodule" )
961
+ config .target_swiftdoc_name = get_architecture_value (armv7 = "arm.swiftdoc" ,
962
+ aarch64 = "arm64.swiftdoc" )
942
963
config .target_runtime = "native"
943
964
config .target_swift_autolink_extract = inferSwiftBinary ("swift-autolink-extract" )
944
965
config .target_sdk_name = "android"
945
- android_linker_opt = "-L {libcxx} -L {libgcc}" .format (
966
+ android_link_paths_opt = "-L {libcxx} -L {libgcc}" .format (
946
967
libcxx = make_path (config .android_ndk_path ,
947
- "sources" , "cxx-stl" , "llvm-libc++" , "libs" ,
948
- "armeabi-v7a" ),
968
+ "sources" , "cxx-stl" , "llvm-libc++" , "libs" , ndk_platform_tuple ),
949
969
libgcc = make_path (config .android_ndk_path ,
950
- "toolchains" ,
951
- "arm-linux-androideabi-{}" .format (config .android_ndk_gcc_version ),
952
- "prebuilt" , "linux-x86_64" , "lib" , "gcc" ,
953
- "arm-linux-androideabi" ,
970
+ "toolchains" , toolchain_directory_name , "prebuilt" ,
971
+ "linux-x86_64" , "lib" , "gcc" , ndk_platform_triple ,
954
972
"{}.x" .format (config .android_ndk_gcc_version )))
973
+ # Since NDK r14 the headers are unified under $NDK_PATH/sysroot, so the -sdk
974
+ # switch is not enough. Additionally we have to include both the unified
975
+ # sysroot, and the architecture sysroot.
976
+ android_include_paths_opt = "-I {sysroot} -I {sysroot_arch}" .format (
977
+ sysroot = make_path (config .android_ndk_path , "sysroot" , "usr" , "include" ),
978
+ sysroot_arch = make_path (config .android_ndk_path , "sysroot" , "usr" ,
979
+ "include" , ndk_platform_triple ))
955
980
config .target_build_swift = (
956
- '%s -target %s -sdk %r %s -Xlinker -pie %s %s %s %s %s'
957
- % (config .swiftc , config .variant_triple , config .variant_sdk ,
958
- android_linker_opt , resource_dir_opt , mcp_opt ,
959
- config .swift_test_options ,
981
+ '%s -target %s -sdk %r -tools-directory %r %s %s '
982
+ '-use-ld=%s %s %s %s %s %s'
983
+ % (config .swiftc ,
984
+ config .variant_triple , config .variant_sdk ,
985
+ tools_directory , android_include_paths_opt , android_link_paths_opt ,
986
+ config .android_linker_name ,
987
+ resource_dir_opt , mcp_opt , config .swift_test_options ,
960
988
config .swift_driver_test_options , swift_execution_tests_extra_flags ))
961
989
config .target_codesign = "echo"
962
990
config .target_build_swift_dylib = (
963
991
"%s -parse-as-library -emit-library -o '\\ 1'"
964
992
% (config .target_build_swift ))
965
993
config .target_add_rpath = r'-Xlinker -rpath -Xlinker \1'
966
994
config .target_swift_frontend = (
967
- '%s -frontend -target %s -sdk %r %s %s %s %s'
995
+ '%s -frontend -target %s -sdk %r %s %s %s %s %s %s '
968
996
% (config .swift , config .variant_triple , config .variant_sdk ,
969
- android_linker_opt , resource_dir_opt , mcp_opt ,
997
+ android_include_paths_opt , android_link_paths_opt , resource_dir_opt ,
998
+ mcp_opt , config .swift_test_options ,
970
999
config .swift_frontend_test_options ))
971
1000
subst_target_swift_frontend_mock_sdk = config .target_swift_frontend
972
1001
subst_target_swift_frontend_mock_sdk_after = ""
@@ -982,19 +1011,18 @@ elif run_os == 'linux-androideabi':
982
1011
subst_target_swift_ide_test_mock_sdk = config .target_swift_ide_test
983
1012
subst_target_swift_ide_test_mock_sdk_after = ""
984
1013
config .target_swiftc_driver = (
985
- "%s -target %s -sdk %r %s %s %s" %
1014
+ "%s -target %s -sdk %r -tools-directory %s %s %s %s -use-ld= %s" %
986
1015
(config .swiftc , config .variant_triple , config .variant_sdk ,
987
- android_linker_opt , resource_dir_opt , mcp_opt ))
1016
+ tools_directory , android_link_paths_opt , resource_dir_opt , mcp_opt ,
1017
+ config .android_linker_name ))
988
1018
config .target_swift_modulewrap = (
989
1019
'%s -modulewrap -target %s' %
990
1020
(config .swiftc , config .variant_triple ))
991
1021
config .target_clang = (
992
- "clang++ -target %s %s" %
993
- (config .variant_triple , clang_mcp_opt ))
1022
+ "clang++ -target %s %s %s " %
1023
+ (config .variant_triple , clang_mcp_opt , android_include_paths_opt ))
994
1024
config .target_ld = "{} -L{}" .format (
995
- make_path (config .android_ndk_path , 'toolchains' ,
996
- 'arm-linux-androideabi-{}' .format (config .android_ndk_gcc_version ),
997
- 'prebuilt' , 'linux-x86_64' , 'arm-linux-androideabi' , 'bin' ),
1025
+ tools_directory ,
998
1026
make_path (test_resource_dir , config .target_sdk_name ))
999
1027
# The Swift interpreter is not available when targeting Android.
1000
1028
config .available_features .remove ('swift_interpreter' )
0 commit comments