diff --git a/rust_to_flutter.sh b/rust_to_flutter.sh new file mode 100644 index 0000000..5c193a3 --- /dev/null +++ b/rust_to_flutter.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +set -e + +# Check for required arguments +if [ "$#" -ne 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +# Convert to absolute paths +RUST_PROJECT_FOLDER=$(cd "$1" && pwd) +FLUTTER_PROJECT_FOLDER=$(cd "$2" && pwd) + +# Supported targets for Android +ANDROID_ARCHS=("arm64-v8a" "armeabi-v7a" "x86_64" "x86") +ANDROID_TARGETS=("aarch64-linux-android" "armv7-linux-androideabi" "x86_64-linux-android" "i686-linux-android") +IOS_TARGETS=("aarch64-apple-ios" "x86_64-apple-ios") + +# Check if on macOS for iOS targets +if [[ "$OSTYPE" == "darwin"* ]]; then + INCLUDE_IOS_TARGETS=true +else + INCLUDE_IOS_TARGETS=false + echo "Skipping iOS targets as this is not a macOS environment." +fi + +# Enter the Rust project folder +cd "$RUST_PROJECT_FOLDER" || exit +echo "Cleaning Build Directory" +cargo clean + +# Compile for each Android architecture using cargo-ndk +for arch in "${ANDROID_ARCHS[@]}"; do + echo "Compiling for Android architecture: $arch..." + cargo ndk -t "$arch" build --release +done + +# Compile for each iOS target if on macOS +if [ "$INCLUDE_IOS_TARGETS" = true ]; then + for target in "${IOS_TARGETS[@]}"; do + echo "Compiling for iOS target: $target..." + cargo build --release --target "$target" + done +fi + + +# Copy compiled libraries to Flutter project for Android +for i in "${!ANDROID_ARCHS[@]}"; do + arch=${ANDROID_ARCHS[$i]} + target=${ANDROID_TARGETS[$i]} + RELEASE_DIR="target/$target/release" + LIB_FILE=$(find "$RELEASE_DIR" -maxdepth 1 -name "lib*.so" | head -n 1) + + if [ -n "$LIB_FILE" ]; then + DEST_DIR="$FLUTTER_PROJECT_FOLDER/android/app/src/main/jniLibs/$arch" + mkdir -p "$DEST_DIR" + cp "$LIB_FILE" "$DEST_DIR/" + echo "Copied $arch library to $2/android/app/src/main/jniLibs/$arch" + else + echo "No .so files found for $arch in $RELEASE_DIR" + fi +done + +# Copy compiled libraries to Flutter project for iOS +if [ "$INCLUDE_IOS_TARGETS" = true ]; then + IOS_DEST_DIR="$FLUTTER_PROJECT_FOLDER/ios" + mkdir -p "$IOS_DEST_DIR" + for target in "${IOS_TARGETS[@]}"; do + RELEASE_DIR="target/$target/release" + LIB_FILE=$(find "$RELEASE_DIR" -maxdepth 1 -name "lib*.so" | head -n 1) + if [ -n "$LIB_FILE" ]; then + cp "$LIB_FILE" "$IOS_DEST_DIR/" + echo "Copied $target library to $IOS_DEST_DIR" + else + echo "No library found for $target in $RELEASE_DIR" + fi + done +fi + +echo "Compilation and library copying completed successfully."