mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-01-08 22:28:12 -05:00
wallet: tor-dirmgr tries to pull sqlite3, which on android has a missing symbol __extenddftf2 due to missing compiler builtins. We therefore link against clang_rt.builtins for each target_arch on android using a build.rs. See the code comment for more details.
This commit is contained in:
@@ -54,8 +54,9 @@ halo2_gadgets = {git="https://github.com/parazyd/halo2", branch="v4"}
|
||||
|
||||
[target.'cfg(target_os = "android")'.dependencies]
|
||||
android_logger = "0.13.3"
|
||||
#openssl = { version = "*", features = ["vendored"] }
|
||||
rusqlite = {version = "0.31.0", features = ["bundled"]}
|
||||
# Required by Arti: tor-dirmgr
|
||||
#rusqlite = {version = "0.31.0", features = ["bundled"]}
|
||||
tor-dirmgr = {version="0.21.0", features=["static"]}
|
||||
|
||||
[target.'cfg(target_os = "linux")'.dependencies]
|
||||
simplelog = "0.12.1"
|
||||
|
||||
@@ -17,6 +17,10 @@ android: fonts
|
||||
adb logcat -c
|
||||
adb logcat -s darkfi
|
||||
|
||||
# Useful for dev
|
||||
cli:
|
||||
podman run -v $(shell pwd)/../../:/root/darkfi -w /root/darkfi/bin/darkwallet/ -it apk bash
|
||||
|
||||
clean:
|
||||
podman run -v $(shell pwd):/root/dw -w /root/dw -t apk rm -fr target/
|
||||
|
||||
|
||||
@@ -6,15 +6,19 @@ make
|
||||
|
||||
# Android
|
||||
|
||||
Make sure you have podman installed. Then run `make android`.
|
||||
|
||||
To debug any issues, you can enter an interactive terminal using:
|
||||
Make sure you have podman installed. Then run:
|
||||
|
||||
```
|
||||
podman run -v $(pwd):/root/dw -it apk bash
|
||||
make android
|
||||
```
|
||||
|
||||
# Debugging Missing Symbols (note to self)
|
||||
To debug any issues, you can enter an interactive terminal using `make cli`.
|
||||
|
||||
# Useful Dev Commands
|
||||
|
||||
This is just devs.
|
||||
|
||||
## Debugging Missing Symbols
|
||||
|
||||
```
|
||||
"hb_ft_font_create_referenced"
|
||||
@@ -22,3 +26,9 @@ podman run -v $(pwd):/root/dw -it apk bash
|
||||
nm libharfbuzz_rs-5d6b743170eb0207.rlib | grep hb_ | less
|
||||
```
|
||||
|
||||
## Resolve Dependency Issues
|
||||
|
||||
```
|
||||
cargo tree --target aarch64-linux-android --invert openssl-sys
|
||||
```
|
||||
|
||||
|
||||
68
bin/darkwallet/build.rs
Normal file
68
bin/darkwallet/build.rs
Normal file
@@ -0,0 +1,68 @@
|
||||
/* This file is part of DarkFi (https://dark.fi)
|
||||
*
|
||||
* Copyright (C) 2020-2024 Dyne.org foundation
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
use std::{fs::File, io::Write};
|
||||
|
||||
/// Adds a temporary workaround for [an issue] with the Rust compiler and Android when
|
||||
/// compiling sqlite3 bundled C code.
|
||||
///
|
||||
/// The Android NDK used to include `libgcc` for unwind support (which is required by Rust
|
||||
/// among others). From NDK r23, `libgcc` is removed, replaced by LLVM's `libunwind`.
|
||||
/// However, `libgcc` was ambiently providing other compiler builtins, one of which we
|
||||
/// require: `__extenddftf2` for software floating-point emulation. This is used by SQLite
|
||||
/// (via the `rusqlite` crate), which defines a `LONGDOUBLE_TYPE` type as `long double`.
|
||||
///
|
||||
/// Rust uses a `compiler-builtins` crate that does not provide `__extenddftf2` because
|
||||
/// it involves floating-point types that are not supported by Rust.
|
||||
///
|
||||
/// The workaround comes from [this Mozilla PR]: we tell Cargo to statically link the
|
||||
/// builtins from the Clang runtime provided inside the NDK, to provide this symbol.
|
||||
///
|
||||
/// See also this [zcash issue] and [their workaround].
|
||||
///
|
||||
/// [an issue]: https://github.com/rust-lang/rust/issues/109717
|
||||
/// [this Mozilla PR]: https://github.com/mozilla/application-services/pull/5442
|
||||
/// [unsupported]: https://github.com/rust-lang/compiler-builtins#unimplemented-functions
|
||||
/// [zcash issue]: https://github.com/zcash/librustzcash/issues/800
|
||||
/// [their workaround]: https://github.com/Electric-Coin-Company/zcash-android-wallet-sdk/blob/88058c63461f2808efc953af70db726b9f36f9b9/backend-lib/build.rs
|
||||
fn main() {
|
||||
let target_os = std::env::var("CARGO_CFG_TARGET_OS").expect("CARGO_CFG_TARGET_OS not set");
|
||||
let target_arch =
|
||||
std::env::var("CARGO_CFG_TARGET_ARCH").expect("CARGO_CFG_TARGET_ARCH not set");
|
||||
//println!("cargo:warning={target_arch}");
|
||||
|
||||
// Add some useful debug info directly into the app itself
|
||||
let mut f = File::create("src/build_info.rs").unwrap();
|
||||
writeln!(f, "pub const TARGET_OS: &'static str = \"{target_os}\";").unwrap();
|
||||
writeln!(f, "pub const TARGET_ARCH: &'static str = \"{target_arch}\";").unwrap();
|
||||
|
||||
if target_os == "android" {
|
||||
// Since we run this inside a container, we can just hardcore the paths directly
|
||||
println!("cargo:rustc-link-search=/usr/local/android-ndk-r25/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/14.0.6/lib/linux/");
|
||||
match target_arch.as_str() {
|
||||
"aarch64" => println!("cargo:rustc-link-lib=static=clang_rt.builtins-aarch64-android"),
|
||||
"arm" => println!("cargo:rustc-link-lib=static=clang_rt.builtins-arm-android"),
|
||||
"i686" => println!("cargo:rustc-link-lib=static=clang_rt.builtins-i686-android"),
|
||||
"x86_64" => println!("cargo:rustc-link-lib=static=clang_rt.builtins-x86_64-android"),
|
||||
// Maybe this should panic instead
|
||||
_ => println!(
|
||||
"cargo:warning='leaving linker args for {target_os}:{target_arch} unchanged"
|
||||
),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -51,13 +51,14 @@ pub async fn receive_msgs(sg_root: SceneNodePtr, ex: ExecutorPtr) -> Result<()>
|
||||
let chatview_node = sg_root.lookup_node("/window/view/chatty").ok_or(Error::ConnectFailed)?;
|
||||
|
||||
info!(target: "darkirc", "Instantiating DarkIRC event DAG");
|
||||
let datastore = expand_path(EVGRDB_PATH)?;
|
||||
fs::create_dir_all(&datastore).await?;
|
||||
let sled_db = sled::open(datastore)?;
|
||||
//let datastore = expand_path(EVGRDB_PATH)?;
|
||||
//fs::create_dir_all(&datastore).await?;
|
||||
let sled_db = sled::open(EVGRDB_PATH)?;
|
||||
|
||||
let evgr = LocalEventGraph::new(sled_db.clone(), "darkirc_dag", 1, ex.clone()).await?;
|
||||
|
||||
let endpoint = "tcp://127.0.0.1:5588";
|
||||
let endpoint = "tcp://192.168.1.38:5588";
|
||||
let endpoint = Url::parse(endpoint)?;
|
||||
|
||||
let dialer = Dialer::new(endpoint.clone(), None).await?;
|
||||
|
||||
@@ -46,6 +46,7 @@ extern crate log;
|
||||
use log::LevelFilter;
|
||||
|
||||
mod app;
|
||||
mod build_info;
|
||||
//mod darkirc;
|
||||
mod darkirc2;
|
||||
mod error;
|
||||
@@ -104,6 +105,9 @@ fn main() {
|
||||
simplelog::CombinedLogger::init(vec![term_logger]).expect("logger");
|
||||
}
|
||||
|
||||
info!("Target OS: {}", build_info::TARGET_OS);
|
||||
info!("Target arch: {}", build_info::TARGET_ARCH);
|
||||
|
||||
let ex = Arc::new(smol::Executor::new());
|
||||
let sg_root = SceneNode3::root();
|
||||
|
||||
|
||||
@@ -17,59 +17,25 @@ name = "test"
|
||||
path = "bin/test.rs"
|
||||
|
||||
[dependencies]
|
||||
darkfi = {path = "../../", features = ["async-daemonize", "event-graph", "rpc", "zk"]}
|
||||
darkfi-sdk = {path = "../../src/sdk", features = ["async"]}
|
||||
darkfi = {path = "../../", features = ["event-graph"]}
|
||||
darkfi-serial = {path = "../../src/serial", features = ["async"]}
|
||||
futures-lite = "2.3.0"
|
||||
libc = "0.2.158"
|
||||
|
||||
# Event Graph DB
|
||||
sled-overlay = "0.1.3"
|
||||
|
||||
# TLS
|
||||
async-trait = "0.1.81"
|
||||
futures = "0.3.30"
|
||||
futures-rustls = {version = "0.26.0", default-features = false, features = ["logging", "tls12", "ring"]}
|
||||
rustls-pemfile = "2.1.3"
|
||||
|
||||
# Crypto
|
||||
blake3 = "1.5.4"
|
||||
bcrypt = "0.15.1"
|
||||
crypto_box = {version = "0.9.1", features = ["std", "chacha20"]}
|
||||
rand = "0.8.5"
|
||||
|
||||
# Misc
|
||||
log = "0.4.22"
|
||||
url = "2.5.2"
|
||||
|
||||
# Encoding and parsing
|
||||
bs58 = "0.5.1"
|
||||
toml = "0.8.19"
|
||||
semver = "1.0.23"
|
||||
|
||||
# Daemon
|
||||
easy-parallel = "3.3.1"
|
||||
signal-hook-async-std = "0.2.2"
|
||||
signal-hook = "0.3.17"
|
||||
simplelog = "0.12.2"
|
||||
smol = "2.0.1"
|
||||
|
||||
# Argument parsing
|
||||
serde = {version = "1.0.209", features = ["derive"]}
|
||||
structopt = "0.3.26"
|
||||
structopt-toml = "0.5.1"
|
||||
|
||||
# See https://github.com/rust-mobile/android-rs-glue/issues/193
|
||||
[target.aarch64-linux-android.dependencies]
|
||||
openssl = { version = "*", features = ["vendored"] }
|
||||
rusqlite = {version = "0.31.0", features = ["bundled"]}
|
||||
|
||||
#[lints]
|
||||
#workspace = true
|
||||
|
||||
# Temp stuff
|
||||
[workspace]
|
||||
[patch.crates-io]
|
||||
halo2_proofs = {git="https://github.com/parazyd/halo2", branch="v4"}
|
||||
halo2_gadgets = {git="https://github.com/parazyd/halo2", branch="v4"}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user