Skip to content

Commit be5a34e

Browse files
committed
[Android] Enable building static stdlib on macOS
The Swift runtime can be built for Android on Linux host machines using the instructions in `docs/Android.md`. This commit allows a static build of the runtime to be compiled on macOS host machines as well. This work is inspired by @compnerd's work in enabling Windows builds from macOS hosts. It assumes host tools are already built for macOS. It also does not support building SDK overlays yet. I intend to support these in a future commit. For now, the Android runtime may be built by using the following bash script, which simply calls CMake: ```sh set -e set -x HOME_DIR="/Users/bgesiak" APPLE_DIR="${HOME_DIR}/GitHub/apple" BUILD_DIR="${APPLE_DIR}/build/Ninja-Release" CMARK_SRC_DIR="${APPLE_DIR}/cmark" CMARK_BUILD_DIR="${BUILD_DIR}/cmark-macosx-x86_64" LLVM_SRC_DIR="${APPLE_DIR}/llvm" LLVM_BUILD_DIR="${BUILD_DIR}/llvm-macosx-x86_64" SWIFT_BUILD_DIR="${BUILD_DIR}/swift-macosx-x86_64" ANDROID_NDK_DIR="${HOME_DIR}/android-ndk-r12b" LIBICU_SRC_DIR="${APPLE_DIR}/libiconv-libicu-android" LIBICU_BUILD_DIR="${LIBICU_SRC_DIR}/armeabi-v7a" SWIFT_ANDROID_BUILD_DIR="${APPLE_DIR}/build/SwiftAndroid" mkdir -p "${SWIFT_ANDROID_BUILD_DIR}" cmake \ -G "Ninja" \ \ -DCMAKE_C_COMPILER:PATH="${LLVM_BUILD_DIR}/bin/clang" \ -DCMAKE_CXX_COMPILER:PATH="${LLVM_BUILD_DIR}/bin/clang++" \ \ -DSWIFT_PATH_TO_CMARK_SOURCE:PATH="${CMARK_SRC_DIR}" \ -DSWIFT_PATH_TO_CMARK_BUILD:PATH="${CMARK_BUILD_DIR}" \ -DSWIFT_CMARK_LIBRARY_DIR:PATH="${CMARK_BUILD_DIR}/src" \ -DSWIFT_PATH_TO_LLVM_SOURCE:PATH="${LLVM_SRC_DIR}" \ -DSWIFT_PATH_TO_LLVM_BUILD:PATH="${LLVM_BUILD_DIR}" \ -DSWIFT_PATH_TO_CLANG_SOURCE:PATH="${LLVM_SRC_DIR}/tools/clang" \ -DSWIFT_PATH_TO_CLANG_BUILD:PATH="${LLVM_BUILD_DIR}" \ -DSWIFT_NATIVE_LLVM_TOOLS_PATH:STRING="${LLVM_BUILD_DIR}/bin" \ -DSWIFT_NATIVE_SWIFT_TOOLS_PATH:STRING="${SWIFT_BUILD_DIR}/bin" \ \ -DSWIFT_ANALYZE_CODE_COVERAGE:STRING=FALSE \ -DSWIFT_SERIALIZE_STDLIB_UNITTEST:BOOL=FALSE \ -DSWIFT_STDLIB_SIL_DEBUGGING:BOOL=FALSE \ -DSWIFT_CHECK_INCREMENTAL_COMPILATION:BOOL=FALSE \ -DSWIFT_STDLIB_ENABLE_RESILIENCE:BOOL=FALSE \ -DSWIFT_STDLIB_SIL_SERIALIZE_ALL:BOOL=TRUE \ -DSWIFT_BUILD_PERF_TESTSUITE:BOOL=FALSE \ -DSWIFT_BUILD_EXAMPLES:BOOL=FALSE \ -DSWIFT_INCLUDE_TESTS:BOOL=FALSE \ -DSWIFT_EMBED_BITCODE_SECTION:BOOL=FALSE \ -DSWIFT_TOOLS_ENABLE_LTO:STRING= \ -DSWIFT_AST_VERIFIER:BOOL=TRUE \ -DSWIFT_SIL_VERIFY_ALL:BOOL=FALSE \ -DSWIFT_RUNTIME_ENABLE_LEAK_CHECKER:BOOL=FALSE \ \ -DCMAKE_BUILD_TYPE:STRING=Release \ -DLLVM_ENABLE_ASSERTIONS:BOOL=TRUE \ -DSWIFT_STDLIB_BUILD_TYPE:STRING=Release \ -DSWIFT_STDLIB_ASSERTIONS:BOOL=TRUE \ -DSWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER:BOOL=TRUE \ -DSWIFT_HOST_VARIANT=macosx \ -DSWIFT_HOST_VARIANT_SDK=OSX \ -DSWIFT_HOST_VARIANT_ARCH=x86_64 \ -DSWIFT_BUILD_TOOLS:BOOL=FALSE \ -DSWIFT_INCLUDE_TOOLS:BOOL=FALSE \ -DSWIFT_BUILD_REMOTE_MIRROR:BOOL=FALSE \ -DSWIFT_BUILD_DYNAMIC_STDLIB:BOOL=FALSE \ -DSWIFT_BUILD_STATIC_STDLIB:BOOL=TRUE \ -DSWIFT_BUILD_DYNAMIC_SDK_OVERLAY:BOOL=FALSE \ -DSWIFT_BUILD_STATIC_SDK_OVERLAY:BOOL=FALSE \ -DSWIFT_EXEC:STRING="${SWIFT_BUILD_DIR}/bin/swiftc" \ \ -DSWIFT_ENABLE_GOLD_LINKER:BOOL=TRUE \ -DSWIFT_SDKS:STRING=ANDROID \ -DSWIFT_ANDROID_NDK_PATH:STRING="${ANDROID_NDK_DIR}" \ -DSWIFT_ANDROID_NDK_GCC_VERSION:STRING=4.9 \ -DSWIFT_ANDROID_SDK_PATH:STRING="${ANDROID_NDK_DIR}/platforms/android-21/arch-arm" \ -DSWIFT_ANDROID_ICU_UC:STRING="${LIBICU_BUILD_DIR}" \ -DSWIFT_ANDROID_ICU_UC_INCLUDE:STRING="${LIBICU_BUILD_DIR}/icu/source/common" \ -DSWIFT_ANDROID_ICU_I18N:STRING="${LIBICU_BUILD_DIR}" \ -DSWIFT_ANDROID_ICU_I18N_INCLUDE:STRING="${LIBICU_BUILD_DIR}/icu/source/i18n" \ \ "${APPLE_DIR}/swift" cmake --build "${APPLE_DIR}/swift" -- -j8 swift-stdlib-android-armv7 ```
1 parent 3a493b2 commit be5a34e

