crossbundle_tools/commands/android/common/rust_compile/
set_linker_args.rs

1use crate::types::*;
2
3/// Add linker args for quad engine using NDK versions <=22
4pub 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
33/// Helper function to build arguments composed of concatenating two strings
34fn 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
41/// Replace cmd with new arguments. For more information see the [`Target Selection`]
42///
43/// [Target Selection]: https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#target-selection
44pub 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
64/// Replace libgcc file with unwind. libgcc was removed in ndk versions >=23.
65/// This is workaround for gcc not found issue.
66pub 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}