Skip to content
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
b39f55d
Add android option to install-and-build-with-sdk.sh
marcprux Oct 21, 2025
9dd318a
Add CI to test Android
marcprux Oct 21, 2025
53f2759
Add CI to test Android
marcprux Oct 21, 2025
8544087
Update CI
marcprux Oct 21, 2025
1062734
Update CI
marcprux Oct 21, 2025
3004535
Update CI
marcprux Oct 21, 2025
8666be9
Update CI
marcprux Oct 21, 2025
c1f68d3
Update CI
marcprux Oct 21, 2025
3719c06
Update CI
marcprux Oct 21, 2025
628381c
Update CI
marcprux Oct 21, 2025
7a74b85
Update CI
marcprux Oct 21, 2025
05fe57c
Update CI
marcprux Oct 21, 2025
de933aa
Update CI
marcprux Oct 21, 2025
c441f05
Update CI
marcprux Oct 21, 2025
34ae290
Update CI
marcprux Oct 21, 2025
f4ba1d4
Update CI
marcprux Oct 21, 2025
8d92271
Update CI
marcprux Oct 21, 2025
7761637
Update CI
marcprux Oct 21, 2025
56b4f94
Default android_sdk_versions to nightly-main
marcprux Oct 21, 2025
03605e3
Lint fixes
marcprux Oct 21, 2025
2f1467e
Add Android to CI tests
marcprux Oct 21, 2025
ad50988
Lint fixes and update pull_request test to use branch install-and-bui…
marcprux Oct 21, 2025
b61be5e
Lint fixes and better location of swift-sdks install location
marcprux Oct 21, 2025
a430110
Lint fixes and better location of swift-sdks install location
marcprux Oct 21, 2025
fa17cb1
Better checking for swift-sdk install location; install NDK if it is …
marcprux Oct 21, 2025
3989386
Better checking for swift-sdk install location
marcprux Oct 21, 2025
e823d65
Better checking for swift-sdk install location
marcprux Oct 21, 2025
5404211
Better checking for swift-sdk install location
marcprux Oct 21, 2025
63138bb
Better checking for swift-sdk install location
marcprux Oct 21, 2025
122a8fa
Fix NDK installation
marcprux Oct 21, 2025
2fd85c0
Enable specifying --android-ndk-version flag
marcprux Oct 21, 2025
aefa767
Add comments and cleanup command args
marcprux Oct 21, 2025
2b3754a
Fix curl download file argument
marcprux Oct 21, 2025
54c7932
Use new Android endpoint to find SDK (https://github.com/swiftlang/sw…
marcprux Oct 22, 2025
b822798
Cleanup the FIXMEs
marcprux Oct 22, 2025
3e6345e
Use swiftlang main URL for install-and-build-with-sdk.sh
marcprux Oct 22, 2025
e3e913f
Test one more common location for the swiftpm folder
marcprux Oct 22, 2025
54759e2
Move package manager detection into install_package so we don't bail …
marcprux Oct 22, 2025
e619ba2
Clear ANDROID_NDK_ROOT environment due to https://github.com/swiftlan…
marcprux Oct 22, 2025
ec33dc7
Make android_ndk_version and android_sdk_triple inputs matrix arrays
marcprux Oct 23, 2025
9f4bcb5
Restore base repository source for install-and-build-with-sdk.sh
marcprux Oct 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ jobs:
cd MyPackage
swift package init --type library
enable_wasm_sdk_build: true
# Android
android_sdk_pre_build_command: |
mkdir MyPackage
cd MyPackage
swift package init --type library
enable_android_sdk_build: true
# Windows
windows_build_command: |
mkdir MyPackage
Expand All @@ -58,6 +64,12 @@ jobs:
with:
# Skip Linux which doesn't currently support docker-less workflow
enable_linux_checks: false
# Android
android_sdk_pre_build_command: |
mkdir MyPackage
cd MyPackage
swift package init --type library
enable_android_sdk_build: true
# Windows
windows_build_command: |
mkdir MyPackage
Expand Down
161 changes: 151 additions & 10 deletions .github/workflows/scripts/install-and-build-with-sdk.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ error() { printf -- "** ERROR: %s\n" "$*" >&2; }
fatal() { error "$@"; exit 1; }

# Parse command line options
INSTALL_ANDROID=false
INSTALL_STATIC_LINUX=false
INSTALL_WASM=false
BUILD_EMBEDDED_WASM=false
Expand All @@ -27,6 +28,18 @@ SWIFT_BUILD_COMMAND="swift build"

while [[ $# -gt 0 ]]; do
case $1 in
--android)
INSTALL_ANDROID=true
shift
;;
--android-ndk-version=*)
ANDROID_NDK_VERSION="${1#*=}"
shift
;;
--android-sdk-triple=*)
ANDROID_SDK_TRIPLE="${1#*=}"
shift
;;
--static)
INSTALL_STATIC_LINUX=true
shift
Expand Down Expand Up @@ -64,14 +77,15 @@ done

