Skip to content

Commit 6a76c3d

Browse files
authored
Merge pull request #35820 from buttaface/ndk-sysroot
[5.4][android] Move to the NDK's unified sysroot
2 parents bb82157 + c128a3c commit 6a76c3d

File tree

12 files changed

+94
-215
lines changed

12 files changed

+94
-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}"
@@ -272,18 +276,6 @@ function(_add_host_variant_c_compile_flags target)
272276
target_compile_options(${target} PRIVATE -funwind-tables)
273277
endif()
274278

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

354-
swift_android_lib_for_arch(${SWIFT_HOST_VARIANT_ARCH}
346+
swift_android_libgcc_for_arch_cross_compile(${SWIFT_HOST_VARIANT_ARCH}
355347
${SWIFT_HOST_VARIANT_ARCH}_LIB)
356348
target_link_directories(${target} PRIVATE
357349
${${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
@@ -55,12 +55,6 @@ function(_report_sdk prefix)
5555
if(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
5656
message(STATUS " Sysroot: ${SWIFT_ANDROID_NATIVE_SYSROOT}")
5757
endif()
58-
foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES})
59-
swift_android_include_for_arch(${arch} ${arch}_INCLUDE)
60-
swift_android_lib_for_arch(${arch} ${arch}_LIB)
61-
message(STATUS " ${arch} INCLUDE: ${${arch}_INCLUDE}")
62-
message(STATUS " ${arch} LIB: ${${arch}_LIB}")
63-
endforeach()
6458
else()
6559
foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES})
6660
message(STATUS " ${arch} Path: ${SWIFT_SDK_${prefix}_ARCH_${arch}_PATH}")
@@ -277,76 +271,32 @@ macro(configure_sdk_unix name architectures)
277271

278272
foreach(arch ${architectures})
279273
if("${prefix}" STREQUAL "ANDROID")
280-
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
281-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NDK_PATH}/sysroot/usr/include" CACHE STRING "Path to C library headers")
282-
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")
283-
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
284-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/include" CACHE STRING "Path to C library headers")
285-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_ANDROID_NATIVE_SYSROOT}/usr/include" CACHE STRING "Path to C library architecture headers")
286-
else()
287-
message(SEND_ERROR "Couldn't find LIBC_INCLUDE_DIRECTORY for Android")
288-
endif()
274+
swift_android_sysroot(android_sysroot)
275+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${android_sysroot}")
276+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${android_sysroot}/usr/include" CACHE STRING "Path to C library headers")
277+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${android_sysroot}/usr/include" CACHE STRING "Path to C library architecture headers")
289278

290279
if("${arch}" STREQUAL "armv7")
291280
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "arm-linux-androideabi")
292281
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "arm")
293-
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
294-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-arm")
295-
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
296-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NATIVE_SYSROOT}")
297-
else()
298-
message(SEND_ERROR "Couldn't find SWIFT_SDK_ANDROID_ARCH_armv7_PATH")
299-
endif()
300282
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "armv7-unknown-linux-androideabi")
301283
# The Android ABI isn't part of the module triple.
302284
set(SWIFT_SDK_ANDROID_ARCH_${arch}_MODULE "armv7-unknown-linux-android")
303285
elseif("${arch}" STREQUAL "aarch64")
304286
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "aarch64-linux-android")
305287
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "aarch64")
306-
if(NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
307-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-arm64")
308-
elseif(NOT "${SWIFT_ANDROID_NATIVE_SYSROOT}" STREQUAL "")
309-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NATIVE_SYSROOT}")
310-
else()
311-
message(SEND_ERROR "Couldn't find SWIFT_SDK_ANDROID_ARCH_aarch64_PATH")
312-
endif()
313288
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "aarch64-unknown-linux-android")
314289
elseif("${arch}" STREQUAL "i686")
315290
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "i686-linux-android")
316291
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "i686")
317-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-x86")
318292
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "i686-unknown-linux-android")
319293
elseif("${arch}" STREQUAL "x86_64")
320294
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "x86_64-linux-android")
321295
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "x86_64")
322-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-x86_64")
323296
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "x86_64-unknown-linux-android")
324297
else()
325298
message(FATAL_ERROR "unknown arch for android SDK: ${arch}")
326299
endif()
327-
328-
# Get the prebuilt suffix to create the correct toolchain path when using the NDK
329-
if(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
330-
set(_swift_android_prebuilt_build darwin-x86_64)
331-
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux)
332-
set(_swift_android_prebuilt_build linux-x86_64)
333-
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
334-
set(_swift_android_prebuilt_build Windows-x86_64)
335-
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Android)
336-
# When building natively on an Android host, there's no NDK or prebuilt suffix.
337-
else()
338-
message(SEND_ERROR "cannot cross-compile to android from ${CMAKE_HOST_SYSTEM_NAME}")
339-
endif()
340-
if("${arch}" STREQUAL "i686")
341-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH
342-
"${SWIFT_ANDROID_NDK_PATH}/toolchains/x86-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_build}")
343-
elseif("${arch}" STREQUAL "x86_64")
344-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH
345-
"${SWIFT_ANDROID_NDK_PATH}/toolchains/x86_64-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_build}")
346-
else()
347-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH
348-
"${SWIFT_ANDROID_NDK_PATH}/toolchains/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_build}")
349-
endif()
350300
else()
351301
set(SWIFT_SDK_${prefix}_ARCH_${arch}_PATH "/" CACHE STRING "CMAKE_SYSROOT for ${prefix} ${arch}")
352302

0 commit comments

Comments
 (0)