Skip to content

Commit e6f5913

Browse files
authored
[android] Move to the NDK's unified sysroot (#34491)
Since the NDK removes the platforms/ and sysroot/ directories in the latest NDK 22, switch to the unified sysroot in toolchains/llvm/ and take advantage of a bunch of simplification that's now possible.
1 parent d622bdc commit e6f5913

File tree

13 files changed

+96
-215
lines changed

13 files changed

+96
-215
lines changed

cmake/modules/AddSwift.cmake

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ function(_add_host_variant_c_compile_link_flags name)
8282
set(DEPLOYMENT_VERSION "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_DEPLOYMENT_VERSION}")
8383
endif()
8484

85+
if(SWIFT_HOST_VARIANT_SDK STREQUAL ANDROID)
86+
set(DEPLOYMENT_VERSION ${SWIFT_ANDROID_API_LEVEL})
87+
endif()
88+
8589
# MSVC, clang-cl, gcc don't understand -target.
8690
if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND NOT SWIFT_COMPILER_IS_MSVC_LIKE)
8791
get_target_triple(target target_variant "${SWIFT_HOST_VARIANT_SDK}" "${SWIFT_HOST_VARIANT_ARCH}"
@@ -271,18 +275,6 @@ function(_add_host_variant_c_compile_flags target)
271275
target_compile_options(${target} PRIVATE -funwind-tables)
272276
endif()
273277

274-
if(SWIFT_HOST_VARIANT_SDK STREQUAL ANDROID)
275-
target_compile_options(${target} PRIVATE -nostdinc++)
276-
swift_android_libcxx_include_paths(CFLAGS_CXX_INCLUDES)
277-
swift_android_include_for_arch("${SWIFT_HOST_VARIANT_ARCH}"
278-
"${SWIFT_HOST_VARIANT_ARCH}_INCLUDE")
279-
target_include_directories(${target} SYSTEM PRIVATE
280-
${CFLAGS_CXX_INCLUDES}
281-
${${SWIFT_HOST_VARIANT_ARCH}_INCLUDE})
282-
target_compile_definitions(${target} PRIVATE
283-
__ANDROID_API__=${SWIFT_ANDROID_API_LEVEL})
284-
endif()
285-
286278
if(SWIFT_HOST_VARIANT_SDK STREQUAL "LINUX")
287279
if(SWIFT_HOST_VARIANT_ARCH STREQUAL x86_64)
288280
# this is the minimum architecture that supports 16 byte CAS, which is
@@ -350,7 +342,7 @@ function(_add_host_variant_link_flags target)
350342
target_link_libraries(${target} PRIVATE
351343
${cxx_link_libraries})
352344

353-
swift_android_lib_for_arch(${SWIFT_HOST_VARIANT_ARCH}
345+
swift_android_libgcc_for_arch_cross_compile(${SWIFT_HOST_VARIANT_ARCH}
354346
${SWIFT_HOST_VARIANT_ARCH}_LIB)
355347
target_link_directories(${target} PRIVATE
356348
${${SWIFT_HOST_VARIANT_ARCH}_LIB})

cmake/modules/AddSwiftUnittests.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ function(add_swift_unittest test_dirname)
4848
COMMAND "${SWIFT_SOURCE_DIR}/utils/swift-rpathize.py"
4949
"$<TARGET_FILE:${test_dirname}>")
5050
elseif("${SWIFT_HOST_VARIANT}" STREQUAL "android")
51-
swift_android_lib_for_arch(${SWIFT_HOST_VARIANT_ARCH} android_system_libs)
51+
swift_android_libgcc_for_arch_cross_compile(${SWIFT_HOST_VARIANT_ARCH} android_system_libs)
5252
set_property(TARGET "${test_dirname}" APPEND PROPERTY LINK_DIRECTORIES
5353
"${android_system_libs}")
5454
set_property(TARGET "${test_dirname}" APPEND PROPERTY LINK_LIBRARIES "log")

cmake/modules/SwiftAndroidSupport.cmake

Lines changed: 30 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,50 @@
1-
function(swift_android_libcxx_include_paths var)
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)
1+
function(swift_android_prebuilt_host_name prebuilt_var_name)
2+
# Get the prebuilt suffix to create the correct toolchain path when using the NDK
3+
if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
4+
set(${prebuilt_var_name} darwin-x86_64 PARENT_SCOPE)
5+
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux)
6+
set(${prebuilt_var_name} linux-x86_64 PARENT_SCOPE)
7+
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
8+
set(${prebuilt_var_name} Windows-x86_64 PARENT_SCOPE)
119
else()
12-
message(SEND_ERROR "Couldn't set libc++ include paths for Android")
10+
message(SEND_ERROR "cannot cross-compile to android from ${CMAKE_HOST_SYSTEM_NAME}")
1311
endif()
1412
endfunction()
1513

