cargo_ndk/
lib.rs

1use std::path::PathBuf;
2
3pub mod cargo;
4pub mod cli;
5pub mod meta;
6pub mod shell;
7
8#[cfg(target_os = "macos")]
9pub(crate) const ARCH: &str = "darwin-x86_64";
10#[cfg(any(target_os = "linux", target_os = "android"))]
11pub(crate) const ARCH: &str = "linux-x86_64";
12#[cfg(target_os = "windows")]
13pub(crate) const ARCH: &str = "windows-x86_64";
14
15#[cfg(all(target_os = "android", not(cargo_ndk_on_android)))]
16compile_error!(
17    r#"
18Building cargo-ndk on Android is not supported. This binary is intended to be run on your host OS.
19
20Set CARGO_NDK_ON_ANDROID to override this check (for example, building for Termux)."
21"#
22);
23
24#[cfg(not(any(
25    target_os = "android",
26    target_os = "macos",
27    target_os = "linux",
28    target_os = "windows"
29)))]
30compile_error!("Unsupported target OS");
31
32pub(crate) fn clang_target(rust_target: &str, api_level: u8) -> String {
33    let target = match rust_target {
34        "arm-linux-androideabi" => "armv7a-linux-androideabi",
35        "armv7-linux-androideabi" => "armv7a-linux-androideabi",
36        _ => rust_target,
37    };
38    format!("--target={target}{api_level}")
39}
40
41pub(crate) fn sysroot_target(rust_target: &str) -> &str {
42    (match rust_target {
43        "armv7-linux-androideabi" => "arm-linux-androideabi",
44        _ => rust_target,
45    }) as _
46}
47
48pub(crate) fn ndk_tool(arch: &str, tool: &str) -> PathBuf {
49    ["toolchains", "llvm", "prebuilt", arch, "bin", tool]
50        .iter()
51        .collect()
52}
53
54pub(crate) fn sysroot_suffix(arch: &str) -> PathBuf {
55    ["toolchains", "llvm", "prebuilt", arch, "sysroot"]
56        .iter()
57        .collect()
58}