crossbundle_tools/commands/android/common/rust_compile/
set_linker_args.rs1use crate::types::*;
2
3pub fn add_clinker_args(
5 ndk: &AndroidNdk,
6 build_target: &AndroidTarget,
7 target_sdk_version: u32,
8) -> cargo::CargoResult<Vec<std::ffi::OsString>> {
9 let linker_args = vec![
10 build_arg("-Clinker=", ndk.linker_path(build_target)?),
11 "-Clinker-flavor=ld".into(),
12 build_arg("-Clink-arg=--sysroot=", ndk.sysroot()?),
13 build_arg(
14 "-Clink-arg=-L",
15 ndk.version_specific_libraries_path(target_sdk_version, build_target)?,
16 ),
17 build_arg(
18 "-Clink-arg=-L",
19 ndk.sysroot_lib_dir(build_target).map_err(|_| {
20 anyhow::Error::msg(format!(
21 "Failed to get access to the {:?}",
22 ndk.sysroot_lib_dir(build_target)
23 ))
24 })?,
25 ),
26 build_arg("-Clink-arg=-L", ndk.gcc_lib_path(build_target)?),
27 "-Crelocation-model=pic".into(),
28 ];
29
30 Ok(linker_args)
31}
32
33fn build_arg(start: &str, end: impl AsRef<std::ffi::OsStr>) -> std::ffi::OsString {
35 let mut new_arg = std::ffi::OsString::new();
36 new_arg.push(start);
37 new_arg.push(end.as_ref());
38 new_arg
39}
40
41pub fn new_ndk_quad_args(
45 tool_root: std::path::PathBuf,
46 build_target: &AndroidTarget,
47 target_sdk_version: u32,
48) -> crate::error::Result<Vec<std::ffi::OsString>> {
49 let mut new_args = super::linker_args(&tool_root)?;
50 #[cfg(target_os = "windows")]
51 let ext = ".cmd";
52 #[cfg(not(target_os = "windows"))]
53 let ext = "";
54 let linker_path = tool_root.join("bin").join(format!(
55 "{}{}-clang{}",
56 build_target.rust_triple(),
57 target_sdk_version,
58 ext,
59 ));
60 new_args.push(build_arg("-Clinker=", linker_path));
61 Ok(new_args)
62}
63
64pub fn linker_args(tool_root: &std::path::Path) -> crate::error::Result<Vec<std::ffi::OsString>> {
67 let mut new_args = Vec::new();
68 let link_dir = tool_root.join("libgcc");
69
70 std::fs::create_dir_all(&link_dir)?;
71 std::fs::write(link_dir.join("libgcc.a"), "INPUT(-lunwind)")?;
72 new_args.push(build_arg("-L", link_dir));
73
74 Ok(new_args)
75}