Skip to content

Commit

Permalink
android: Set SDK/API level via version-suffxed --target triple
Browse files Browse the repository at this point in the history
We haven't set the SDK/API level via the `__ANDROID_API__` define for
a very long time and so far got away with it.  However, while debugging
why `backtrace` (and by extension Rust `std` which reuses that crate)
wasn't generating symbolicated stacktraces in `panic_log`, and why
`findshlibs` wasn't providing the list of loaded libraries to `sentry`,
we found that both rely on expanding the `__ANDROID_API__` define
via compiling a small C file via `cc` to make the code conditional on
SDK/API >= 21:

gimli-rs/findshlibs#65
rust-lang/backtrace-rs#415

(It would have been lovely if these crates emitted a `cargo:warning`
when the define wasn't set at all, indicating an "incomplete"
cross-compiler setup, and/or looked at the runtime Android API version
via something like rust-mobile/ndk#479.)

Note that `backtrace 0.3.74` / Rust 1.82
(rust-lang/rust@0763a3a) no longer rely on
this because Rust 1.82 bumped the minimum SDK/API level to 21:
rust-lang/backtrace-rs#656

We could set this define directly, or rely on `clang` to set it
for us by appending the SDK/API level to the target triple, of
the form `<arch>-linux-android<sdk level>`.  The latter is more
common. Keep in mind that the `cc` crate adds an unversioned
`--target=<arch>-linux-android` to the command line arguments as well,
but clang seems to deduplicate them (or look at the latter `--target`
which contains our version).

Note that this effectively reverts
rust-mobile@32efed6 because
we must now always pass the SDK level via the triple again, even if the
host also happens to be Android with the same architecture.
  • Loading branch information
MarijnS95 committed Jan 7, 2025
1 parent a5f6f5a commit bb87df9
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions xbuild/src/cargo/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -307,11 +307,13 @@ impl CargoBuild {
pub fn use_android_ndk(&mut self, path: &Path, target_sdk_version: u32) -> Result<()> {
let path = dunce::canonicalize(path)?;
let ndk_triple = self.target.ndk_triple();
let ndk_versioned_triple = format!("{ndk_triple}{target_sdk_version}");
self.cfg_tool(Tool::Cc, "clang");
self.cfg_tool(Tool::Cxx, "clang++");
self.cfg_tool(Tool::Ar, "llvm-ar");
self.cfg_tool(Tool::Linker, "clang");
self.set_sysroot(&path);
self.add_cflag(&format!("--target={ndk_versioned_triple}"));
self.add_cxxflag("-stdlib=libc++");
let lib_dir = path.join("usr").join("lib").join(ndk_triple);
let sdk_lib_dir = lib_dir.join(target_sdk_version.to_string());
Expand All @@ -321,9 +323,7 @@ impl CargoBuild {
target_sdk_version
);
self.use_ld("lld");
if let Some(triple) = self.triple {
self.add_link_arg(&format!("--target={}", triple));
}
self.add_link_arg(&format!("--target={ndk_versioned_triple}"));
self.add_link_arg(&format!("-B{}", sdk_lib_dir.display()));
self.add_link_arg(&format!("-L{}", sdk_lib_dir.display()));
self.add_link_arg(&format!("-L{}", lib_dir.display()));
Expand Down

0 comments on commit bb87df9

Please sign in to comment.