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
22 changes: 18 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: |
Expand All @@ -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"
16 changes: 13 additions & 3 deletions Android/fueling-jni/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -127,7 +137,7 @@ val stageJniLibs = tasks.register<Copy>("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")
}
}
Expand Down
Loading