Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
32 changes: 32 additions & 0 deletions .github/docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Build image for cross-compiling the package with the official
# Swift SDK for Android.
FROM swift:6.3.2-noble

ARG SWIFT_SDK_URL=https://download.swift.org/swift-6.3.2-release/android-sdk/swift-6.3.2-RELEASE/swift-6.3.2-RELEASE_android.artifactbundle.tar.gz
ARG SWIFT_SDK_CHECKSUM=939e933549d12d28f2e0bf71019d734d309859e9773c572657ce565a81f85d68
ARG ANDROID_NDK_VERSION=r27d

ENV ANDROID_NDK_HOME=/usr/local/lib/android/sdk/ndk/${ANDROID_NDK_VERSION}

RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates curl unzip \
&& rm -rf /var/lib/apt/lists/*

# the Swift SDK links against the NDK sysroot, which it does not bundle
RUN mkdir -p "$(dirname "$ANDROID_NDK_HOME")" \
&& curl -fsSL -o /tmp/ndk.zip \
"https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux.zip" \
&& unzip -q /tmp/ndk.zip -d /tmp \
&& mv "/tmp/android-ndk-${ANDROID_NDK_VERSION}" "$ANDROID_NDK_HOME" \
&& rm /tmp/ndk.zip

RUN swift sdk install "$SWIFT_SDK_URL" --checksum "$SWIFT_SDK_CHECKSUM" \
&& swift sdk list

# the bundle ships a script that links the NDK sysroot, the clang resource
# directory and swiftrt.o into place, using ANDROID_NDK_HOME
RUN BUNDLE=$(dirname "$(find / -path '*swift-sdks*' -name 'swift-sdk.json' | head -1)") \
&& "$BUNDLE/scripts/setup-android-sdk.sh" \
&& test -f "$BUNDLE/ndk-sysroot/usr/include/jni.h"

WORKDIR /package
46 changes: 46 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Docker

on:
push:
branches: [master]
workflow_dispatch:
pull_request:

jobs:
android:
name: Android (Swift SDK ${{ matrix.swift }} / API ${{ matrix.android-api }} / ${{ matrix.arch }})
runs-on: ubuntu-24.04
timeout-minutes: 90
strategy:
fail-fast: false
matrix:
swift: ['6.3.2']
android-api: ['28', '29', '31', '33']
arch: ['aarch64', 'armv7', 'x86_64']
steps:
- uses: actions/checkout@v6

- name: "Build Docker image"
run: |
docker build \
--tag swift-android-sdk:${{ matrix.swift }} \
--file .github/docker/Dockerfile \
.github/docker

- name: "Build Swift Package for Android (${{ matrix.arch }})"
run: |
case "${{ matrix.arch }}" in
aarch64) TRIPLE="aarch64-unknown-linux-android${{ matrix.android-api }}" ;;
armv7) TRIPLE="armv7-unknown-linux-android${{ matrix.android-api }}" ;;
x86_64) TRIPLE="x86_64-unknown-linux-android${{ matrix.android-api }}" ;;
esac
docker run --rm \
--volume "$PWD:/package" \
--env ANDROID_SDK_VERSION=${{ matrix.android-api }} \
--env TRIPLE="$TRIPLE" \
swift-android-sdk:${{ matrix.swift }} \
bash -c '
set -eu
# the prebuilt swift-syntax bundle omits SwiftIfConfig, which swift-java needs
swift build --swift-sdk "$TRIPLE" --disable-experimental-prebuilts
'
Loading