From 71a777b856147e793ffe9e7d19e955d839239ae2 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Mon, 20 Jul 2026 00:50:08 -0400 Subject: [PATCH 1/2] Install the Swift toolchain directly from swift.org in CI --- .github/workflows/ci.yml | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9f73d1b..564ecc1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,10 +58,17 @@ jobs: - name: Install Android NDK run: sdkmanager --install "ndk;${NDK_VERSION}" + # swift-actions/setup-swift doesn't know 6.3.3 yet ("Version is not + # available"), so install the swift.org toolchain directly. - name: Install Swift toolchain - uses: swift-actions/setup-swift@v2 - with: - swift-version: ${{ env.SWIFT_VERSION }} + run: | + sudo apt-get update -qq + sudo apt-get install -y -qq binutils git gnupg2 libc6-dev libcurl4-openssl-dev \ + libedit2 libgcc-13-dev libpython3-dev libsqlite3-0 libstdc++-13-dev \ + libxml2-dev libz3-dev pkg-config tzdata unzip zlib1g-dev + curl -sL "https://download.swift.org/swift-${SWIFT_VERSION}-release/ubuntu2404/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-ubuntu24.04.tar.gz" | tar xz -C "$HOME" + echo "$HOME/swift-${SWIFT_VERSION}-RELEASE-ubuntu24.04/usr/bin" >> "$GITHUB_PATH" + "$HOME/swift-${SWIFT_VERSION}-RELEASE-ubuntu24.04/usr/bin/swift" --version - name: Install Android Swift SDK run: | @@ -75,6 +82,13 @@ jobs: working-directory: Android run: echo "sdk.dir=$ANDROID_SDK_ROOT" > local.properties + # jdk25Home's default is a macOS Homebrew path; any JDK 17+ works for + # swift-java's callbacks sub-build, so reuse the runner's JDK. swiftBin's + # default is the macOS toolchain path, so point it at the PATH-installed + # swift from the toolchain step above. - name: Build Android app working-directory: Android - run: ./gradlew :app:assembleDebug --no-daemon + run: | + ./gradlew :app:assembleDebug --no-daemon \ + -PswiftBin="$(command -v swift)" \ + -Pjdk25Home="$JAVA_HOME" From 9ff2e2bac1be60e0cb8ceb1f00edcb3dff212130 Mon Sep 17 00:00:00 2001 From: Alsey Coleman Miller Date: Mon, 20 Jul 2026 00:50:08 -0400 Subject: [PATCH 2/2] Support Linux hosts in the jextract Gradle build --- Android/fueling-jni/build.gradle.kts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Android/fueling-jni/build.gradle.kts b/Android/fueling-jni/build.gradle.kts index d8ef5dc..58ffcfa 100644 --- a/Android/fueling-jni/build.gradle.kts +++ b/Android/fueling-jni/build.gradle.kts @@ -24,6 +24,10 @@ val swiftPackageRoot: File = rootProject.projectDir val androidTriple = "aarch64-unknown-linux-android28" val swiftAbi = "arm64-v8a" val userHome: String = System.getProperty("user.home") +val hostIsMac: Boolean = System.getProperty("os.name").lowercase().contains("mac") +// NDK prebuilt-toolchain host tag (only x86_64 host prebuilts ship, even on +// arm64 macs — Rosetta/binfmt handle it). +val ndkHostTag: String = if (hostIsMac) "darwin-x86_64" else "linux-x86_64" // Configuration the Swift wrapper is cross-compiled with. This is independent of // the Android build type: an `assembleRelease` still gets a debug `.so` unless this @@ -39,7 +43,11 @@ val swiftToolchainVersion: String = (findProperty("swiftToolchainVersion") as St // toolchain (Apple's Xcode Swift produces incompatible `.swiftmodule`s). // Override with `-PswiftBin=/path/to/swift` if installed elsewhere. val swiftBin: String = (findProperty("swiftBin") as String?) - ?: "$userHome/Library/Developer/Toolchains/swift-$swiftToolchainVersion-RELEASE.xctoolchain/usr/bin/swift" + ?: if (hostIsMac) { + "$userHome/Library/Developer/Toolchains/swift-$swiftToolchainVersion-RELEASE.xctoolchain/usr/bin/swift" + } else { + "swift" // Linux: swift.org toolchains go on PATH, no Xcode to collide with + } // swift-java's `enableJavaCallbacks` feature (used for the `AndroidHTTPTransport` // JNI callback) runs its own internal Gradle sub-build during `swift build` to @@ -58,9 +66,11 @@ val jdk25Home: String = (findProperty("jdk25Home") as String?) val generatedJavaDir = File(swiftPackageRoot, ".build/plugins/outputs/android/FuelingAndroid/destination/JExtractSwiftPlugin/src/generated/java") val swiftKitCoreDir = File(swiftPackageRoot, ".build/checkouts/swift-java/SwiftKitCore/src/main/java") val swiftBuildDir = File(swiftPackageRoot, ".build/$androidTriple/$swiftBuildConfig") +// SwiftPM's swift-sdks directory differs per host OS. +val swiftSdksDir: String = if (hostIsMac) "$userHome/Library/org.swift.swiftpm/swift-sdks" else "$userHome/.swiftpm/swift-sdks" val swiftAndroidRuntimeDir = File( (findProperty("swiftAndroidRuntimeDir") as String?) - ?: "$userHome/Library/org.swift.swiftpm/swift-sdks/swift-${swiftToolchainVersion}-RELEASE_android.artifactbundle/swift-android/swift-resources/usr/lib/swift-aarch64/android" + ?: "$swiftSdksDir/swift-${swiftToolchainVersion}-RELEASE_android.artifactbundle/swift-android/swift-resources/usr/lib/swift-aarch64/android" ) // Supplies libc++_shared.so, which every Swift Android binary links against. CI @@ -127,7 +137,7 @@ val stageJniLibs = tasks.register("stageJniLibs") { "lib_FoundationICU.so" ) } - from(File(ndkRoot, "toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android")) { + from(File(ndkRoot, "toolchains/llvm/prebuilt/$ndkHostTag/sysroot/usr/lib/aarch64-linux-android")) { include("libc++_shared.so") } }