16-
function(swift_android_include_for_arch arch var)
14+
function(swift_android_libgcc_for_arch_cross_compile arch var)
1715
set(paths)
1816
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")
17+
list(APPEND paths "${SWIFT_SDK_ANDROID_ARCH_${arch}_PATH}/../lib/gcc/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}/${SWIFT_ANDROID_NDK_GCC_VERSION}.x")
2918
endif()
3019
set(${var} ${paths} PARENT_SCOPE)
3120
endfunction()
3221

33-
function(swift_android_lib_for_arch arch var)
34-
set(_prebuilt "${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH}")
35-
set(_host "${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}")
36-
37-
set(paths)
22+
function(swift_android_sysroot sysroot_var_name)
3823
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")
24+
swift_android_prebuilt_host_name(prebuilt_build)
25+
set(${sysroot_var_name} "${SWIFT_ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/${prebuilt_build}/sysroot" PARENT_SCOPE)
5126
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()
27+
set(${sysroot_var_name} "${SWIFT_ANDROID_NATIVE_SYSROOT}" PARENT_SCOPE)
6028
else()
61-
message(SEND_ERROR "Couldn't set ${arch} library paths for Android")
29+
message(SEND_ERROR "Couldn't find Android sysroot")
6230
endif()
63-
64-
set(${var} ${paths} PARENT_SCOPE)
6531
endfunction()
6632

6733
function(swift_android_tools_path arch path_var_name)
6834
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)
35+
swift_android_prebuilt_host_name(prebuilt_build)
36+
if("${arch}" STREQUAL "i686")
37+
set(ndk_prebuilt_path
38+
"${SWIFT_ANDROID_NDK_PATH}/toolchains/x86-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${prebuilt_build}")
39+
elseif("${arch}" STREQUAL "x86_64")
40+
set(ndk_prebuilt_path
41+
"${SWIFT_ANDROID_NDK_PATH}/toolchains/x86_64-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${prebuilt_build}")
42+
else()
43+
set(ndk_prebuilt_path
44+
"${SWIFT_ANDROID_NDK_PATH}/toolchains/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${prebuilt_build}")
45+
endif()
46+
47+
set(${path_var_name} "${ndk_prebuilt_path}/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}/bin" PARENT_SCOPE)
7048
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
7149
set(${path_var_name} "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/bin" PARENT_SCOPE)
7250
else()
@@ -77,19 +55,7 @@ endfunction ()
7755
function(swift_android_cxx_libraries_for_arch arch libraries_var_name)
7856
set(link_libraries)
7957
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}")
58+
set(android_libcxx_path "${SWIFT_SDK_ANDROID_ARCH_${arch}_PATH}/usr/lib/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}")
9359
list(APPEND link_libraries ${android_libcxx_path}/libc++abi.a
9460
${android_libcxx_path}/libc++_shared.so)
9561
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")

cmake/modules/SwiftConfigureSDK.cmake

