Skip to content

Commit 796d6ad

Browse files
committed
[android] Add support for natively building on Android
Check if building on Android through the ANDROID_DATA environment variable, then set SWIFT_ANDROID_NATIVE_SYSROOT to the default layout for the Termux app, and key all the include, lib, and other SDK paths off of that. The system libc and a few other libraries are linked against from /system/lib[64]. Finally, check if lit is running natively on Android and don't use adb if so.
1 parent 1a72eec commit 796d6ad

File tree

8 files changed

+170
-50
lines changed

8 files changed

+170
-50
lines changed

CMakeLists.txt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,13 @@ if(SWIFT_HOST_VARIANT_SDK)
603603
set(SWIFT_HOST_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK}")
604604
else()
605605
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
606-
set(SWIFT_HOST_VARIANT_SDK_default "LINUX")
606+
# CMake on an Android host sets this to Linux, so check for the ANDROID_DATA
607+
# environment variable to see if we're building on Android.
608+
if(NOT "$ENV{ANDROID_DATA}" STREQUAL "")
609+
set(SWIFT_HOST_VARIANT_SDK_default "ANDROID")
610+
else()
611+
set(SWIFT_HOST_VARIANT_SDK_default "LINUX")
612+
endif()
607613
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
608614
set(SWIFT_HOST_VARIANT_SDK_default "FREEBSD")
609615
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN")
@@ -613,6 +619,7 @@ else()
613619
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Haiku")
614620
set(SWIFT_HOST_VARIANT_SDK_default "HAIKU")
615621
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Android")
622+
# CMAKE_SYSTEM_NAME might be set this way when cross-compiling to Android.
616623
set(SWIFT_HOST_VARIANT_SDK_default "ANDROID")
617624
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
618625
set(SWIFT_HOST_VARIANT_SDK_default "OSX")
@@ -677,7 +684,7 @@ endif()
677684

