diff --git a/cargo-apk/src/apk.rs b/cargo-apk/src/apk.rs index b9506ba..52e0fe2 100644 --- a/cargo-apk/src/apk.rs +++ b/cargo-apk/src/apk.rs @@ -143,6 +143,7 @@ impl<'a> ApkBuilder<'a> { *target, self.min_sdk_version(), self.cmd.target_dir(), + self.manifest.hacky_bins, )?; cargo.arg("check"); if self.cmd.target().is_none() { @@ -220,13 +221,29 @@ impl<'a> ApkBuilder<'a> { for target in &self.build_targets { let triple = target.rust_triple(); let build_dir = self.cmd.build_dir(Some(triple)); - let artifact = self.cmd.artifact(artifact, Some(triple), CrateType::Cdylib); + let lib = self.cmd.artifact(artifact, Some(triple), CrateType::Cdylib); + + if self.manifest.hacky_bins { + let actual_bin = self.cmd.artifact(artifact, Some(triple), CrateType::Bin); + #[cfg(unix)] + { + if let Err(err) = std::fs::remove_file(&lib) { + if err.kind() != std::io::ErrorKind::NotFound { + return Err(err.into()); + } + } + std::os::unix::fs::symlink(actual_bin, &lib)?; + } + #[cfg(not(unix))] + std::fs::copy(actual_bin, &lib)?; + } let mut cargo = cargo_ndk( &self.ndk, *target, self.min_sdk_version(), self.cmd.target_dir(), + self.manifest.hacky_bins, )?; cargo.arg("build"); if self.cmd.target().is_none() { @@ -247,7 +264,7 @@ impl<'a> ApkBuilder<'a> { .map(|path| path.as_path()) .collect::>(); - apk.add_lib_recursively(&artifact, *target, libs_search_paths.as_slice())?; + apk.add_lib_recursively(&lib, *target, libs_search_paths.as_slice())?; if let Some(runtime_libs) = &runtime_libs { apk.add_runtime_libs(runtime_libs, *target, libs_search_paths.as_slice())?; @@ -347,6 +364,7 @@ impl<'a> ApkBuilder<'a> { *target, self.min_sdk_version(), self.cmd.target_dir(), + self.manifest.hacky_bins, )?; cargo.arg(cargo_cmd); self.cmd.args().apply(&mut cargo); diff --git a/cargo-apk/src/manifest.rs b/cargo-apk/src/manifest.rs index de4460a..508a1ef 100644 --- a/cargo-apk/src/manifest.rs +++ b/cargo-apk/src/manifest.rs @@ -27,6 +27,7 @@ pub(crate) struct Manifest { pub(crate) signing: HashMap, pub(crate) reverse_port_forward: HashMap, pub(crate) strip: StripConfig, + pub(crate) hacky_bins: bool, } impl Manifest { @@ -53,6 +54,7 @@ impl Manifest { signing: metadata.signing, reverse_port_forward: metadata.reverse_port_forward, strip: metadata.strip, + hacky_bins: metadata.hacky_bins, }) } } @@ -111,6 +113,8 @@ struct AndroidMetadata { reverse_port_forward: HashMap, #[serde(default)] strip: StripConfig, + #[serde(default)] + hacky_bins: bool, } #[derive(Clone, Debug, Default, Deserialize)] diff --git a/ndk-build/src/cargo.rs b/ndk-build/src/cargo.rs index b6459eb..bc64507 100644 --- a/ndk-build/src/cargo.rs +++ b/ndk-build/src/cargo.rs @@ -9,6 +9,7 @@ pub fn cargo_ndk( target: Target, sdk_version: u32, target_dir: impl AsRef, + hacky_bins: bool, ) -> Result { let triple = target.rust_triple(); let clang_target = format!("--target={}{}", target.ndk_llvm_triple(), sdk_version); @@ -105,6 +106,13 @@ pub fn cargo_ndk( ); } + if hacky_bins { + rustflags.push_str(SEP); + rustflags.push_str("-Clink-arg=-shared"); + rustflags.push_str(SEP); + rustflags.push_str("-Clink-arg=-no-pie"); + } + cargo.env("CARGO_ENCODED_RUSTFLAGS", rustflags); Ok(cargo)