Skip to content

Commit 21b370a

Browse files
authored
Merge pull request swiftlang#19470 from compnerd/android-aarch64-cross
Android aarch64 cross
2 parents 01823ca + bcbe160 commit 21b370a

File tree

5 files changed

+61
-52
lines changed

5 files changed

+61
-52
lines changed

CMakeLists.txt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,6 @@ set(SWIFT_ANDROID_NDK_PATH "" CACHE STRING
187187
"Path to the directory that contains the Android NDK tools that are executable on the build machine")
188188
set(SWIFT_ANDROID_NDK_GCC_VERSION "" CACHE STRING
189189
"The GCC version to use when building for Android. Currently only 4.9 is supported.")
190-
set(SWIFT_ANDROID_SDK_PATH "" CACHE STRING
191-
"Path to the directory that contains the Android SDK tools that will be passed to the swiftc frontend")
192190
set(SWIFT_ANDROID_DEPLOY_DEVICE_PATH "" CACHE STRING
193191
"Path on an Android device where build products will be pushed. These are used when running the test suite against the device")
194192

@@ -637,7 +635,6 @@ endif()
637635
# To fix it, we would need to append the architecture to the SDKs,
638636
# for example: 'OSX-x86_64;IOS-armv7;...etc'.
639637
# We could easily do that - we have all of that information in build-script-impl.
640-
# Also, we would need to be provided with the sysroot for each SDK (see SWIFT_ANDROID_SDK_PATH/SWIFT_SDK_ANDROID_PATH).
641638
# Darwin targets cheat and use `xcrun`.
642639

643640
if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
@@ -760,16 +757,20 @@ endif()
760757
# Should we cross-compile the standard library for Android?
761758
is_sdk_requested(ANDROID swift_build_android)
762759
if(swift_build_android AND NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
763-
764-
configure_sdk_unix(ANDROID "Android" "android" "android" "armv7" "armv7-none-linux-androideabi" "${SWIFT_ANDROID_SDK_PATH}")
765-
766-
if (NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux"))
760+
if (NOT ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Darwin" OR "${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux"))
767761
message(FATAL_ERROR "A Darwin or Linux host is required to build the Swift runtime for Android")
768-
elseif(("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" AND NOT swift_build_osx) OR
769-
("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND NOT swift_build_linux))
762+
endif()
763+
764+
if(("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" AND NOT swift_build_osx) OR
765+
("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND NOT swift_build_linux))
770766
set(SWIFT_PRIMARY_VARIANT_SDK_default "ANDROID")
771767
set(SWIFT_PRIMARY_VARIANT_ARCH_default "armv7")
772768
endif()
769+
770+
if("${SWIFT_SDK_ANDROID_ARCHITECTURES}" STREQUAL "")
771+
set(SWIFT_SDK_ANDROID_ARCHITECTURES armv7;aarch)
772+
endif()
773+
configure_sdk_unix(ANDROID "Android" "android" "android" "${SWIFT_SDK_ANDROID_ARCHITECTURES}" "" "")
773774
endif()
774775

775776
# Should we cross-compile the standard library for Windows?

cmake/modules/AddSwift.cmake

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,14 @@ function(_add_variant_link_flags)
411411
elseif("${LFLAGS_SDK}" STREQUAL "HAIKU")
412412
list(APPEND result "-lbsd" "-latomic" "-Wl,-Bsymbolic")
413413
elseif("${LFLAGS_SDK}" STREQUAL "ANDROID")
414-
list(APPEND result
415-
"-ldl" "-llog" "-latomic" "-licudataswift" "-licui18nswift" "-licuucswift"
416-
"${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so")
414+
list(APPEND result "-ldl" "-llog" "-latomic" "-licudataswift" "-licui18nswift" "-licuucswift")
415+
if("${LFLAGS_ARCH}" MATCHES armv7)
416+
list(APPEND result "${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so")
417+
elseif("${LFLAGS_ARCH}" MATCHES aarch64)
418+
list(APPEND result "${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so")
419+
else()
420+
message(SEND_ERROR "unknown architecture (${LFLAGS_ARCH}) for android")
421+
endif()
417422
swift_android_lib_for_arch(${LFLAGS_ARCH} ${LFLAGS_ARCH}_LIB)
418423
foreach(path IN LISTS ${LFLAGS_ARCH}_LIB)
419424
list(APPEND library_search_directories ${path})

cmake/modules/SwiftAndroidSupport.cmake

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@ function(swift_android_include_for_arch arch var)
1010
endfunction()
1111

1212
function(swift_android_lib_for_arch arch var)
13-
set(paths)
13+
set(_prebuilt "${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH}")
14+
set(_host "${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}")
1415

15-
if(arch STREQUAL armv7)
16-
list(APPEND paths
17-
"${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH}/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}/lib/armv7-a")
16+
set(paths)
17+
if(arch STREQUAL armv7)
18+
list(APPEND paths "${_prebuilt}/${_host}/lib/armv7-a")
19+
elseif(arch STREQUAL aarch64)
20+
list(APPEND paths "${_prebuilt}/${_host}/lib64")
21+
else()
22+
message(SEND_ERROR "unknown architecture (${arch}) for android")
1823
endif()
24+
list(APPEND paths "${_prebuilt}/lib/gcc/${_host}/${SWIFT_ANDROID_NDK_GCC_VERSION}.x")
1925

20-
list(APPEND paths
21-
"${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH}/lib/gcc/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}/${SWIFT_ANDROID_NDK_GCC_VERSION}.x")
2226
set(${var} ${paths} PARENT_SCOPE)
2327
endfunction()

cmake/modules/SwiftConfigureSDK.cmake

Lines changed: 32 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -160,33 +160,6 @@ macro(configure_sdk_darwin
160160
_report_sdk("${prefix}")
161161
endmacro()
162162

163-
macro(_configure_sdk_android_specific
164-
prefix name lib_subdir triple_name architectures triple sdkpath)
165-
166-
foreach(arch ${architectures})
167-
if("${arch}" STREQUAL "armv7")
168-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "arm-linux-androideabi")
169-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "arm")
170-
else()
171-
message(FATAL_ERROR "unkonwn arch for android SDK: ${arch}")
172-
endif()
173-
174-
# Get the prebuilt suffix to create the correct toolchain path when using the NDK
175-
if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Darwin")
176-
set(_swift_android_prebuilt_suffix "darwin-x86_64")
177-
elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux")
178-
set(_swift_android_prebuilt_suffix "linux-x86_64")
179-
endif()
180-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH
181-
"${SWIFT_ANDROID_NDK_PATH}/toolchains/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_suffix}")
182-
183-
# Resolve the correct linker based on the file name of CMAKE_LINKER (being 'ld' or 'ld.gold' the options)
184-
get_filename_component(SWIFT_ANDROID_LINKER_NAME "${CMAKE_LINKER}" NAME)
185-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LINKER
186-
"${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH}/bin/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}-${SWIFT_ANDROID_LINKER_NAME}")
187-
endforeach()
188-
endmacro()
189-
190163
macro(configure_sdk_unix
191164
prefix name lib_subdir triple_name architectures triple sdkpath)
192165
# Note: this has to be implemented as a macro because it sets global
@@ -207,17 +180,43 @@ macro(configure_sdk_unix
207180
endif()
208181

209182
foreach(arch ${architectures})
210-
set(SWIFT_SDK_${prefix}_ARCH_${arch}_PATH "${sdkpath}")
211-
set(SWIFT_SDK_${prefix}_ARCH_${arch}_TRIPLE "${triple}")
183+
if("${prefix}" STREQUAL "ANDROID")
184+
if("${arch}" STREQUAL "armv7")
185+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "arm-linux-androideabi")
186+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "arm")
187+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-arm")
188+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "armv7-none-linux-androideabi")
189+
elseif("${arch}" STREQUAL "aarch64")
190+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "aarch64-linux-android")
191+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_ALT_SPELLING "aarch64")
192+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-${SWIFT_ANDROID_API_LEVEL}/arch-arm64")
193+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_TRIPLE "aarch64-unknown-linux-android")
194+
else()
195+
message(FATAL_ERROR "unknown arch for android SDK: ${arch}")
196+
endif()
197+
198+
# Get the prebuilt suffix to create the correct toolchain path when using the NDK
199+
if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Darwin")
200+
set(_swift_android_prebuilt_build "darwin-x86_64")
201+
elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux")
202+
set(_swift_android_prebuilt_build "linux-x86_64")
203+
endif()
204+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH
205+
"${SWIFT_ANDROID_NDK_PATH}/toolchains/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_build}")
206+
207+
# Resolve the correct linker based on the file name of CMAKE_LINKER (being 'ld' or 'ld.gold' the options)
208+
get_filename_component(SWIFT_ANDROID_LINKER_NAME "${CMAKE_LINKER}" NAME)
209+
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LINKER
210+
"${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_PREBUILT_PATH}/bin/${SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE}-${SWIFT_ANDROID_LINKER_NAME}")
211+
else()
212+
set(SWIFT_SDK_${prefix}_ARCH_${arch}_PATH "${sdkpath}")
213+
set(SWIFT_SDK_${prefix}_ARCH_${arch}_TRIPLE "${triple}")
214+
endif()
212215
endforeach()
213216

