Skip to content

Commit b39f55d

Browse files
committed
Add android option to install-and-build-with-sdk.sh
1 parent 6e10732 commit b39f55d

File tree

1 file changed

+112
-10
lines changed

1 file changed

+112
-10
lines changed

.github/workflows/scripts/install-and-build-with-sdk.sh

Lines changed: 112 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ error() { printf -- "** ERROR: %s\n" "$*" >&2; }
1818
fatal() { error "$@"; exit 1; }
1919

2020
# Parse command line options
21+
INSTALL_ANDROID=false
2122
INSTALL_STATIC_LINUX=false
2223
INSTALL_WASM=false
2324
BUILD_EMBEDDED_WASM=false
@@ -27,6 +28,10 @@ SWIFT_BUILD_COMMAND="swift build"
2728

2829
while [[ $# -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
@@ -64,14 +69,15 @@ done
6469

6570
# Validate arguments
6671
if [[ -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>"
6873
fi
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"
7277
fi
7378

7479
log "Requested Swift version: $SWIFT_VERSION_INPUT"
80+
log "Install Android Swift SDK: $INSTALL_ANDROID"
7581
log "Install Static Linux Swift SDK: $INSTALL_STATIC_LINUX"
7682
log "Install Wasm Swift SDK: $INSTALL_WASM"
7783
if [[ -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>
107113
find_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>"
175199
find_latest_sdk_snapshot() {
@@ -206,6 +230,8 @@ find_latest_sdk_snapshot() {
206230
}
207231

208232
SWIFT_VERSION_BRANCH=""
233+
ANDROID_SDK_TAG=""
234+
ANDROID_SDK_CHECKSUM=""
209235
STATIC_LINUX_SDK_TAG=""
210236
STATIC_LINUX_SDK_CHECKSUM=""
211237
WASM_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)
247283
fi
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+
250290
if [[ "$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"
252292
fi
@@ -439,9 +479,25 @@ download_and_extract_toolchain() {
439479
}
440480

441481
INSTALLED_SWIFT_TAG=$(get_installed_swift_tag)
482+
SWIFT_EXECUTABLE_FOR_ANDROID_SDK=""
442483
SWIFT_EXECUTABLE_FOR_STATIC_LINUX_SDK=""
443484
SWIFT_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+
445501
if [[ "$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
473529
fi
474530

531+
ANDROID_SDK_DOWNLOAD_ROOT="${SWIFT_DOWNLOAD_ROOT}/${SWIFT_VERSION_BRANCH}/android-sdk"
475532
STATIC_LINUX_SDK_DOWNLOAD_ROOT="${SWIFT_DOWNLOAD_ROOT}/${SWIFT_VERSION_BRANCH}/static-sdk"
476533
WASM_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+
478556
install_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

520598
install_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

Comments
 (0)