rust-to-flutter/rust_to_flutter.sh

132 lines
3.6 KiB
Bash
Raw Normal View History

2025-01-21 17:05:38 +02:00
#!/usr/bin/env bash
2025-01-11 12:30:51 +02:00
set -e
# Check for required arguments
2025-01-21 17:05:38 +02:00
if [ "$#" -lt 2 ]; then
echo "Usage: $0 [-x] <rust_project_folder> <flutter_project_folder>"
echo " -x: Include x86 and x86_64 targets for Android and iOS (optional)"
2025-01-21 17:05:38 +02:00
exit 1
fi
# Parse optional -x flag
INCLUDE_X86=false
while getopts ":x" opt; do
case $opt in
x)
INCLUDE_X86=true
;;
*)
echo "Invalid option: -$OPTARG"
exit 1
;;
esac
done
shift $((OPTIND - 1))
# Validate remaining arguments
2025-01-11 12:30:51 +02:00
if [ "$#" -ne 2 ]; then
2025-01-21 17:05:38 +02:00
echo "Usage: $0 [-x] <rust_project_folder> <flutter_project_folder>"
2025-01-11 12:30:51 +02:00
exit 1
fi
# Convert to absolute paths
2025-01-21 17:05:38 +02:00
RUST_PROJECT_FOLDER="$(cd "$1" && pwd)"
FLUTTER_PROJECT_FOLDER="$(cd "$2" && pwd)"
2025-01-11 12:30:51 +02:00
# Supported targets for Android
2025-01-21 17:05:38 +02:00
ANDROID_ARCHS=("arm64-v8a" "armeabi-v7a")
ANDROID_TARGETS=("aarch64-linux-android" "armv7-linux-androideabi")
if [ "$INCLUDE_X86" = true ]; then
ANDROID_ARCHS+=("x86_64" "x86")
ANDROID_TARGETS+=("x86_64-linux-android" "i686-linux-android")
fi
# Supported targets for iOS
IOS_TARGETS=("aarch64-apple-ios")
if [ "$INCLUDE_X86" = true ]; then
IOS_TARGETS+=("x86_64-apple-ios")
fi
2025-01-11 12:30:51 +02:00
# Check if on macOS for iOS targets
2025-01-21 17:05:38 +02:00
if [[ "${OSTYPE:-}" == "darwin"* ]]; then
2025-01-11 12:30:51 +02:00
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
2025-01-21 17:05:38 +02:00
cd "$RUST_PROJECT_FOLDER" || exit 1
2025-01-11 12:39:51 +02:00
# Function to check and install missing targets
install_missing_targets() {
2025-01-21 17:05:38 +02:00
for target in "$@"; do
2025-01-11 12:39:51 +02:00
if ! rustup target list --installed | grep -q "$target"; then
echo "Installing target: $target"
rustup target add "$target"
else
echo "Target already installed: $target"
fi
done
}
# Install required targets
install_missing_targets "${ANDROID_TARGETS[@]}"
if [ "$INCLUDE_IOS_TARGETS" = true ]; then
install_missing_targets "${IOS_TARGETS[@]}"
fi
# Cleanup
2025-01-11 12:30:51 +02:00
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
2025-01-21 17:05:38 +02:00
arch="${ANDROID_ARCHS[$i]}"
target="${ANDROID_TARGETS[$i]}"
2025-01-11 12:30:51 +02:00
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/"
2025-01-21 17:05:38 +02:00
echo "Copied $arch library to $DEST_DIR"
2025-01-11 12:30:51 +02:00
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
2025-01-21 16:58:41 +02:00
IOS_DEST_DIR="$FLUTTER_PROJECT_FOLDER/ios/Runner"
2025-01-11 12:30:51 +02:00
mkdir -p "$IOS_DEST_DIR"
for target in "${IOS_TARGETS[@]}"; do
2025-01-21 17:05:38 +02:00
RELEASE_DIR="target/$target/release"
2025-01-21 17:08:03 +02:00
LIB_FILE=$(find "$RELEASE_DIR" -maxdepth 1 -name "lib*.dylib" | head -n 1)
2025-01-21 17:05:38 +02:00
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
2025-01-11 12:30:51 +02:00
done
fi
echo "Compilation and library copying completed successfully."