678685
# FIXME: the parameters we specify in SWIFT_SDKS are lacking architecture specifics,
679686
# so we need to hard-code it. For example, the SDK for Android is just 'ANDROID',
680-
# which we assume below to be armv7.
687+
# and we have to specify SWIFT_SDK_ANDROID_ARCHITECTURES separately.
681688
# The iOS SDKs all have their architectures hardcoded because they are just specified by name (e.g. 'IOS' or 'WATCHOS').
682689
# We can't cross-compile the standard library for another linux architecture,
683690
# because the SDK list would just be 'LINUX' and we couldn't disambiguate it from the host.
@@ -739,9 +746,16 @@ elseif("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "HAIKU")
739746
elseif("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "ANDROID")
740747

741748
set(SWIFT_HOST_VARIANT "android" CACHE STRING
742-
"Deployment OS for Swift host tools (the compiler) [android].")
749+
"Deployment OS for Swift host tools (the compiler) [android]")
743750

744-
configure_sdk_unix("Android" "${SWIFT_HOST_VARIANT_ARCH}")
751+
set(SWIFT_ANDROID_NATIVE_SYSROOT "/data/data/com.termux/files" CACHE STRING
752+
"Path to Android sysroot, default initialized to the Termux app's layout")
753+
754+
if("${SWIFT_SDK_ANDROID_ARCHITECTURES}" STREQUAL "")
755+
set(SWIFT_SDK_ANDROID_ARCHITECTURES ${SWIFT_HOST_VARIANT_ARCH})
756+
endif()
757+
758+
configure_sdk_unix("Android" "${SWIFT_SDK_ANDROID_ARCHITECTURES}")
745759
set(SWIFT_PRIMARY_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK}")
746760
set(SWIFT_PRIMARY_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH}")
747761

cmake/modules/AddSwift.cmake

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ function(_add_variant_c_compile_link_flags)
140140
# lld can handle targeting the android build. However, if lld is not
141141
# enabled, then fallback to the linker included in the android NDK.
142142
if(NOT SWIFT_ENABLE_LLD_LINKER)
143-
list(APPEND result "-B" "${SWIFT_SDK_ANDROID_ARCH_${CFLAGS_ARCH}_NDK_PREBUILT_PATH}/${SWIFT_SDK_ANDROID_ARCH_${CFLAGS_ARCH}_NDK_TRIPLE}/bin")
143+
swift_android_tools_path(${CFLAGS_ARCH} tools_path)
144+
list(APPEND result "-B" "${tools_path}")
144145
endif()
145146
endif()
146147

@@ -482,22 +483,9 @@ function(_add_variant_link_flags)
482483
# We need to add the math library, which is linked implicitly by libc++
483484
list(APPEND result "-lm")
484485

485-
if("${LFLAGS_ARCH}" MATCHES armv7)
486-
set(android_libcxx_path "${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a")
487-
elseif("${LFLAGS_ARCH}" MATCHES aarch64)
488-
set(android_libcxx_path "${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/arm64-v8a")
489-
elseif("${LFLAGS_ARCH}" MATCHES i686)
490-
set(android_libcxx_path "${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/x86")
491-
elseif("${LFLAGS_ARCH}" MATCHES x86_64)
492-
set(android_libcxx_path "${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/x86_64")
493-
else()
494-
message(SEND_ERROR "unknown architecture (${LFLAGS_ARCH}) for android")
495-
endif()
496-
497486
# link against the custom C++ library
498-
list(APPEND link_libraries
499-
${android_libcxx_path}/libc++abi.a
500-
${android_libcxx_path}/libc++_shared.so)
487+
swift_android_cxx_libraries_for_arch(${LFLAGS_ARCH} cxx_link_libraries)
488+
list(APPEND link_libraries ${cxx_link_libraries})
501489

502490
# link against the ICU libraries
503491
list(APPEND link_libraries
@@ -1104,7 +1092,7 @@ function(_add_swift_library_single target name)
11041092
set_target_properties("${target}"
11051093
PROPERTIES
11061094
INSTALL_NAME_DIR "${install_name_dir}")
1107-
elseif("${SWIFTLIB_SINGLE_SDK}" STREQUAL "LINUX" AND NOT "${SWIFTLIB_SINGLE_SDK}" STREQUAL "ANDROID")
1095+
elseif("${SWIFTLIB_SINGLE_SDK}" STREQUAL "LINUX")
11081096
set_target_properties("${target}"
11091097
PROPERTIES
11101098
INSTALL_RPATH "$ORIGIN:/usr/lib/swift/linux")
@@ -1116,6 +1104,14 @@ function(_add_swift_library_single target name)
11161104
# CMake generates incorrect rule `$SONAME_FLAG $INSTALLNAME_DIR$SONAME` for Android build on macOS cross-compile host.
11171105
# Proper linker flags constructed manually. See below variable `swiftlib_link_flags_all`.
11181106
set_target_properties("${target}" PROPERTIES NO_SONAME TRUE)
1107+
# Only set the install RPATH if cross-compiling the host tools, in which
1108+
# case both the NDK and Sysroot paths must be set.
1109+
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "" AND
1110+
NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
1111+
set_target_properties("${target}"
1112+
PROPERTIES
1113+
INSTALL_RPATH "$ORIGIN")
1114+
endif()
11191115
endif()
11201116

11211117
set_target_properties("${target}" PROPERTIES BUILD_WITH_INSTALL_RPATH YES)

cmake/modules/AddSwiftUnittests.cmake

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,14 @@ function(add_swift_unittest test_dirname)
4242
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
4343
set_property(TARGET "${test_dirname}" APPEND_STRING PROPERTY
4444
LINK_FLAGS " -Xlinker -rpath -Xlinker ${SWIFT_LIBRARY_OUTPUT_INTDIR}/swift/macosx")
45+
elseif("${SWIFT_HOST_VARIANT}" STREQUAL "android")
46+
swift_android_lib_for_arch(${SWIFT_HOST_VARIANT_ARCH} android_system_libs)
47+
set_property(TARGET "${test_dirname}" APPEND PROPERTY LINK_DIRECTORIES
48+
"${android_system_libs}")
49+
set_property(TARGET "${test_dirname}" APPEND PROPERTY LINK_LIBRARIES "log")
4550
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
46-
set_property(TARGET "${test_dirname}" APPEND_STRING PROPERTY
47-
LINK_FLAGS " -latomic")
51+
set_property(TARGET "${test_dirname}" APPEND PROPERTY LINK_LIBRARIES
52+
"atomic")
4853
endif()
4954

5055
find_program(LDLLD_PATH "ld.lld")
Lines changed: 84 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,32 @@
11
function(swift_android_libcxx_include_paths var)
2-
set(${var}
3-
"${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/include"
4-
"${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++abi/include"
5-
PARENT_SCOPE)
2+
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
3+
set(${var}
4+
"${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/include"
5+
"${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++abi/include"
6+
PARENT_SCOPE)
7+
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
8+
set(${var}
9+
"${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/include/c++/v1"
10+
PARENT_SCOPE)
11+
else()
12+
message(SEND_ERROR "Couldn't set libc++ include paths for Android")
13+
endif()
614
endfunction()
715

816
function(swift_android_include_for_arch arch var)
917
set(paths)
10-
list(APPEND paths
11-
"${SWIFT_ANDROID_NDK_PATH}/sources/android/support/include"
12-
"${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include"
13-
"${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}")
18+
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
19+
list(APPEND paths
20+
"${SWIFT_ANDROID_NDK_PATH}/sources/android/support/include"
21+
"${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include"
22+
"${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}")
23+
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
24+
list(APPEND paths
25+
"${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/include"
26+
"${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/include/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}")
27+
else()
28+
message(SEND_ERROR "Couldn't set ${arch} include paths for Android")
29+
endif()
1430
set(${var} ${paths} PARENT_SCOPE)
1531
endfunction()
1632

@@ -19,18 +35,68 @@ function(swift_android_lib_for_arch arch var)
1935
set(_host "${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}")
2036

2137
set(paths)
22-
if(arch STREQUAL armv7)
23-
list(APPEND paths "${_prebuilt}/${_host}/lib/armv7-a")
24-
elseif(arch STREQUAL aarch64)
25-
list(APPEND paths "${_prebuilt}/${_host}/lib64")
26-
elseif(arch STREQUAL i686)
27-
list(APPEND paths "${_prebuilt}/${_host}/lib")
28-
elseif(arch STREQUAL x86_64)
29-
list(APPEND paths "${_prebuilt}/${_host}/lib64")
38+
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
39+
if(arch STREQUAL armv7)
40+
list(APPEND paths "${_prebuilt}/${_host}/lib/armv7-a")
41+
elseif(arch STREQUAL aarch64)
42+
list(APPEND paths "${_prebuilt}/${_host}/lib64")
43+
elseif(arch STREQUAL i686)
44+
list(APPEND paths "${_prebuilt}/${_host}/lib")
45+
elseif(arch STREQUAL x86_64)
46+
list(APPEND paths "${_prebuilt}/${_host}/lib64")
47+
else()
48+
message(SEND_ERROR "unknown architecture (${arch}) for android")
49+
endif()
50+
list(APPEND paths "${_prebuilt}/lib/gcc/${_host}/${SWIFT_ANDROID_NDK_GCC_VERSION}.x")
51+
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
52+
list(APPEND paths "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/lib")
53+
if("${arch}" MATCHES armv7)
54+
list(APPEND paths "/system/lib")
55+
elseif("${arch}" MATCHES aarch64)
56+
list(APPEND paths "/system/lib64")
57+
else()
58+
message(SEND_ERROR "unknown architecture (${arch}) when compiling for Android host")
59+
endif()
3060
else()
31-
message(SEND_ERROR "unknown architecture (${arch}) for android")
61+
message(SEND_ERROR "Couldn't set ${arch} library paths for Android")
3262
endif()
33-
list(APPEND paths "${_prebuilt}/lib/gcc/${_host}/${SWIFT_ANDROID_NDK_GCC_VERSION}.x")
3463

3564
set(${var} ${paths} PARENT_SCOPE)
3665
endfunction()
66+
67+
function(swift_android_tools_path arch path_var_name)
68+
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
69+
set(${path_var_name} "${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH}/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}/bin" PARENT_SCOPE)
70+
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
71+
set(${path_var_name} "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/bin" PARENT_SCOPE)
72+
else()
73+
message(SEND_ERROR "Couldn't set ${arch} tools path for Android")
74+
endif()
75+
endfunction ()
76+
77+
function(swift_android_cxx_libraries_for_arch arch libraries_var_name)
78+
set(link_libraries)
79+
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
80+
if("${arch}" MATCHES armv7)
81+
set(cxx_arch armeabi-v7a)
82+
elseif("${arch}" MATCHES aarch64)
83+
set(cxx_arch arm64-v8a)
84+
elseif("${arch}" MATCHES i686)
85+
set(cxx_arch x86)
86+
elseif("${arch}" MATCHES x86_64)
87+
set(cxx_arch x86_64)
88+
else()
89+
message(SEND_ERROR "unknown architecture (${arch}) when cross-compiling for Android")
90+
endif()
91+
92+
set(android_libcxx_path "${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/${cxx_arch}")
93+
list(APPEND link_libraries ${android_libcxx_path}/libc++abi.a
94+
${android_libcxx_path}/libc++_shared.so)
95+
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
96+
list(APPEND link_libraries "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/lib/libc++_shared.so")
97+
else()
98+
message(SEND_ERROR "Couldn't set ${arch} libc++ libraries needed for Android")
99+
endif()
100+
101+
set(${libraries_var_name} ${link_libraries} PARENT_SCOPE)
102+
endfunction()

cmake/modules/SwiftConfigureSDK.cmake

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,12 @@ function(_report_sdk prefix)
4747
message(STATUS " ${arch} LIB: ${${arch}_LIB}")
4848
endforeach()
4949
elseif("${prefix}" STREQUAL "ANDROID")
50-
message(STATUS " NDK: $ENV{SWIFT_ANDROID_NDK_PATH}")
50+
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
51+
message(STATUS " NDK: $ENV{SWIFT_ANDROID_NDK_PATH}")
52+
endif()
53+
if(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
54+
message(STATUS " Sysroot: ${SWIFT_ANDROID_NATIVE_SYSROOT}")
55+
endif()
5156
foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES})
5257
swift_android_include_for_arch(${arch} ${arch}_INCLUDE)
5358
swift_android_lib_for_arch(${arch} ${arch}_LIB)
@@ -204,18 +209,37 @@ macro(configure_sdk_unix name architectures)
204209

205210
foreach(arch ${architectures})
206211
if("${prefix}" STREQUAL "ANDROID")
207-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include" CACHE STRING "Path to C library headers")
208-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include" CACHE STRING "Path to C library architecture headers")
212+
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
213+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include" CACHE STRING "Path to C library headers")
214+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include" CACHE STRING "Path to C library architecture headers")
215+
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
216+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/include" CACHE STRING "Path to C library headers")
217+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/include" CACHE STRING "Path to C library architecture headers")
218+
else()
219+
message(SEND_ERROR "Couldn't find LIBC_INCLUDE_DIRECTORY for Android")
220+
endif()
209221

210222
if("${arch}" STREQUAL "armv7")
211223
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "arm-linux-androideabi")
212224
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "arm")
213-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-arm")
225+
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
226+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-arm")
227+
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
228+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NATIVE_SYSROOT}")
229+
else()
230+
message(SEND_ERROR "Couldn't find SWIFT_SDK_ANDROID_ARCH_armv7_PATH")
231+
endif()
214232
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "armv7-none-linux-androideabi")
215233
elseif("${arch}" STREQUAL "aarch64")
216234
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "aarch64-linux-android")
217235
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "aarch64")
218-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-arm64")
236+
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
237+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-arm64")
238+
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
239+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NATIVE_SYSROOT}")
240+
else()
241+
message(SEND_ERROR "Couldn't find SWIFT_SDK_ANDROID_ARCH_aarch64_PATH")
242+
endif()
219243
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "aarch64-unknown-linux-android")
220244
elseif("${arch}" STREQUAL "i686")
221245
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "i686-linux-android")