214217
# Add this to the list of known SDKs.
215218
list(APPEND SWIFT_CONFIGURED_SDKS "${prefix}")
216219

217-
if("${prefix}" STREQUAL "ANDROID")
218-
_configure_sdk_android_specific(${prefix} ${name} ${lib_subdir} ${triple_name} ${architectures} ${triple} ${sdkpath})
219-
endif()
220-
221220
_report_sdk("${prefix}")
222221
endmacro()
223222

utils/build-script-impl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2074,12 +2074,12 @@ for host in "${ALL_HOSTS[@]}"; do
20742074
"${cmake_options[@]}"
20752075
-DSWIFT_ANDROID_NDK_PATH:STRING="${ANDROID_NDK}"
20762076
-DSWIFT_ANDROID_NDK_GCC_VERSION:STRING="${ANDROID_NDK_GCC_VERSION}"
2077-
-DSWIFT_ANDROID_SDK_PATH:STRING="${ANDROID_NDK}/platforms/android-${ANDROID_API_LEVEL}/arch-arm"
20782077
-DSWIFT_ANDROID_API_LEVEL:STRING="${ANDROID_API_LEVEL}"
20792078
-DSWIFT_ANDROID_armv7_ICU_UC:STRING="${ANDROID_ICU_UC}"
20802079
-DSWIFT_ANDROID_armv7_ICU_UC_INCLUDE:STRING="${ANDROID_ICU_UC_INCLUDE}"
20812080
-DSWIFT_ANDROID_armv7_ICU_I18N:STRING="${ANDROID_ICU_I18N}"
20822081
-DSWIFT_ANDROID_armv7_ICU_I18N_INCLUDE:STRING="${ANDROID_ICU_I18N_INCLUDE}"
2082+
-DSWIFT_SDK_ANDROID_ARCHITECTURES:STRING="armv7"
20832083
-DSWIFT_ANDROID_DEPLOY_DEVICE_PATH:STRING="${ANDROID_DEPLOY_DEVICE_PATH}"
20842084
)
20852085
fi

0 commit comments

Comments
 (0)