#!/usr/bin/env bash # cargo shim: intercept `cargo tauri android android-studio-script` (the # hidden subcommand the tauri gradle plugin's rustBuild task runs) and # reproduce its effect with a PLAIN cargo build. # # Why: the cargo-tauri CLI (every subcommand that builds a Rust interface) # starts an inotify debouncer on Cargo.toml. This host's per-user inotify # WATCH quota (65536) is exhausted by the user's standalone syncthing # (65,482 watches), so inotify_add_watch → ENOSPC and the CLI dies before # doing anything. Plain cargo build uses no inotify. # # android-studio-script's output (verified on the tttest build): the lib .so # placed at gen/android/app/src/main/jniLibs//lib.so. set -euo pipefail REAL_CARGO="$HOME/.cargo/bin/cargo" PROJ=/mnt/Backup/prog/android/gallery/harnesses/gtauri NDK="$HOME/android-sdk/ndk/27.0.12077973" if [ "${1:-}" = "tauri" ] && [ "${2:-}" = "android" ] && [ "${3:-}" = "android-studio-script" ]; then shift 3 release="" ; target="x86_64" while [ $# -gt 0 ]; do case "$1" in --release) release=1 ;; --target) shift; target="${1:-x86_64}" ;; esac shift done case "$target" in x86_64) TRIPLE=x86_64-linux-android; ABI_DIR=x86_64; CLANG=x86_64-linux-android24-clang ;; aarch64) TRIPLE=aarch64-linux-android; ABI_DIR=arm64-v8a; CLANG=aarch64-linux-android24-clang ;; armv7) TRIPLE=armv7-linux-androideabi; ABI_DIR=armeabi-v7a; CLANG=armv7a-linux-androideabi24-clang ;; i686) TRIPLE=i686-linux-android; ABI_DIR=x86; CLANG=i686-linux-android24-clang ;; *) echo "shim: unknown target $target" >&2; exit 1 ;; esac prof="debug"; [ -n "$release" ] && prof="release" echo "gtauri shim: cargo build $TRIPLE $prof (bypassing cargo-tauri)" # env var names are CARGO_TARGET__... with HYPHENS → UNDERSCORES UPPER=$(echo "$TRIPLE" | tr 'a-z-' 'A-Z_') # cc crate (libsqlite3-sys bundled, turbojpeg cmake) wants CC_ LOWER=$(echo "$UPPER" | tr 'A-Z' 'a-z') NDK_BIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin case "$target" in x86_64) ABI=x86_64 ;; aarch64) ABI=arm64-v8a ;; armv7) ABI=armeabi-v7a ;; i686) ABI=x86 ;; esac CCNAME=$CLANG # any valid C compiler for the target; API level is moot for cc env \ "CARGO_TARGET_${UPPER}_LINKER=$NDK_BIN/$CLANG" \ "CARGO_TARGET_${UPPER}_RUSTFLAGS=-Clink-arg=-landroid -Clink-arg=-llog -Clink-arg=-lOpenSLES" \ "CC_${LOWER}=$NDK_BIN/$CCNAME" \ "CXX_${LOWER}=$NDK_BIN/${CCNAME}++" \ "AR_${LOWER}=$NDK_BIN/llvm-ar" \ "CC=$NDK_BIN/$CCNAME" \ "CXX=$NDK_BIN/${CCNAME}++" \ "CMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake" \ "ANDROID_PLATFORM=android-26" \ "ANDROID_STL=c++_static" \ "ANDROID_ABI=$ABI" \ "TURBOJPEG_STATIC=1" \ "$REAL_CARGO" build --package gtauri --manifest-path "$PROJ/Cargo.toml" \ --target "$TRIPLE" --features "tauri/custom-protocol" --lib --"$prof" SO="$PROJ/target/$TRIPLE/$prof/libgtauri_lib.so" [ -f "$SO" ] || { echo "shim: $SO not produced" >&2; exit 1; } DEST="$PROJ/gen/android/app/src/main/jniLibs/$ABI_DIR/libgtauri_lib.so" mkdir -p "$(dirname "$DEST")" # /mnt/Backup's stat identity is unreliable here (cp still reports # "same file"), so just break any link and copy fresh: rm -f "$DEST" cp "$SO" "$DEST" echo "gtauri shim: .so -> jniLibs/$ABI_DIR" exit 0 fi exec "$REAL_CARGO" "$@"