Skip to content

fix: use correct package name uniffi_bindgen #20

fix: use correct package name uniffi_bindgen

fix: use correct package name uniffi_bindgen #20

Workflow file for this run

name: Release
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
dry_run:
description: 'Dry run (skip release creation)'
required: false
default: 'false'
type: boolean
env:
CARGO_TERM_COLOR: always
jobs:
# Build iOS artifacts on macOS
build-ios:
name: Build iOS
runs-on: macos-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-ios,aarch64-apple-ios-sim,x86_64-apple-ios
- name: Cache Rust dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-ios-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-ios-cargo-
- name: Install uniffi-bindgen
run: |
if ! command -v uniffi-bindgen &> /dev/null; then
cargo install uniffi_bindgen --version "^0.28"
fi
- name: Build iOS targets
run: |
cargo build --release --target aarch64-apple-ios --features uniffi
cargo build --release --target aarch64-apple-ios-sim --features uniffi
cargo build --release --target x86_64-apple-ios --features uniffi
- name: Generate Swift bindings
run: |
mkdir -p target/ios/swift
uniffi-bindgen generate \
--library target/aarch64-apple-ios/release/libcooklang_import.a \
--language swift \
--out-dir target/ios/swift
- name: Create XCFramework
run: |
mkdir -p target/ios/ios-device target/ios/ios-simulator
# Copy device library
cp target/aarch64-apple-ios/release/libcooklang_import.a target/ios/ios-device/
# Create fat library for simulator
lipo -create \
target/aarch64-apple-ios-sim/release/libcooklang_import.a \
target/x86_64-apple-ios/release/libcooklang_import.a \
-output target/ios/ios-simulator/libcooklang_import.a
# Create headers
mkdir -p target/ios/ios-device/Headers target/ios/ios-simulator/Headers
cp target/ios/swift/cooklang_importFFI.h target/ios/ios-device/Headers/
cp target/ios/swift/cooklang_importFFI.h target/ios/ios-simulator/Headers/
# Create module maps
mkdir -p target/ios/ios-device/Modules target/ios/ios-simulator/Modules
echo 'module CooklangImportFFI { header "cooklang_importFFI.h" export * }' > target/ios/ios-device/Modules/module.modulemap
echo 'module CooklangImportFFI { header "cooklang_importFFI.h" export * }' > target/ios/ios-simulator/Modules/module.modulemap
# Create XCFramework
xcodebuild -create-xcframework \
-library target/ios/ios-device/libcooklang_import.a \
-headers target/ios/ios-device/Headers \
-library target/ios/ios-simulator/libcooklang_import.a \
-headers target/ios/ios-simulator/Headers \
-output target/ios/CooklangImportFFI.xcframework
- name: Create Swift Package
run: |
mkdir -p target/ios/CooklangImport/Sources/CooklangImport
cp target/ios/swift/cooklang_import.swift target/ios/CooklangImport/Sources/CooklangImport/
cp -R target/ios/CooklangImportFFI.xcframework target/ios/CooklangImport/
cat > target/ios/CooklangImport/Package.swift << 'EOF'
// swift-tools-version:5.5
import PackageDescription
let package = Package(
name: "CooklangImport",
platforms: [
.iOS(.v13),
.macOS(.v10_15)
],
products: [
.library(
name: "CooklangImport",
targets: ["CooklangImport", "CooklangImportFFI"]
),
],
targets: [
.target(
name: "CooklangImport",
dependencies: ["CooklangImportFFI"]
),
.binaryTarget(
name: "CooklangImportFFI",
path: "CooklangImportFFI.xcframework"
),
]
)
EOF
- name: Package iOS artifacts
run: |
cd target/ios
zip -r ../../cooklang-import-ios.zip CooklangImport CooklangImportFFI.xcframework swift
- name: Upload iOS artifacts
uses: actions/upload-artifact@v4
with:
name: ios-artifacts
path: cooklang-import-ios.zip
# Build Android artifacts on Linux
build-android:
name: Build Android
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android,armv7-linux-androideabi,x86_64-linux-android
- name: Cache Rust dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-android-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-android-cargo-
- name: Setup Android NDK
uses: android-actions/setup-android@v3
- name: Install NDK
run: |
sdkmanager --install "ndk;26.1.10909125"
echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/26.1.10909125" >> $GITHUB_ENV
- name: Install cargo-ndk and uniffi-bindgen
run: |
cargo install cargo-ndk --locked || cargo install cargo-ndk
cargo install uniffi_bindgen --version "^0.28"
- name: Build Android targets
run: |
cargo ndk --target aarch64-linux-android --platform 21 build --release --features uniffi
cargo ndk --target armv7-linux-androideabi --platform 21 build --release --features uniffi
cargo ndk --target x86_64-linux-android --platform 21 build --release --features uniffi
- name: Generate Kotlin bindings
run: |
mkdir -p target/android/kotlin
uniffi-bindgen generate \
--library target/aarch64-linux-android/release/libcooklang_import.so \
--language kotlin \
--out-dir target/android/kotlin
- name: Organize JNI libraries
run: |
mkdir -p target/android/jniLibs/{arm64-v8a,armeabi-v7a,x86_64}
cp target/aarch64-linux-android/release/libcooklang_import.so target/android/jniLibs/arm64-v8a/
cp target/armv7-linux-androideabi/release/libcooklang_import.so target/android/jniLibs/armeabi-v7a/
cp target/x86_64-linux-android/release/libcooklang_import.so target/android/jniLibs/x86_64/
- name: Create Android library module
run: |
mkdir -p target/android/cooklang-import-android/src/main/kotlin
mkdir -p target/android/cooklang-import-android/src/main/jniLibs
# Copy JNI libs
cp -R target/android/jniLibs/* target/android/cooklang-import-android/src/main/jniLibs/
# Copy Kotlin bindings
cp target/android/kotlin/*.kt target/android/cooklang-import-android/src/main/kotlin/
# Create build.gradle.kts
cat > target/android/cooklang-import-android/build.gradle.kts << 'EOF'
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.cooklang.import_lib"
compileSdk = 34
defaultConfig {
minSdk = 21
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
sourceSets {
getByName("main") {
jniLibs.srcDirs("src/main/jniLibs")
}
}
}
dependencies {
implementation("net.java.dev.jna:jna:5.14.0@aar")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}
EOF
# Create AndroidManifest.xml
mkdir -p target/android/cooklang-import-android/src/main
cat > target/android/cooklang-import-android/src/main/AndroidManifest.xml << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
EOF
# Create proguard rules
cat > target/android/cooklang-import-android/proguard-rules.pro << 'EOF'
-keep class uniffi.** { *; }
-keep class com.cooklang.** { *; }
-keep class com.sun.jna.** { *; }
-keepclassmembers class * extends com.sun.jna.** { public *; }
EOF
cat > target/android/cooklang-import-android/consumer-rules.pro << 'EOF'
-keep class uniffi.** { *; }
-keep class com.cooklang.** { *; }
EOF
- name: Package Android artifacts
run: |
cd target/android
zip -r ../../cooklang-import-android.zip cooklang-import-android jniLibs kotlin
- name: Upload Android artifacts
uses: actions/upload-artifact@v4
with:
name: android-artifacts
path: cooklang-import-android.zip
# Create GitHub Release
release:
name: Create Release
needs: [build-ios, build-android]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/') && github.event.inputs.dry_run != 'true'
permissions:
contents: write
steps:
- name: Checkout sources
uses: actions/checkout@v4
- name: Download iOS artifacts
uses: actions/download-artifact@v4
with:
name: ios-artifacts
- name: Download Android artifacts
uses: actions/download-artifact@v4
with:
name: android-artifacts
- name: Get version from tag
id: version
run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
- name: Create Release
uses: softprops/action-gh-release@v1
with:
name: Release ${{ steps.version.outputs.VERSION }}
draft: false
prerelease: ${{ contains(github.ref, 'alpha') || contains(github.ref, 'beta') || contains(github.ref, 'rc') }}
generate_release_notes: true
files: |
cooklang-import-ios.zip
cooklang-import-android.zip
body: |
## Mobile SDK Release ${{ steps.version.outputs.VERSION }}
### iOS
Download `cooklang-import-ios.zip` which contains:
- `CooklangImport/` - Swift Package ready to use
- `CooklangImportFFI.xcframework` - XCFramework for manual integration
- `swift/` - Swift bindings source files
### Android
Download `cooklang-import-android.zip` which contains:
- `cooklang-import-android/` - Android library module
- `jniLibs/` - Native libraries for all architectures
- `kotlin/` - Kotlin bindings source files
### Supported Architectures
**iOS:**
- arm64 (devices)
- arm64 (simulator, Apple Silicon)
- x86_64 (simulator, Intel)
**Android:**
- arm64-v8a
- armeabi-v7a
- x86_64
See the README for integration instructions.