stdlib/public/stubs/CommandLine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
206206

207207
return outBuf;
208208
}
209-
#else // __ANDROID__; Add your favorite arch's command line arg grabber here.
209+
#else // Add your favorite OS's command line arg grabber here.
210210
SWIFT_RUNTIME_STDLIB_API
211211
char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
212212
if (_swift_stdlib_ProcessOverrideUnsafeArgv) {

test/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,9 @@ _Block_release(void) { }\n")
248248
if("${SDK}" STREQUAL "IOS" OR "${SDK}" STREQUAL "TVOS" OR "${SDK}" STREQUAL "WATCHOS")
249249
# These are supported testing SDKs, but their implementation of
250250
# `command_upload_stdlib` is hidden.
251-
elseif("${SDK}" STREQUAL "ANDROID")
251+
elseif("${SDK}" STREQUAL "ANDROID" AND NOT "${SWIFT_HOST_VARIANT}" STREQUAL "android")
252+
# This adb setup is only needed when cross-compiling for Android, so the
253+
# second check above makes sure we don't bother when the host is Android.
252254
if("${SWIFT_ANDROID_DEPLOY_DEVICE_PATH}" STREQUAL "")
253255
message(FATAL_ERROR
254256
"When running Android host tests, you must specify the directory on the device "

test/lit.cfg

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,10 @@ elif platform.system() == 'Linux':
674674
if swift_test_mode != 'only_non_executable':
675675
config.available_features.add('swift_interpreter')
676676

677+
# The global environment in Android sets ANDROID_DATA, so if that variable is
678+
# set, we are probably running in Android.
679+
kIsAndroid = 'ANDROID_DATA' in os.environ
680+
677681
# swift-remoteast-test requires the ability to compile and run code
678682
# for the system we compiled the swift-remoteast-test executable on.
679683
# This is potentially a stronger constraint than just "can we interpret",
@@ -966,8 +970,11 @@ elif run_os in ['windows-msvc']:
966970
('%r -modulewrap -target %s' % (config.swiftc, config.variant_triple))
967971

968972

969-
elif run_os in ['linux-gnu', 'linux-gnueabihf', 'freebsd', 'windows-cygnus', 'windows-gnu']:
970-
# Linux/FreeBSD/Cygwin
973+
elif (run_os in ['linux-gnu', 'linux-gnueabihf', 'freebsd', 'windows-cygnus', 'windows-gnu'] or
974+
(kIsAndroid and run_os in ['linux-android', 'linux-androideabi'])):
975+
# Running lit and the compiler on Android itself is more like running on Linux,
976+
# ie the NDK and adb aren't needed, so use this instead.
977+
# Linux/FreeBSD/Cygwin/Android
971978
if run_os == 'windows-cygnus':
972979
lit_config.note("Testing Cygwin " + config.variant_triple)
973980
config.target_object_format = "coff"
@@ -986,6 +993,12 @@ elif run_os in ['linux-gnu', 'linux-gnueabihf', 'freebsd', 'windows-cygnus', 'wi
986993
config.target_shared_library_prefix = 'lib'
987994
config.target_shared_library_suffix = ".so"
988995
config.target_sdk_name = "freebsd"
996+
elif kIsAndroid:
997+
lit_config.note("Testing Android " + config.variant_triple)
998+
config.target_object_format = "elf"
999+
config.target_shared_library_prefix = 'lib'
1000+
config.target_shared_library_suffix = ".so"
1001+
config.target_sdk_name = "android"
9891002
else:
9901003
lit_config.note("Testing Linux " + config.variant_triple)
9911004
config.target_object_format = "elf"

0 commit comments

Comments
 (0)