Lines changed: 4 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,6 @@ function(_report_sdk prefix)
5454
if(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
5555
message(STATUS " Sysroot: ${SWIFT_ANDROID_NATIVE_SYSROOT}")
5656
endif()
57-
foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES})
58-
swift_android_include_for_arch(${arch} ${arch}_INCLUDE)
59-
swift_android_lib_for_arch(${arch} ${arch}_LIB)
60-
message(STATUS " ${arch} INCLUDE: ${${arch}_INCLUDE}")
61-
message(STATUS " ${arch} LIB: ${${arch}_LIB}")
62-
endforeach()
6357
else()
6458
foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES})
6559
message(STATUS " ${arch} Path: ${SWIFT_SDK_${prefix}_ARCH_${arch}_PATH}")
@@ -273,76 +267,32 @@ macro(configure_sdk_unix name architectures)
273267

274268
foreach(arch ${architectures})
275269
if("${prefix}" STREQUAL "ANDROID")
276-
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
277-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include" CACHE STRING "Path to C library headers")
278-
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")
279-
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
280-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/include" CACHE STRING "Path to C library headers")
281-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/include" CACHE STRING "Path to C library architecture headers")
282-
else()
283-
message(SEND_ERROR "Couldn't find LIBC_INCLUDE_DIRECTORY for Android")
284-
endif()
270+
swift_android_sysroot(android_sysroot)
271+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${android_sysroot}")
272+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${android_sysroot}/usr/include" CACHE STRING "Path to C library headers")
273+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${android_sysroot}/usr/include" CACHE STRING "Path to C library architecture headers")
285274

286275
if("${arch}" STREQUAL "armv7")
287276
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "arm-linux-androideabi")
288277
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "arm")
289-
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
290-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-arm")
291-
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
292-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NATIVE_SYSROOT}")
293-
else()
294-
message(SEND_ERROR "Couldn't find SWIFT_SDK_ANDROID_ARCH_armv7_PATH")
295-
endif()
296278
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "armv7-unknown-linux-androideabi")
297279
# The Android ABI isn't part of the module triple.
298280
set(SWIFT_SDK_ANDROID_ARCH_${arch}_MODULE "armv7-unknown-linux-android")
299281
elseif("${arch}" STREQUAL "aarch64")
300282
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "aarch64-linux-android")
301283
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "aarch64")
302-
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
303-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-arm64")
304-
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
305-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NATIVE_SYSROOT}")
306-
else()
307-
message(SEND_ERROR "Couldn't find SWIFT_SDK_ANDROID_ARCH_aarch64_PATH")
308-
endif()
309284
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "aarch64-unknown-linux-android")
310285
elseif("${arch}" STREQUAL "i686")
311286
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "i686-linux-android")
312287
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "i686")
313-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-x86")
314288
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "i686-unknown-linux-android")
315289
elseif("${arch}" STREQUAL "x86_64")
316290
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "x86_64-linux-android")
317291
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "x86_64")
318-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-x86_64")
319292
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "x86_64-unknown-linux-android")
320293
else()
321294
message(FATAL_ERROR "unknown arch for android SDK: ${arch}")
322295
endif()
323-
324-
# Get the prebuilt suffix to create the correct toolchain path when using the NDK
325-
if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
326-
set(_swift_android_prebuilt_build darwin-x86_64)
327-
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux)
328-
set(_swift_android_prebuilt_build linux-x86_64)
329-
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
330-
set(_swift_android_prebuilt_build Windows-x86_64)
331-
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Android)
332-
# When building natively on an Android host, there's no NDK or prebuilt suffix.
333-
else()
334-
message(SEND_ERROR "cannot cross-compile to android from ${CMAKE_HOST_SYSTEM_NAME}")
335-
endif()
336-
if("${arch}" STREQUAL "i686")
337-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH
338-
"${SWIFT_ANDROID_NDK_PATH}/toolchains/x86-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_build}")
339-
elseif("${arch}" STREQUAL "x86_64")
340-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH
341-
"${SWIFT_ANDROID_NDK_PATH}/toolchains/x86_64-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_build}")
342-
else()
343-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH
344-
"${SWIFT_ANDROID_NDK_PATH}/toolchains/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_build}")
345-
endif()
346296
else()
347297
set(SWIFT_SDK_${prefix}_ARCH_${arch}_PATH "/" CACHE STRING "CMAKE_SYSROOT for ${prefix} ${arch}")
348298

0 commit comments

Comments
 (0)