1 cmake_minimum_required(VERSION 3.18)
2 project(onde_inference_dart)
3
4 # ── Rust source directory ─────────────────────────────────────────────────────
5 # CMakeLists.txt lives in android/, so ../rust resolves to the sibling rust/ dir.
6 set(RUST_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../rust")
7
8 # ── Map Android ABI → Cargo target triple ────────────────────────────────────
9 if(ANDROID_ABI STREQUAL "arm64-v8a")
10 set(CARGO_TARGET "aarch64-linux-android")
11 elseif(ANDROID_ABI STREQUAL "armeabi-v7a")
12 set(CARGO_TARGET "armv7-linux-androideabi")
13 elseif(ANDROID_ABI STREQUAL "x86_64")
14 set(CARGO_TARGET "x86_64-linux-android")
15 elseif(ANDROID_ABI STREQUAL "x86")
16 set(CARGO_TARGET "i686-linux-android")
17 else()
18 message(FATAL_ERROR "Unsupported Android ABI: ${ANDROID_ABI}")
19 endif()
20
21 # ── Output path for the compiled Rust shared library ─────────────────────────
22 set(LIB_OUTPUT
23 "${RUST_DIR}/target/${CARGO_TARGET}/release/libonde_inference_dart.so"
24 )
25
26 # ── Custom build step: invoke cargo ──────────────────────────────────────────
27 # Requires the Android NDK cross-compilation toolchain to be on PATH, or
28 # a .cargo/config.toml in the Rust crate with the correct linker overrides
29 # for each Android target.
30 add_custom_command(
31 OUTPUT ${LIB_OUTPUT}
32 COMMAND cargo build
33 --release
34 --target ${CARGO_TARGET}
35 --manifest-path "${RUST_DIR}/Cargo.toml"
36 WORKING_DIRECTORY ${RUST_DIR}
37 COMMENT "Building onde_inference_dart for ${CARGO_TARGET}…"
38 VERBATIM
39 )
40
41 # Dummy target that depends on the cargo output so CMake tracks it correctly.
42 add_custom_target(onde_inference_dart_cargo_build ALL
43 DEPENDS ${LIB_OUTPUT}
44 )
45
46 # ── Import the built .so as a pre-built shared library ───────────────────────
47 add_library(onde_inference_dart SHARED IMPORTED GLOBAL)
48 set_target_properties(onde_inference_dart PROPERTIES
49 IMPORTED_LOCATION ${LIB_OUTPUT}
50 )
51 add_dependencies(onde_inference_dart onde_inference_dart_cargo_build)