diff --git a/.github/docker/Dockerfile b/.github/docker/Dockerfile new file mode 100644 index 0000000..1b97e2f --- /dev/null +++ b/.github/docker/Dockerfile @@ -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 diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..49f08fb --- /dev/null +++ b/.github/workflows/docker.yml @@ -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 + '