From a745c998e48776e8e18eee786848273a3c55f0d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emirhan=20U=C3=A7an?= Date: Sun, 5 Jul 2026 14:23:55 +0300 Subject: [PATCH] Android build.rs --- crates/unicorn-sys/build.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/crates/unicorn-sys/build.rs b/crates/unicorn-sys/build.rs index ae57d93..db74ac1 100644 --- a/crates/unicorn-sys/build.rs +++ b/crates/unicorn-sys/build.rs @@ -73,6 +73,21 @@ fn build_with_cmake() { ninja_available() }; + // When cross-compiling for Android with the NDK toolchain, we must + // tell cmake which ANDROID_ABI we want (mapped from the Rust TARGET). + if let Ok(target) = std::env::var("TARGET") { + let abi = match target.as_str() { + t if t.contains("aarch64-linux-android") => "arm64-v8a", + t if t.contains("armv7-linux-androideabi") => "armeabi-v7a", + t if t.contains("x86_64-linux-android") => "x86_64", + t if t.contains("i686-linux-android") => "x86", + _ => "", + }; + if !abi.is_empty() { + config.define("ANDROID_ABI", abi); + } + } + // Configure build generator if has_ninja { config.generator("Ninja"); @@ -146,11 +161,17 @@ fn build_with_cmake() { println!("cargo:rustc-link-lib=static=unicorn"); } if !compiler.is_like_msvc() { - println!("cargo:rustc-link-lib=pthread"); + if !is_android_target() { + println!("cargo:rustc-link-lib=pthread"); + } println!("cargo:rustc-link-lib=m"); } } +fn is_android_target() -> bool { + std::env::var("TARGET").map_or(false, |t| t.contains("android")) +} + fn watch_source_files() { let current_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); let project_root = std::path::Path::new(¤t_dir).join("unicorn"); @@ -374,7 +395,9 @@ fn main() { } else { println!("cargo:rustc-link-arg=-Wl,-allow-multiple-definition"); println!("cargo:rustc-link-lib=static=unicorn"); - println!("cargo:rustc-link-lib=pthread"); + if !is_android_target() { + println!("cargo:rustc-link-lib=pthread"); + } println!("cargo:rustc-link-lib=m"); } }