File tree

2 files changed

+24
-19
lines changed

2 files changed

+24
-19
lines changed

CMakeLists.txt

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -566,23 +566,6 @@ if("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "LINUX")
566566
set(SWIFT_PRIMARY_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH}")
567567
endif()
568568

569-
# Compatible cross-compile SDKS for LINUX: ANDROID (arch always armv7)
570-
is_sdk_requested(ANDROID swift_build_android)
571-
if("${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
572-
set(swift_can_crosscompile_stdlib_android FALSE)
573-
else()
574-
set(swift_can_crosscompile_stdlib_android TRUE)
575-
endif()
576-
577-
if(swift_build_android AND ${swift_can_crosscompile_stdlib_android})
578-
configure_sdk_unix(ANDROID "Android" "android" "android" "armv7" "armv7-none-linux-androideabi" "${SWIFT_ANDROID_SDK_PATH}")
579-
# If we're not building for the host, the cross-compiled target should be the 'primary variant'.
580-
if("${swift_build_linux}" STREQUAL "FALSE")
581-
set(SWIFT_PRIMARY_VARIANT_SDK_default "ANDROID")
582-
set(SWIFT_PRIMARY_VARIANT_ARCH_default "armv7")
583-
endif()
584-
endif()
585-
586569
elseif("${SWIFT_HOST_VARIANT_SDK}" STREQUAL "FREEBSD")
587570

588571
set(CMAKE_EXECUTABLE_FORMAT "ELF")
@@ -727,6 +710,28 @@ if("${SWIFT_PRIMARY_VARIANT_ARCH}" STREQUAL "")
727710
set(SWIFT_PRIMARY_VARIANT_ARCH "${SWIFT_PRIMARY_VARIANT_ARCH_default}")
728711
endif()
729712

713+
# Should we cross-compile the standard library for Android?
714+
is_sdk_requested(ANDROID swift_build_android)
715+
if(swift_build_android AND NOT "${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
716+
configure_sdk_unix(ANDROID "Android" "android" "android" "armv7" "armv7-none-linux-androideabi" "${SWIFT_ANDROID_SDK_PATH}")
717+
718+
if (NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Linux"))
719+
message(FATAL_ERROR "A Darwin or Linux host is required to build the Swift runtime for Android")
720+
elseif(("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" AND NOT swift_build_osx) OR
721+
("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND NOT swift_build_linux))
722+
set(SWIFT_PRIMARY_VARIANT_SDK_default "ANDROID")
723+
set(SWIFT_PRIMARY_VARIANT_ARCH_default "armv7")
724+
endif()
725+
726+
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
727+
set(_swift_android_prebuilt_suffix "darwin-x86_64")
728+
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
729+
set(_swift_android_prebuilt_suffix "linux-x86_64")
730+
endif()
731+
set(SWIFT_ANDROID_PREBUILT_PATH
732+
"${SWIFT_ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/${_swift_android_prebuilt_suffix}")
733+
endif()
734+
730735
# Should we cross-compile the standard library for Windows?
731736
is_sdk_requested(WINDOWS swift_build_windows)
732737
if(swift_build_windows)

cmake/modules/AddSwift.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ function(_add_variant_c_compile_link_flags)
122122
list(APPEND result
123123
"--sysroot=${SWIFT_ANDROID_SDK_PATH}"
124124
# Use the linker included in the Android NDK.
125-
"-B" "${SWIFT_ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/linux-x86_64/arm-linux-androideabi/bin/")
125+
"-B" "${SWIFT_ANDROID_PREBUILT_PATH}/arm-linux-androideabi/bin/")
126126
endif()
127127

128128
if("${CFLAGS_SDK}" STREQUAL "WINDOWS")
@@ -315,7 +315,7 @@ function(_add_variant_link_flags)
315315
elseif("${LFLAGS_SDK}" STREQUAL "ANDROID")
316316
list(APPEND result
317317
"-ldl"
318-
"-L${SWIFT_ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-${SWIFT_ANDROID_NDK_GCC_VERSION}/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/${SWIFT_ANDROID_NDK_GCC_VERSION}.x"
318+
"-L${SWIFT_ANDROID_PREBUILT_PATH}/lib/gcc/arm-linux-androideabi/${SWIFT_ANDROID_NDK_GCC_VERSION}.x"
319319
"${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so")
320320
else()
321321
list(APPEND result "-lobjc")

0 commit comments

Comments
 (0)