@@ -18,6 +18,7 @@ error() { printf -- "** ERROR: %s\n" "$*" >&2; }
1818fatal () { error " $@ " ; exit 1; }
1919
2020# Parse command line options
21+ INSTALL_ANDROID=false
2122INSTALL_STATIC_LINUX=false
2223INSTALL_WASM=false
2324BUILD_EMBEDDED_WASM=false
@@ -27,6 +28,10 @@ SWIFT_BUILD_COMMAND="swift build"
2728
2829while [[ $# -gt 0 ]]; do
2930 case $1 in
31+ --android)
32+ INSTALL_ANDROID=true
33+ shift
34+ ;;
3035 --static)
3136 INSTALL_STATIC_LINUX=true
3237 shift
6469
6570# Validate arguments
6671if [[ -z " $SWIFT_VERSION_INPUT " ]]; then
67- fatal " Usage: $0 [--static] [--wasm] [--flags=\" <build-flags>\" ] [--build-command=\" <build-command>\" ] <swift-version>"
72+ fatal " Usage: $0 [--android] [-- static] [--wasm] [--flags=\" <build-flags>\" ] [--build-command=\" <build-command>\" ] <swift-version>"
6873fi
6974
70- if [[ " $INSTALL_STATIC_LINUX " == false && " $INSTALL_WASM " == false ]]; then
71- fatal " At least one of --static or --wasm must be specified"
75+ if [[ " $INSTALL_ANDROID " == false && " $ INSTALL_STATIC_LINUX" == false && " $INSTALL_WASM " == false ]]; then
76+ fatal " At least one of --android or -- static or --wasm must be specified"
7277fi
7378
7479log " Requested Swift version: $SWIFT_VERSION_INPUT "
80+ log " Install Android Swift SDK: $INSTALL_ANDROID "
7581log " Install Static Linux Swift SDK: $INSTALL_STATIC_LINUX "
7682log " Install Wasm Swift SDK: $INSTALL_WASM "
7783if [[ -n " $SWIFT_BUILD_FLAGS " ]]; then
@@ -103,7 +109,7 @@ SWIFT_API_INSTALL_ROOT="https://www.swift.org/api/v1/install"
103109# and gets the checksum for the patch version's Static Linux and/or Wasm Swift SDK.
104110#
105111# $1 (string): A minor Swift version, e.g. "6.1"
106- # Output: A string of the form "<patch-version>|<static-checksum>|<wasm-checksum>
112+ # Output: A string of the form "<patch-version>|<android-checksum>|< static-checksum>|<wasm-checksum>
107113find_latest_swift_version () {
108114 local minor_version=" $1 "
109115
@@ -128,6 +134,23 @@ find_latest_swift_version() {
128134
129135 log " Found latest patch version: $latest_version "
130136
137+ local android_sdk_checksum=" "
138+ if [[ " $INSTALL_ANDROID " == true ]]; then
139+ android_sdk_checksum=$( echo " $releases_json " | jq -r --arg version " $latest_version " '
140+ .[]
141+ | select(.name == $version)
142+ | .platforms[]
143+ | select(.platform == "android")
144+ | .checksum
145+ ' )
146+
147+ if [[ -z " $android_sdk_checksum " ]]; then
148+ fatal " No Android Swift SDK checksum found for Swift $latest_version "
149+ fi
150+
151+ log " Found Android Swift SDK checksum: ${android_sdk_checksum: 0: 12} ..."
152+ fi
153+
131154 local static_linux_sdk_checksum=" "
132155 if [[ " $INSTALL_STATIC_LINUX " == true ]]; then
133156 static_linux_sdk_checksum=$( echo " $releases_json " | jq -r --arg version " $latest_version " '
@@ -162,14 +185,15 @@ find_latest_swift_version() {
162185 log " Found Swift SDK for Wasm checksum: ${wasm_sdk_checksum: 0: 12} ..."
163186 fi
164187
165- echo " ${latest_version} |${static_linux_sdk_checksum} |${wasm_sdk_checksum} "
188+ echo " ${latest_version} |${android_sdk_checksum} | ${ static_linux_sdk_checksum} |${wasm_sdk_checksum} "
166189}
167190
168- # Finds the latest Static Linux or Wasm Swift SDK development snapshot
169- # for the inputted Swift version and its checksum.
191+ # Finds the latest Android or Static Linux or Wasm
192+ # Swift SDK development snapshot for the inputted
193+ # Swift version and its checksum.
170194#
171195# $1 (string): Nightly Swift version, e.g. "6.2" or "main"
172- # $2 (string): "static" or "wasm"
196+ # $2 (string): "android" or " static" or "wasm"
173197# Output: A string of the form "<snapshot>|<sdk-checksum>",
174198# e.g. "swift-6.2-DEVELOPMENT-SNAPSHOT-2025-07-29-a|<sdk-checksum>"
175199find_latest_sdk_snapshot () {
@@ -206,6 +230,8 @@ find_latest_sdk_snapshot() {
206230}
207231
208232SWIFT_VERSION_BRANCH=" "
233+ ANDROID_SDK_TAG=" "
234+ ANDROID_SDK_CHECKSUM=" "
209235STATIC_LINUX_SDK_TAG=" "
210236STATIC_LINUX_SDK_CHECKSUM=" "
211237WASM_SDK_TAG=" "
@@ -220,6 +246,13 @@ if [[ "$SWIFT_VERSION_INPUT" == nightly-* ]]; then
220246 SWIFT_VERSION_BRANCH=" swift-${version} -branch"
221247 fi
222248
249+ if [[ " $INSTALL_ANDROID " == true ]]; then
250+ android_sdk_info=$( find_latest_sdk_snapshot " $version " " android" )
251+
252+ ANDROID_SDK_TAG=$( echo " $android_sdk_info " | cut -d' |' -f1)
253+ ANDROID_SDK_CHECKSUM=$( echo " $android_sdk_info " | cut -d' |' -f2)
254+ fi
255+
223256 if [[ " $INSTALL_STATIC_LINUX " == true ]]; then
224257 static_linux_sdk_info=$( find_latest_sdk_snapshot " $version " " static" )
225258
@@ -239,14 +272,21 @@ else
239272 latest_version=$( echo " $latest_version_info " | cut -d' |' -f1)
240273 SWIFT_VERSION_BRANCH=" swift-${latest_version} -release"
241274
275+ ANDROID_SDK_TAG=" swift-${latest_version} -RELEASE"
276+ ANDROID_SDK_CHECKSUM=$( echo " $latest_version_info " | cut -d' |' -f2)
277+
242278 STATIC_LINUX_SDK_TAG=" swift-${latest_version} -RELEASE"
243- STATIC_LINUX_SDK_CHECKSUM=$( echo " $latest_version_info " | cut -d' |' -f2 )
279+ STATIC_LINUX_SDK_CHECKSUM=$( echo " $latest_version_info " | cut -d' |' -f3 )
244280
245281 WASM_SDK_TAG=" swift-${latest_version} -RELEASE"
246- WASM_SDK_CHECKSUM=$( echo " $latest_version_info " | cut -d' |' -f3 )
282+ WASM_SDK_CHECKSUM=$( echo " $latest_version_info " | cut -d' |' -f4 )
247283fi
248284
249285# Validate that required Swift SDK tags are set
286+ if [[ " $INSTALL_ANDROID " == true && -z " $ANDROID_SDK_TAG " ]]; then
287+ fatal " ANDROID_SDK_TAG is not set but Android Swift SDK installation was requested"
288+ fi
289+
250290if [[ " $INSTALL_STATIC_LINUX " == true && -z " $STATIC_LINUX_SDK_TAG " ]]; then
251291 fatal " STATIC_LINUX_SDK_TAG is not set but Static Linux Swift SDK installation was requested"
252292fi
@@ -439,9 +479,25 @@ download_and_extract_toolchain() {
439479}
440480
441481INSTALLED_SWIFT_TAG=$( get_installed_swift_tag)
482+ SWIFT_EXECUTABLE_FOR_ANDROID_SDK=" "
442483SWIFT_EXECUTABLE_FOR_STATIC_LINUX_SDK=" "
443484SWIFT_EXECUTABLE_FOR_WASM_SDK=" "
444485
486+ if [[ " $INSTALL_ANDROID " == true ]]; then
487+ if [[ " $INSTALLED_SWIFT_TAG " == " $ANDROID_SDK_TAG " ]]; then
488+ log " Current toolchain matches Android Swift SDK snapshot: $ANDROID_SDK_TAG "
489+ SWIFT_EXECUTABLE_FOR_ANDROID_SDK=" swift"
490+ else
491+ log " Installing Swift toolchain to match Android Swift SDK snapshot: $ANDROID_SDK_TAG "
492+ initialize_os_info
493+ SWIFT_EXECUTABLE_FOR_ANDROID_SDK=$( download_and_extract_toolchain " $ANDROID_SDK_TAG " )
494+ if [[ $? -eq $EXIT_TOOLCHAIN_NOT_FOUND ]]; then
495+ # Don't fail the workflow if we can't find the right toolchain
496+ exit 0
497+ fi
498+ fi
499+ fi
500+
445501if [[ " $INSTALL_STATIC_LINUX " == true ]]; then
446502 if [[ " $INSTALLED_SWIFT_TAG " == " $STATIC_LINUX_SDK_TAG " ]]; then
447503 log " Current toolchain matches Static Linux Swift SDK snapshot: $STATIC_LINUX_SDK_TAG "
@@ -472,9 +528,31 @@ if [[ "$INSTALL_WASM" == true ]]; then
472528 fi
473529fi
474530
531+ ANDROID_SDK_DOWNLOAD_ROOT=" ${SWIFT_DOWNLOAD_ROOT} /${SWIFT_VERSION_BRANCH} /android-sdk"
475532STATIC_LINUX_SDK_DOWNLOAD_ROOT=" ${SWIFT_DOWNLOAD_ROOT} /${SWIFT_VERSION_BRANCH} /static-sdk"
476533WASM_SDK_DOWNLOAD_ROOT=" ${SWIFT_DOWNLOAD_ROOT} /${SWIFT_VERSION_BRANCH} /wasm-sdk"
477534
535+ install_android_sdk () {
536+ # Check if the Android Swift SDK is already installed
537+ if " $SWIFT_EXECUTABLE_FOR_ANDROID_SDK " sdk list 2> /dev/null | grep -q " ^${ANDROID_SDK_TAG} _android" ; then
538+ log " ✅ Android Swift SDK ${ANDROID_SDK_TAG} is already installed, skipping installation"
539+ return 0
540+ fi
541+
542+ log " Installing Android Swift SDK: $ANDROID_SDK_TAG "
543+
544+ local android_sdk_filename=" ${ANDROID_SDK_TAG} _android.artifactbundle.tar.gz"
545+ local sdk_url=" ${ANDROID_SDK_DOWNLOAD_ROOT} /${ANDROID_SDK_TAG} /${android_sdk_filename} "
546+
547+ log " Running: ${SWIFT_EXECUTABLE_FOR_ANDROID_SDK} sdk install ${sdk_url} --checksum ${ANDROID_SDK_CHECKSUM} "
548+
549+ if " $SWIFT_EXECUTABLE_FOR_ANDROID_SDK " sdk install " $sdk_url " --checksum " $ANDROID_SDK_CHECKSUM " ; then
550+ log " ✅ Android Swift SDK installed successfully"
551+ else
552+ fatal " Failed to install Android Swift SDK"
553+ fi
554+ }
555+
478556install_static_linux_sdk () {
479557 # Check if the Static Linux Swift SDK is already installed
480558 if " $SWIFT_EXECUTABLE_FOR_STATIC_LINUX_SDK " sdk list 2> /dev/null | grep -q " ^${STATIC_LINUX_SDK_TAG} _static-linux-0.0.1" ; then
@@ -518,6 +596,11 @@ install_wasm_sdk() {
518596}
519597
520598install_sdks () {
599+ if [[ " $INSTALL_ANDROID " == true ]]; then
600+ log " Starting install of Swift ${SWIFT_VERSION_INPUT} Android Swift SDK"
601+ install_android_sdk
602+ fi
603+
521604 if [[ " $INSTALL_STATIC_LINUX " == true ]]; then
522605 log " Starting install of Swift ${SWIFT_VERSION_INPUT} Static Linux Swift SDK"
523606 install_static_linux_sdk
@@ -533,6 +616,25 @@ build() {
533616 # Enable alias expansion to use a 'swift' alias for the executable path
534617 shopt -s expand_aliases
535618
619+ if [[ " $INSTALL_ANDROID " == true ]]; then
620+ log " Running Swift build with Android Swift SDK"
621+
622+ local sdk_name=" ${ANDROID_SDK_TAG} _android"
623+ alias swift=' $SWIFT_EXECUTABLE_FOR_ANDROID_SDK'
624+ local build_command=" $SWIFT_BUILD_COMMAND --swift-sdk $sdk_name "
625+ if [[ -n " $SWIFT_BUILD_FLAGS " ]]; then
626+ build_command=" $build_command $SWIFT_BUILD_FLAGS "
627+ fi
628+
629+ log " Running: $build_command "
630+
631+ if eval " $build_command " ; then
632+ log " ✅ Swift build with Android Swift SDK completed successfully"
633+ else
634+ fatal " Swift build with Android Swift SDK failed"
635+ fi
636+ fi
637+
536638 if [[ " $INSTALL_STATIC_LINUX " == true ]]; then
537639 log " Running Swift build with Static Linux Swift SDK"
538640
0 commit comments