Skip to content

Commit bb87df9

Browse files
committed
android: Set SDK/API level via version-suffxed --target triple
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.
1 parent a5f6f5a commit bb87df9

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

xbuild/src/cargo/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -307,11 +307,13 @@ impl CargoBuild {
307307
pub fn use_android_ndk(&mut self, path: &Path, target_sdk_version: u32) -> Result<()> {
308308
let path = dunce::canonicalize(path)?;
309309
let ndk_triple = self.target.ndk_triple();
310+
let ndk_versioned_triple = format!("{ndk_triple}{target_sdk_version}");
310311
self.cfg_tool(Tool::Cc, "clang");
311312
self.cfg_tool(Tool::Cxx, "clang++");
312313
self.cfg_tool(Tool::Ar, "llvm-ar");
313314
self.cfg_tool(Tool::Linker, "clang");
314315
self.set_sysroot(&path);
316+
self.add_cflag(&format!("--target={ndk_versioned_triple}"));
315317
self.add_cxxflag("-stdlib=libc++");
316318
let lib_dir = path.join("usr").join("lib").join(ndk_triple);
317319
let sdk_lib_dir = lib_dir.join(target_sdk_version.to_string());
@@ -321,9 +323,7 @@ impl CargoBuild {
321323
target_sdk_version
322324
);
323325
self.use_ld("lld");
324-
if let Some(triple) = self.triple {
325-
self.add_link_arg(&format!("--target={}", triple));
326-
}
326+
self.add_link_arg(&format!("--target={ndk_versioned_triple}"));
327327
self.add_link_arg(&format!("-B{}", sdk_lib_dir.display()));
328328
self.add_link_arg(&format!("-L{}", sdk_lib_dir.display()));
329329
self.add_link_arg(&format!("-L{}", lib_dir.display()));

0 commit comments

Comments
 (0)