# Validate arguments
if [[ -z "$SWIFT_VERSION_INPUT" ]]; then
fatal "Usage: $0 [--static] [--wasm] [--flags=\"<build-flags>\"] [--build-command=\"<build-command>\"] <swift-version>"
fatal "Usage: $0 [--android] [--static] [--wasm] [--flags=\"<build-flags>\"] [--build-command=\"<build-command>\"] <swift-version>"
fi

if [[ "$INSTALL_STATIC_LINUX" == false && "$INSTALL_WASM" == false ]]; then
fatal "At least one of --static or --wasm must be specified"
if [[ "$INSTALL_ANDROID" == false && "$INSTALL_STATIC_LINUX" == false && "$INSTALL_WASM" == false ]]; then
fatal "At least one of --android or --static or --wasm must be specified"
fi

log "Requested Swift version: $SWIFT_VERSION_INPUT"
log "Install Android Swift SDK: $INSTALL_ANDROID"
log "Install Static Linux Swift SDK: $INSTALL_STATIC_LINUX"
log "Install Wasm Swift SDK: $INSTALL_WASM"
if [[ -n "$SWIFT_BUILD_FLAGS" ]]; then
Expand Down Expand Up @@ -103,7 +117,7 @@ SWIFT_API_INSTALL_ROOT="https://www.swift.org/api/v1/install"
# and gets the checksum for the patch version's Static Linux and/or Wasm Swift SDK.
#
# $1 (string): A minor Swift version, e.g. "6.1"
# Output: A string of the form "<patch-version>|<static-checksum>|<wasm-checksum>
# Output: A string of the form "<patch-version>|<android-checksum>|<static-checksum>|<wasm-checksum>
find_latest_swift_version() {
local minor_version="$1"

Expand All @@ -128,6 +142,23 @@ find_latest_swift_version() {

log "Found latest patch version: $latest_version"

local android_sdk_checksum=""
if [[ "$INSTALL_ANDROID" == true ]]; then
android_sdk_checksum=$(echo "$releases_json" | jq -r --arg version "$latest_version" '
.[]
| select(.name == $version)
| .platforms[]
| select(.platform == "android")
| .checksum
')

if [[ -z "$android_sdk_checksum" ]]; then
fatal "No Android Swift SDK checksum found for Swift $latest_version"
fi

log "Found Android Swift SDK checksum: ${android_sdk_checksum:0:12}..."
fi

local static_linux_sdk_checksum=""
if [[ "$INSTALL_STATIC_LINUX" == true ]]; then
static_linux_sdk_checksum=$(echo "$releases_json" | jq -r --arg version "$latest_version" '
Expand Down Expand Up @@ -162,14 +193,15 @@ find_latest_swift_version() {
log "Found Swift SDK for Wasm checksum: ${wasm_sdk_checksum:0:12}..."
fi

echo "${latest_version}|${static_linux_sdk_checksum}|${wasm_sdk_checksum}"
echo "${latest_version}|${android_sdk_checksum}|${static_linux_sdk_checksum}|${wasm_sdk_checksum}"
}

# Finds the latest Static Linux or Wasm Swift SDK development snapshot
# for the inputted Swift version and its checksum.
# Finds the latest Android or Static Linux or Wasm
# Swift SDK development snapshot for the inputted
# Swift version and its checksum.
#
# $1 (string): Nightly Swift version, e.g. "6.2" or "main"
# $2 (string): "static" or "wasm"
# $2 (string): "android" or "static" or "wasm"
# Output: A string of the form "<snapshot>|<sdk-checksum>",
# e.g. "swift-6.2-DEVELOPMENT-SNAPSHOT-2025-07-29-a|<sdk-checksum>"
find_latest_sdk_snapshot() {
Expand Down Expand Up @@ -206,6 +238,8 @@ find_latest_sdk_snapshot() {
}

SWIFT_VERSION_BRANCH=""
ANDROID_SDK_TAG=""
ANDROID_SDK_CHECKSUM=""
STATIC_LINUX_SDK_TAG=""
STATIC_LINUX_SDK_CHECKSUM=""
WASM_SDK_TAG=""
Expand All @@ -220,6 +254,13 @@ if [[ "$SWIFT_VERSION_INPUT" == nightly-* ]]; then
SWIFT_VERSION_BRANCH="swift-${version}-branch"
fi

if [[ "$INSTALL_ANDROID" == true ]]; then
android_sdk_info=$(find_latest_sdk_snapshot "$version" "android")

ANDROID_SDK_TAG=$(echo "$android_sdk_info" | cut -d'|' -f1)
ANDROID_SDK_CHECKSUM=$(echo "$android_sdk_info" | cut -d'|' -f2)
fi

if [[ "$INSTALL_STATIC_LINUX" == true ]]; then
static_linux_sdk_info=$(find_latest_sdk_snapshot "$version" "static")

Expand All @@ -239,14 +280,21 @@ else
latest_version=$(echo "$latest_version_info" | cut -d'|' -f1)
SWIFT_VERSION_BRANCH="swift-${latest_version}-release"

ANDROID_SDK_TAG="swift-${latest_version}-RELEASE"
ANDROID_SDK_CHECKSUM=$(echo "$latest_version_info" | cut -d'|' -f2)

STATIC_LINUX_SDK_TAG="swift-${latest_version}-RELEASE"
STATIC_LINUX_SDK_CHECKSUM=$(echo "$latest_version_info" | cut -d'|' -f2)
STATIC_LINUX_SDK_CHECKSUM=$(echo "$latest_version_info" | cut -d'|' -f3)

WASM_SDK_TAG="swift-${latest_version}-RELEASE"
WASM_SDK_CHECKSUM=$(echo "$latest_version_info" | cut -d'|' -f3)
WASM_SDK_CHECKSUM=$(echo "$latest_version_info" | cut -d'|' -f4)
fi

# Validate that required Swift SDK tags are set
if [[ "$INSTALL_ANDROID" == true && -z "$ANDROID_SDK_TAG" ]]; then
fatal "ANDROID_SDK_TAG is not set but Android Swift SDK installation was requested"
fi

if [[ "$INSTALL_STATIC_LINUX" == true && -z "$STATIC_LINUX_SDK_TAG" ]]; then
fatal "STATIC_LINUX_SDK_TAG is not set but Static Linux Swift SDK installation was requested"
fi
Expand Down Expand Up @@ -439,9 +487,25 @@ download_and_extract_toolchain() {
}

INSTALLED_SWIFT_TAG=$(get_installed_swift_tag)
SWIFT_EXECUTABLE_FOR_ANDROID_SDK=""
SWIFT_EXECUTABLE_FOR_STATIC_LINUX_SDK=""
SWIFT_EXECUTABLE_FOR_WASM_SDK=""

if [[ "$INSTALL_ANDROID" == true ]]; then
if [[ "$INSTALLED_SWIFT_TAG" == "$ANDROID_SDK_TAG" ]]; then
log "Current toolchain matches Android Swift SDK snapshot: $ANDROID_SDK_TAG"
SWIFT_EXECUTABLE_FOR_ANDROID_SDK="swift"
else
log "Installing Swift toolchain to match Android Swift SDK snapshot: $ANDROID_SDK_TAG"
initialize_os_info
SWIFT_EXECUTABLE_FOR_ANDROID_SDK=$(download_and_extract_toolchain "$ANDROID_SDK_TAG")
if [[ $? -eq $EXIT_TOOLCHAIN_NOT_FOUND ]]; then
# Don't fail the workflow if we can't find the right toolchain
exit 0
fi
fi
fi

if [[ "$INSTALL_STATIC_LINUX" == true ]]; then
if [[ "$INSTALLED_SWIFT_TAG" == "$STATIC_LINUX_SDK_TAG" ]]; then
log "Current toolchain matches Static Linux Swift SDK snapshot: $STATIC_LINUX_SDK_TAG"
Expand Down Expand Up @@ -472,9 +536,59 @@ if [[ "$INSTALL_WASM" == true ]]; then
fi
fi

ANDROID_SDK_DOWNLOAD_ROOT="${SWIFT_DOWNLOAD_ROOT}/${SWIFT_VERSION_BRANCH}/android-sdk"
STATIC_LINUX_SDK_DOWNLOAD_ROOT="${SWIFT_DOWNLOAD_ROOT}/${SWIFT_VERSION_BRANCH}/static-sdk"
WASM_SDK_DOWNLOAD_ROOT="${SWIFT_DOWNLOAD_ROOT}/${SWIFT_VERSION_BRANCH}/wasm-sdk"

install_android_sdk() {
# Check if the Android Swift SDK is already installed
if "$SWIFT_EXECUTABLE_FOR_ANDROID_SDK" sdk list 2>/dev/null | grep -q "^${ANDROID_SDK_TAG}_android"; then
log "✅ Android Swift SDK ${ANDROID_SDK_TAG} is already installed, skipping installation"
return 0
fi

log "Installing Android Swift SDK: $ANDROID_SDK_TAG"

# FIXME: we will be removing the "-0.1" suffix
local android_sdk_suffix="-0.1"

local android_sdk_name="${ANDROID_SDK_TAG}_android${android_sdk_suffix}"
local android_sdk_bundle_name="${android_sdk_name}.artifactbundle"
# FIXME: next SDK will remove the "_" from the name
local android_sdk_bundle_dir="${android_sdk_bundle_name//_android/-android}"
local android_sdk_filename="${android_sdk_bundle_name}.tar.gz"
local sdk_url="${ANDROID_SDK_DOWNLOAD_ROOT}/${ANDROID_SDK_TAG}/${android_sdk_filename}"

log "Running: ${SWIFT_EXECUTABLE_FOR_ANDROID_SDK} sdk install ${sdk_url} --checksum ${ANDROID_SDK_CHECKSUM}"

if "$SWIFT_EXECUTABLE_FOR_ANDROID_SDK" sdk install "$sdk_url" --checksum "$ANDROID_SDK_CHECKSUM"; then
log "✅ Android Swift SDK installed successfully"
else
fatal "Failed to install Android Swift SDK"
fi

# now setup the link to the local ANDROID_NDK_HOME
swift sdk configure --show-configuration "$(swift sdk list | grep android | tail -n 1)"

# guess some common places where the swift-sdks file lives
cd ~/Library/org.swift.swiftpm || cd ~/.local/swiftpm || cd ~/.swiftpm || cd /root/.swiftpm

# Download and install the Android NDK.
# Note that we could use the system package manager, but it is
# named different things for different distributions
# (e.g., "google-android-ndk-r26-installer" on Debian)
if [[ ! -d "${ANDROID_NDK_HOME:-}" ]]; then
# permit the "--android-ndk" flag to override the default
local android_ndk_version="${ANDROID_NDK_VERSION:-r27d}"
curl -fsSL -o "android-ndk-${android_ndk_version}.zip" --retry 3 https://dl.google.com/android/repository/android-ndk-"${android_ndk_version}"-"$(uname -s)".zip
unzip -q "android-ndk-${android_ndk_version}.zip"
export ANDROID_NDK_HOME="${PWD}"/android-ndk-"${android_ndk_version}"
fi

./swift-sdks/"${android_sdk_bundle_dir}"/swift-android/scripts/setup-android-sdk.sh
cd -
}

install_static_linux_sdk() {
# Check if the Static Linux Swift SDK is already installed
if "$SWIFT_EXECUTABLE_FOR_STATIC_LINUX_SDK" sdk list 2>/dev/null | grep -q "^${STATIC_LINUX_SDK_TAG}_static-linux-0.0.1"; then
Expand Down Expand Up @@ -518,6 +632,11 @@ install_wasm_sdk() {
}

install_sdks() {
if [[ "$INSTALL_ANDROID" == true ]]; then
log "Starting install of Swift ${SWIFT_VERSION_INPUT} Android Swift SDK"
install_android_sdk
fi

if [[ "$INSTALL_STATIC_LINUX" == true ]]; then
log "Starting install of Swift ${SWIFT_VERSION_INPUT} Static Linux Swift SDK"
install_static_linux_sdk
Expand All @@ -533,6 +652,28 @@ build() {
# Enable alias expansion to use a 'swift' alias for the executable path
shopt -s expand_aliases

if [[ "$INSTALL_ANDROID" == true ]]; then
log "Running Swift build with Android Swift SDK"

# FIXME: we will be trimming "-0.1" from the name in the next nightly
local sdk_name="${ANDROID_SDK_TAG}-android-0.1"
#local sdk_name="${ANDROID_SDK_TAG}_android"

alias swift='$SWIFT_EXECUTABLE_FOR_ANDROID_SDK'
local build_command="$SWIFT_BUILD_COMMAND --swift-sdk ${ANDROID_SDK_TRIPLE:-$sdk_name}"
if [[ -n "$SWIFT_BUILD_FLAGS" ]]; then
build_command="$build_command $SWIFT_BUILD_FLAGS"
fi

log "Running: $build_command"

if eval "$build_command"; then
log "✅ Swift build with Android Swift SDK completed successfully"
else
fatal "Swift build with Android Swift SDK failed"
fi
fi

if [[ "$INSTALL_STATIC_LINUX" == true ]]; then
log "Running Swift build with Static Linux Swift SDK"

Expand Down
Loading
Loading