Skip to content

Add some CI fixes #2273

Add some CI fixes

Add some CI fixes #2273

Workflow file for this run

name: SDKs
on:
pull_request:
schedule:
- cron: '0 9 * * *'
jobs:
bundle-tests:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
version: [release, devel, trunk]
os: [ubuntu-24.04, macos-13]
env:
ANDROID_API_LEVEL: 24
BUNDLE_VERSION: 0.1
NDK_VERSION: 27c
steps:
- name: Check for latest Swift ${{ matrix.version }} toolchain
id: version
run: |
if [ ${{ matrix.version }} = 'release' ]; then
LATEST_TOOLCHAIN_VERSION=$(curl -sL https://github.com/apple/swift/releases | grep -m1 swift-6.0 | cut -d- -f2)
SWIFT_TAG="swift-${LATEST_TOOLCHAIN_VERSION}-RELEASE"
elif [ ${{ matrix.version }} = 'devel' ]; then
LATEST_TOOLCHAIN_VERSION=$(curl -sL https://github.com/apple/swift/tags | grep -m1 swift-6.1-DEV | cut -d- -f8-10)
SWIFT_TAG="swift-6.1-DEVELOPMENT-SNAPSHOT-${LATEST_TOOLCHAIN_VERSION}-a"
else
LATEST_TOOLCHAIN_VERSION=$(curl -sL https://github.com/apple/swift/tags | grep -m1 swift-DEV | cut -d- -f7-9)
SWIFT_TAG="swift-DEVELOPMENT-SNAPSHOT-${LATEST_TOOLCHAIN_VERSION}-a"
fi
echo "tag=$SWIFT_TAG" >> $GITHUB_OUTPUT
- name: Get cached SDK bundle
id: cache-bundle
uses: actions/cache@v4
with:
path: ~/${{ steps.version.outputs.tag }}-android-${{ env.ANDROID_API_LEVEL }}-${{ env.BUNDLE_VERSION }}.artifactbundle.tar.gz
key: ${{ steps.version.outputs.tag }}-ndk-${{ env.NDK_VERSION }}-patch-bundle
fail-on-cache-miss: ${{ startsWith(matrix.os, 'macos') && 'true' || 'false' }}
- name: Get cached ${{ matrix.os }} ${{ steps.version.outputs.tag }} toolchain
id: cache-toolchain
uses: actions/cache@v4
with:
path: ~/${{ steps.version.outputs.tag }}-${{ startsWith(matrix.os, 'macos') && 'osx.pkg' || 'ubuntu24.04.tar.gz' }}
key: swift-${{ matrix.os }}-${{ steps.version.outputs.tag }}-toolchain
- name: Download toolchain
if: ${{ steps.cache-toolchain.outputs.cache-hit != 'true' }}
env:
SWIFT_TAG: ${{ steps.version.outputs.tag }}
run: |
if [ ${{ matrix.version }} != 'trunk' ]; then
SWIFT_BRANCH="swift-$(echo $SWIFT_TAG | cut -d- -f2)-${{ matrix.version == 'release' && 'release' || 'branch' }}"
else
SWIFT_BRANCH="development"
fi
cd
if ${{ steps.cache-toolchain.outputs.cache-hit != 'true' }}; then
wget -q https://download.swift.org/$SWIFT_BRANCH/${{ startsWith(matrix.os, 'macos') && 'xcode' || 'ubuntu2404' }}/$SWIFT_TAG/$SWIFT_TAG-${{ startsWith(matrix.os, 'macos') && 'osx.pkg' || 'ubuntu24.04.tar.gz' }}
echo "downloaded latest ${{ matrix.os }} toolchain: ${SWIFT_TAG}"
fi
- name: Extract toolchain and set it up
env:
SWIFT_TAG: ${{ steps.version.outputs.tag }}
run: |
if ${{ startsWith(matrix.os, 'macos') }}; then
mkdir ${SWIFT_TAG}
pushd ${SWIFT_TAG}
xar -x -C . -f ~/${SWIFT_TAG}-osx.pkg
tar xz -C . -f ${SWIFT_TAG}-osx-package.pkg/Payload
TOOLCHAIN=${PWD}/usr
popd
elif ${{ startsWith(matrix.os, 'ubuntu') }}; then
tar xf ~/$SWIFT_TAG-ubuntu24.04.tar.gz
TOOLCHAIN=${PWD}/$SWIFT_TAG-ubuntu24.04/usr
fi
echo "TOOLCHAIN=${TOOLCHAIN}" >> $GITHUB_ENV
${TOOLCHAIN}/bin/swift --version
- name: Get cached Android NDK
id: ndk
uses: actions/cache@v4
if: ${{ steps.cache-bundle.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') }}
with:
path: ~/android-ndk-r${{ env.NDK_VERSION }}-linux.zip
key: android-ndk-${{ env.NDK_VERSION }}-full
lookup-only: true
- name: Download Android NDK if not cached before
if: ${{ steps.cache-bundle.outputs.cache-hit != 'true' && steps.ndk.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') }}
run: |
wget -q https://dl.google.com/android/repository/android-ndk-r$NDK_VERSION-linux.zip
if [ "$(sha1sum android-ndk-r$NDK_VERSION-linux.zip | cut -f1 -d" ")" != '090e8083a715fdb1a3e402d0763c388abb03fb4e' ]; then
echo "NDK checksum didn't match"
exit 1
fi
mv android-ndk-r$NDK_VERSION-linux.zip ~
- name: Get cached Android NDK sysroot and runtime libraries
id: cache-ndk
uses: actions/cache@v4
if: ${{ (steps.cache-bundle.outputs.cache-hit != 'true') && startsWith(matrix.os, 'ubuntu') }}
with:
path: ~/android-sysroot.tar.xz
key: android-ndk-${{ env.NDK_VERSION }}
- name: Extract Android NDK sysroot if not cached before
if: ${{ steps.cache-bundle.outputs.cache-hit != 'true' && steps.cache-ndk.outputs.cache-hit != 'true' && startsWith(matrix.os, 'ubuntu') }}
run: |
unzip -q ~/android-ndk-r$NDK_VERSION-linux.zip
mv android-ndk-r$NDK_VERSION/toolchains/llvm/prebuilt/linux-x86_64/sysroot .
rm -r sysroot/usr/{include,lib}/{i686,riscv64}-linux-android
mv android-ndk-r$NDK_VERSION/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/*/lib/linux sysroot
rm -r sysroot/linux/*{i[36]86,riscv64}*
tar cJf ~/android-sysroot.tar.xz sysroot
- name: Clone
uses: actions/checkout@v4
with:
path: sdk-config
- name: Build Swift ${{ matrix.version }} Android SDK if not the latest
# build-script currently only works on ubuntu
if: ${{ (steps.cache-bundle.outputs.cache-hit != 'true') && startsWith(matrix.os, 'ubuntu') }}
env:
SWIFT_TAG: ${{ steps.version.outputs.tag }}
run: |
set -x
if ${{ startsWith(matrix.os, 'macos') }}; then
brew install ninja patchelf
elif ${{ startsWith(matrix.os, 'ubuntu') }}; then
sudo apt install ninja-build
fi
cd sdk-config
for arch in aarch64 x86_64 armv7; do
ANDROID_ARCH=$arch BUILD_SWIFT_PM=1 ${TOOLCHAIN}/bin/swift get-packages-and-swift-source.swift
done
git apply swift-android.patch swift-android-ci.patch swift-crypto.patch swift-system.patch
if [ ${{ matrix.version }} = 'release' ]; then
git apply swift-android-ci-release.patch swift-android-foundation-release.patch
else
if [ ${{ matrix.version }} = 'devel' ]; then
git apply swift-android-foundation-devel.patch
fi
git apply swift-android-ci-except-release.patch swift-android-foundation-except-release.patch
fi
perl -pi -e 's%r26%ndk/27%' swift/stdlib/cmake/modules/AddSwiftStdlib.cmake
perl -pi -e 's%String\(cString: getpass%\"fake\" //%' swiftpm/Sources/PackageRegistryCommand/PackageRegistryCommand+Auth.swift
VERSION="$(echo ${{ steps.version.outputs.tag }} | cut -f1,2 -d-)-${{ matrix.version }}"
# e.g. swift-6.0.1-release-android-24-sdk
SDK_DIR=$VERSION-android-${ANDROID_API_LEVEL}-sdk
ROOT=android-${NDK_VERSION}-sysroot
SYSROOT=$SDK_DIR/$ROOT
mkdir ${SDK_DIR}
tar xf ~/android-sysroot.tar.xz
mv sysroot $SYSROOT
for arch in aarch64 x86_64 armv7; do
SDK_NAME=$(ls | grep swift-${{ matrix.version }}-android-$arch)
SDK=`pwd`/$SDK_NAME
perl -pi -e "s%/data/data/com.termux/files%$SDK%g" $SDK/usr/lib/pkgconfig/sqlite3.pc
./swift/utils/build-script -RA --skip-build-cmark --build-llvm=0 --android --android-ndk $ANDROID_NDK_LATEST_HOME --android-arch $arch --android-api-level $ANDROID_API_LEVEL --build-swift-tools=0 --native-swift-tools-path=${TOOLCHAIN}/bin --native-clang-tools-path=${TOOLCHAIN}/bin --cross-compile-hosts=android-$arch --cross-compile-deps-path=$SDK --skip-local-build --build-swift-static-stdlib --xctest --skip-early-swift-driver --install-swift --install-libdispatch --install-foundation --install-xctest --install-destdir=$SDK --swift-install-components='compiler;clang-resource-dir-symlink;license;stdlib;sdk-overlay' --cross-compile-append-host-target-to-destdir=False -b -p --install-llbuild --sourcekit-lsp --skip-early-swiftsyntax
pushd ${SDK_NAME}/usr
patchelf --set-rpath \$ORIGIN lib/swift/android/lib[dFXs]*.so
# Remove executables and unused toolchain headers/libraries
rm -r bin lib/libsqlite3.so lib/lib{curses,ncurses}.so lib/terminfo share/{tabset,terminfo}
if [ ${{ matrix.version }} = 'release' ]; then
rm -r lib/swift/pm
fi
mv include/curl include/libxml2 include/spawn.h .
rm -r include/*
mv curl libxml2 spawn.h include/
cp -r ../../swift/lib/ClangImporter/SwiftBridging/{module.modulemap,swift} include/
TRIPLE="$arch-linux-android"
if [[ $arch == 'armv7' ]]; then
TRIPLE="arm-linux-androideabi"
fi
mkdir lib/${TRIPLE}
mv lib/lib[a-z]*.so lib/pkgconfig lib/swift/android/lib*.{a,so} lib/${TRIPLE}
mv lib/swift_static lib/swift_static-$arch
mv lib/libandroid-spawn.a lib/swift_static-$arch/android
rm lib/swift{,_static-$arch}/clang
popd
# copy all the processed SDK files into the Android sysroot
rsync -ar ${SDK_NAME}/ $SYSROOT
done
# Copy necessary headers and libraries from the toolchain and NDK clang resource directories
mkdir -p $SYSROOT/usr/lib/swift/clang/lib
cp -r $TOOLCHAIN/lib/clang/*/include $SYSROOT/usr/lib/swift/clang
mv $SYSROOT/linux $SYSROOT/usr/lib/swift/clang/lib
ln -s ../swift/clang $SYSROOT/usr/lib/swift_static-aarch64/clang
ln -s ../swift/clang $SYSROOT/usr/lib/swift_static-armv7/clang
ln -s ../swift/clang $SYSROOT/usr/lib/swift_static-x86_64/clang
# Patch a single libc++ header to work around a Swift compiler bug
cd $SYSROOT
git apply ../../libc++-stdlib.h.patch
cd ../..
BUNDLE=${{ steps.version.outputs.tag }}-android-${ANDROID_API_LEVEL}-${BUNDLE_VERSION}
BUNDLE_DIR=$BUNDLE.artifactbundle
mkdir ${BUNDLE_DIR}
mv ${SDK_DIR} ${BUNDLE_DIR}
cat > $BUNDLE_DIR/info.json << EOF
{
"schemaVersion": "1.0",
"artifacts": {
"${BUNDLE}": {
"variants": [ { "path": "${SDK_DIR}" } ],
"version": "${BUNDLE_VERSION}",
"type": "swiftSDK"
}
}
}
EOF
cat > $BUNDLE_DIR/$SDK_DIR/swift-sdk.json << EOF
{
"schemaVersion": "4.0",
"targetTriples": {
"aarch64-unknown-linux-android${ANDROID_API_LEVEL}": {
"sdkRootPath": "${ROOT}",
"swiftResourcesPath": "${ROOT}/usr/lib/swift",
"swiftStaticResourcesPath": "${ROOT}/usr/lib/swift_static-aarch64"
},
"x86_64-unknown-linux-android${ANDROID_API_LEVEL}": {
"sdkRootPath": "${ROOT}",
"swiftResourcesPath": "${ROOT}/usr/lib/swift",
"swiftStaticResourcesPath": "${ROOT}/usr/lib/swift_static-x86_64"
},
"armv7-unknown-linux-androideabi${ANDROID_API_LEVEL}": {
"sdkRootPath": "${ROOT}",
"swiftResourcesPath": "${ROOT}/usr/lib/swift",
"swiftStaticResourcesPath": "${ROOT}/usr/lib/swift_static-armv7"
}
}
}
EOF
cat > $BUNDLE_DIR/$SYSROOT/SDKSettings.json << EOF
{
"DisplayName": "Android NDK ${NDK_VERSION} sysroot with ${VERSION} runtime libraries for API ${ANDROID_API_LEVEL}",
"Version": "27.2.12479018",
"VersionMap": {},
"CanonicalName": "${VERSION}-android${ANDROID_API_LEVEL}"
}
EOF
# output visualization of the SDK bundle file tree
tree $BUNDLE_DIR
du -skh "${BUNDLE_DIR}"
tar czf ~/${BUNDLE_DIR}.tar.gz "${BUNDLE_DIR}"
du -skh ~/${BUNDLE_DIR}.tar.gz
shasum -a 256 ~/${BUNDLE_DIR}.tar.gz
rm -rf build/ $SDK_NAME $BUNDLE_DIR llvm-project/
- name: Upload SDK bundle
if: ${{ startsWith(matrix.os, 'ubuntu') }}
uses: actions/upload-artifact@v4
with:
name: ${{ steps.version.outputs.tag }}-android-${{ env.ANDROID_API_LEVEL }}-${{ env.BUNDLE_VERSION }}.artifactbundle.tar.gz
path: ~/${{ steps.version.outputs.tag }}-android-${{ env.ANDROID_API_LEVEL }}-${{ env.BUNDLE_VERSION }}.artifactbundle.tar.gz
compression-level: 0
- name: Install ${{ matrix.version }} Android SDK bundle and set SwiftPM flags
run: |
${TOOLCHAIN}/bin/swift sdk install ~/${{ steps.version.outputs.tag }}-android-*.artifactbundle.tar.gz
${TOOLCHAIN}/bin/swift sdk configure --show-configuration ${{ steps.version.outputs.tag }}-android-${ANDROID_API_LEVEL}-${BUNDLE_VERSION} armv7-unknown-linux-androideabi${ANDROID_API_LEVEL}
if ${{ matrix.version != 'release' }}; then
FLAGS="-Xswiftc -disallow-use-new-driver"
if [ ${{ matrix.version }} != 'devel' ]; then
ln -s swiftc-legacy-driver ${TOOLCHAIN}/bin/swiftc-legacy-driver.
ln -s swift-legacy-driver ${TOOLCHAIN}/bin/swift-legacy-driver.
fi
else
FLAGS="-Xswiftc -Xclang-linker -Xswiftc -fuse-ld=lld"
fi
SFLAGS="--swift-sdk aarch64-unknown-linux-android${ANDROID_API_LEVEL} ${FLAGS}"
echo "SWIFTPM_AARCH_FLAGS=${SFLAGS}" >> $GITHUB_ENV
XFLAGS="--swift-sdk x86_64-unknown-linux-android${ANDROID_API_LEVEL} ${FLAGS}"
echo "SWIFTPM_X_FLAGS=${XFLAGS}" >> $GITHUB_ENV
AFLAGS="--swift-sdk armv7-unknown-linux-androideabi${ANDROID_API_LEVEL} ${FLAGS}"
echo "SWIFTPM_ARM_FLAGS=${AFLAGS}" >> $GITHUB_ENV
- name: Get Swift Argument Parser package
uses: actions/checkout@v4
with:
repository: apple/swift-argument-parser
path: swift-argument-parser
- name: Build Swift Argument Parser package
run: |
cd swift-argument-parser
rm Examples/count-lines/CountLines.swift Tools/changelog-authors/*.swift
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_ARM_FLAGS}
- name: Get Swift crypto package
uses: actions/checkout@v4
with:
repository: apple/swift-crypto
path: swift-crypto
- name: Build Swift crypto package
run: |
cd swift-crypto
perl -pi -e 's%\\\\(testsDirectory)/.*Vectors%/data/local/tmp/pack/crypto-vectors%' Tests/{Crypto,_CryptoExtras}Tests/Utils/{RFCVector,Wycheproof}.swift
perl -pi -e 's%#file%"/data/local/tmp/pack/crypto-vectors"%;s%../_CryptoExtrasVectors/%%' Tests/_CryptoExtrasTests/TestRSABlindSigning.swift
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_ARM_FLAGS}
- name: Get Swift NIO package
uses: actions/checkout@v4
with:
repository: apple/swift-nio
path: swift-nio
- name: Build Swift NIO package
run: |
cd swift-nio
git apply ../sdk-config/swift-nio-disable-ecn-tests.patch ../sdk-config/swift-nio-filesystem.patch
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_ARM_FLAGS}
- name: Get Swift Numerics package
uses: actions/checkout@v4
with:
repository: apple/swift-numerics
path: swift-numerics
- name: Build Swift Numerics package
run: |
cd swift-numerics
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_ARM_FLAGS}
- name: Get Swift System package
uses: actions/checkout@v4
with:
repository: apple/swift-system
path: swift-system
- name: Build Swift System package
run: |
git apply sdk-config/swift-system-tests.patch
cd swift-system
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_ARM_FLAGS}
- name: Get Swift Collections package
uses: actions/checkout@v4
with:
repository: apple/swift-collections
path: swift-collections
- name: Build Swift Collections package
run: |
cd swift-collections
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_ARM_FLAGS}
- name: Get Swift Atomics package
uses: actions/checkout@v4
with:
repository: apple/swift-atomics
path: swift-atomics
ref: 1.1.0
- name: Get Swift NIO SSH package
uses: actions/checkout@v4
with:
repository: apple/swift-nio-ssh
path: sns
- name: Build Swift NIO SSH package
run: |
cd sns
perl -pi -e 's%url: .*swift-([a-z]*)\.git.*$%path: \"../swift-\1\"),%g' Package.swift
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_ARM_FLAGS}
- name: Get Swift NIO SSL package
uses: actions/checkout@v4
with:
repository: apple/swift-nio-ssl
path: snl
- name: Build Swift NIO SSL package
run: |
cd snl
git apply ../sdk-config/swift-nio-ssl-test.patch
SWIFTCI_USE_LOCAL_DEPS=1 ${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
SWIFTCI_USE_LOCAL_DEPS=1 ${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
SWIFTCI_USE_LOCAL_DEPS=1 ${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_ARM_FLAGS}
- name: Get Yams package
uses: actions/checkout@v4
with:
repository: jpsim/Yams
path: yams
- name: Build Yams package
run: |
cd yams
perl -pi -e 's% fixturesDirectory + \"/SourceKitten#289% \"/data/local/tmp/pack%' Tests/YamsTests/PerformanceTests.swift
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_ARM_FLAGS}
- name: Get Swift NIO HTTP/2 package
uses: actions/checkout@v4
with:
repository: apple/swift-nio-http2
path: snh
- name: Build Swift NIO HTTP/2 package
run: |
cd snh
perl -pi -e 's%url: .*swift-([a-z]*)\.git.*$%path: \"../swift-\1\"),%g' Package.swift
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
- name: Get Swift Algorithms package
uses: actions/checkout@v4
with:
repository: apple/swift-algorithms
path: sa
- name: Build Swift Algorithms package
run: |
cd sa
perl -pi -e 's%url: .*$%path: \"../swift-numerics\"),%' Package.swift
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_AARCH_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_X_FLAGS}
${TOOLCHAIN}/bin/swift build --build-tests ${SWIFTPM_ARM_FLAGS}
- name: Get cached Termux debug app for NIO tests
id: cache-termux
uses: actions/cache@v4
with:
path: ~/termux-debug.apk
key: termux-app
- name: Get Termux debug app if not cached
if: ${{ steps.cache-termux.outputs.cache-hit != 'true' }}
run: wget -O ~/termux-debug.apk https://github.com/termux/termux-app/releases/download/v0.118.0/termux-app_v0.118.0+github-debug_x86_64.apk
- name: Prepare Android emulator test package
run: |
set -x
# create the test runner script
cat > ~/test-toolchain.sh << EOF
adb install ~/termux-debug.apk
adb push pack /data/local/tmp
adb shell "run-as com.termux mkdir /data/data/com.termux/pack"
adb shell "run-as com.termux cp /data/local/tmp/pack/{lib*.so,swift-nioPackageTests.xctest,FileHandleTests.swift} /data/data/com.termux/pack"
adb shell "run-as com.termux cp -r /data/local/tmp/pack/Test\ Data /data/data/com.termux/pack"
adb shell "run-as com.termux ln -s README.md /data/data/com.termux/pack/Test\ Data/README.md.symlink"
adb shell "run-as com.termux ln -s Foo /data/data/com.termux/pack/Test\ Data/Foo.symlink"
adb shell "run-as com.termux sh -c 'TMPDIR=/data/data/com.termux /data/data/com.termux/pack/swift-nioPackageTests.xctest'"
adb shell "TMPDIR=/data/local/tmp /data/local/tmp/pack/swift-systemPackageTests.xctest"
EOF
mkdir pack
TARGET="x86_64-unknown-linux-android$ANDROID_API_LEVEL"
cp swift-argument-parser/.build/$TARGET/debug/{generate-manual,math,repeat,roll,swift-argument-parserPackageTests.xctest} pack
echo 'adb shell /data/local/tmp/pack/swift-argument-parserPackageTests.xctest' >> ~/test-toolchain.sh
wget -q https://raw.githubusercontent.com/termux/termux-elf-cleaner/v2.1.1/elf-cleaner.cpp
wget -q https://raw.githubusercontent.com/termux/termux-elf-cleaner/v2.1.1/elf.h
wget -q https://raw.githubusercontent.com/termux/termux-elf-cleaner/v2.1.1/arghandling.h
wget -q https://raw.githubusercontent.com/termux/termux-elf-cleaner/v2.1.1/arghandling.c
clang -c arghandling.c
clang -o elf-cleaner arghandling.o elf-cleaner.cpp -DCOPYRIGHT=\"foo\" -DPACKAGE_NAME=\"termux-elf-cleaner\" -DPACKAGE_VERSION=\"2.2.1\"
./elf-cleaner --api-level $ANDROID_API_LEVEL pack/{generate-manual,math,repeat,roll} || true
cp swift-crypto/.build/$TARGET/debug/swift-cryptoPackageTests.xctest pack
echo 'adb shell /data/local/tmp/pack/swift-cryptoPackageTests.xctest' >> ~/test-toolchain.sh
cp swift-nio/.build/$TARGET/debug/swift-nioPackageTests.xctest pack
cp swift-numerics/.build/$TARGET/debug/swift-numericsPackageTests.xctest pack
echo 'adb shell /data/local/tmp/pack/swift-numericsPackageTests.xctest' >> ~/test-toolchain.sh
cp swift-system/.build/$TARGET/debug/swift-systemPackageTests.xctest pack
cp swift-collections/.build/$TARGET/debug/swift-collectionsPackageTests.xctest pack
echo 'adb shell /data/local/tmp/pack/swift-collectionsPackageTests.xctest' >> ~/test-toolchain.sh
cp sns/.build/$TARGET/debug/swift-nio-sshPackageTests.xctest pack
echo 'adb shell /data/local/tmp/pack/swift-nio-sshPackageTests.xctest' >> ~/test-toolchain.sh
cp snl/.build/$TARGET/debug/swift-nio-sslPackageTests.xctest pack
echo 'adb shell /data/local/tmp/pack/swift-nio-sslPackageTests.xctest' >> ~/test-toolchain.sh
cp snh/.build/$TARGET/debug/swift-nio-http2PackageTests.xctest pack
echo 'adb shell /data/local/tmp/pack/swift-nio-http2PackageTests.xctest' >> ~/test-toolchain.sh
cp yams/.build/$TARGET/debug/YamsPackageTests.xctest pack
echo 'adb shell /data/local/tmp/pack/YamsPackageTests.xctest' >> ~/test-toolchain.sh
cp sa/.build/$TARGET/debug/swift-algorithmsPackageTests.xctest pack
echo 'adb shell /data/local/tmp/pack/swift-algorithmsPackageTests.xctest' >> ~/test-toolchain.sh
mkdir pack/crypto-vectors pack/swift-crypto_CryptoTests.resources
cp swift-crypto/Tests/Test\ Vectors/* swift-crypto/Tests/_CryptoExtrasVectors/* pack/crypto-vectors
cp swift-crypto/Tests/CryptoTests/HPKE/hpke-test-vectors.json pack/swift-crypto_CryptoTests.resources
rm swift-nio/Tests/NIOFileSystemIntegrationTests/Test\ Data/*symlink
cp -r swift-nio/Tests/NIOFileSystemIntegrationTests/Test\ Data/ swift-nio/Tests/NIOFileSystemIntegrationTests/FileHandleTests.swift pack
cp yams/Tests/YamsTests/Fixtures/SourceKitten#289/debug.yaml pack
cp ~/.${{ startsWith(matrix.os, 'ubuntu') && 'config/' || '' }}swiftpm/swift-sdks/${{ steps.version.outputs.tag }}-android-${ANDROID_API_LEVEL}-*.artifactbundle/swift*sdk/android*sysroot/usr/lib/x86_64-linux-android/lib*so pack
# need to free up some space or else the emulator fails to launch:
# ERROR | Not enough space to create userdata partition. Available: 6086.191406 MB at /home/runner/.android/avd/../avd/test.avd, need 7372.800000 MB.
rm -rf ${{ steps.version.outputs.tag }}-ubuntu24.04/ */.build
chmod +x ~/test-toolchain.sh
echo "TEST SCRIPT:"
cat ~/test-toolchain.sh
if ${{ startsWith(matrix.os, 'ubuntu') }}; then
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
fi
- name: Run tests on Android x86_64 emulator
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 29
arch: x86_64
script: ~/test-toolchain.sh