Skip to content

Commit a936fa1

Browse files
committed
rust: Allow cargo to create c libs as needed for tests
1 parent 0f88761 commit a936fa1

File tree

4 files changed

+74
-32
lines changed

4 files changed

+74
-32
lines changed

src/rust/bitbox02-sys/Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,6 @@ license = "Apache-2.0"
2222

2323
[dependencies]
2424
util = {path = "../util"}
25+
26+
[features]
27+
testing = []

src/rust/bitbox02-sys/build.rs

+70-5
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,26 @@ fn main() {
77
// if we are being invoked from CMAKE, the bindings are here:
88
format!("{}/rust", cmake_dir)
99
} else {
10+
// generate list of includes using CMake
11+
1012
let bitbox02_sys_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
1113
let cmake_dir = format!("{}/../../../", bitbox02_sys_dir);
1214
let outdir = std::env::var("OUT_DIR").unwrap();
1315

14-
// generate list of includes using CMake
1516
let cmake_builddir = format!("{}/_cmake_build_dir", outdir);
1617
std::fs::create_dir_all(&cmake_builddir).expect("failed to create a directory");
1718
let out = Command::new("cmake").arg(&cmake_dir).current_dir(&cmake_builddir).output().unwrap();
18-
assert!(out.status.success());
19+
if out.status.success() == false {
20+
println!("{}", std::str::from_utf8(&out.stdout).unwrap());
21+
println!("{}", std::str::from_utf8(&out.stderr).unwrap());
22+
panic!()
23+
}
1924
let out = Command::new("make").arg("rust-bindgen-includes").current_dir(&cmake_builddir).output().unwrap();
20-
println!("{}", std::str::from_utf8(&out.stdout).unwrap());
21-
println!("{}", std::str::from_utf8(&out.stderr).unwrap());
22-
assert!(out.status.success());
25+
if out.status.success() == false {
26+
println!("{}", std::str::from_utf8(&out.stdout).unwrap());
27+
println!("{}", std::str::from_utf8(&out.stderr).unwrap());
28+
panic!()
29+
}
2330
let mut includes_file = File::open(format!("{}/src/rust-bindgen.flags", cmake_builddir)).unwrap();
2431
let mut includes = String::new();
2532
includes_file.read_to_string(&mut includes).unwrap();
@@ -41,4 +48,62 @@ fn main() {
4148
outdir
4249
};
4350
println!("cargo:rustc-env=BINDINGS={}/bindings.rs", path_to_bindings);
51+
52+
// If we are testing we have to build a special library called "bitbox_merged" that contain
53+
// both all C code and rust code. So that rust -> c -> rust interop works.
54+
#[cfg(feature = "testing")]
55+
{
56+
use std::path::PathBuf;
57+
58+
let cmake_builddir = if let Ok(cmake_builddir) = std::env::var("CMAKE_BINARY_DIR") {
59+
println!(
60+
"cargo:rerun-if-changed={}/lib/libbitbox_merged.a",
61+
cmake_builddir
62+
);
63+
String::from(cmake_builddir)
64+
} else {
65+
let bitbox02_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
66+
let cmake_dir = format!("{}/../../../", bitbox02_dir);
67+
let outdir = std::env::var("OUT_DIR").unwrap();
68+
let cmake_builddir = format!("{}/_cmake_build_dir_docker", outdir);
69+
let docker_exec = format!("../../../scripts/docker_exec.sh");
70+
std::fs::create_dir_all(&cmake_builddir).expect("failed to create a directory");
71+
// paths are relative to _inside_ docker container
72+
let cmake_dir_pathbuf = String::from(PathBuf::from(cmake_dir).canonicalize().unwrap().to_str().unwrap());
73+
let outdir_in_docker = outdir.strip_prefix(&cmake_dir_pathbuf).unwrap().strip_prefix('/').unwrap();
74+
let cmake_builddir_in_docker = format!("{}/_cmake_build_dir_docker", outdir_in_docker);
75+
println!("{}", cmake_builddir_in_docker);
76+
//let chdir_and_run = format!("mkdir -p {} && cd {} && cmake ../../../../../../../../ -DCOVERAGE=ON -DSANITIZE_ADDRESS=ON -DSANITIZE_UNDEFINED=ON", cmake_builddir_in_docker, cmake_builddir_in_docker);
77+
let chdir_and_run = format!("mkdir -p {} && cd {} && cmake ../../../../../../../../", cmake_builddir_in_docker, cmake_builddir_in_docker);
78+
let out = Command::new(&docker_exec).arg(&chdir_and_run).output().unwrap();
79+
if out.status.success() == false {
80+
println!("{}", std::str::from_utf8(&out.stdout).unwrap());
81+
println!("{}", std::str::from_utf8(&out.stderr).unwrap());
82+
panic!()
83+
}
84+
let chdir_and_run = format!("make -C {} bitbox_merged", cmake_builddir_in_docker);
85+
let out = Command::new(&docker_exec).arg(&chdir_and_run).output().unwrap();
86+
if out.status.success() == false {
87+
println!("{}", std::str::from_utf8(&out.stdout).unwrap());
88+
println!("{}", std::str::from_utf8(&out.stderr).unwrap());
89+
panic!()
90+
}
91+
cmake_builddir
92+
};
93+
println!("cargo:rustc-link-search={}/lib", cmake_builddir);
94+
// c and rust code merged :O
95+
println!("cargo:rustc-link-lib=bitbox_merged");
96+
97+
// external libs
98+
println!("cargo:rustc-link-lib=wallycore");
99+
println!("cargo:rustc-link-lib=secp256k1");
100+
println!("cargo:rustc-link-lib=base32");
101+
println!("cargo:rustc-link-lib=ctaes");
102+
println!("cargo:rustc-link-lib=fatfs");
103+
println!("cargo:rustc-link-lib=sd-mock");
104+
105+
// system libs
106+
println!("cargo:rustc-link-lib=cmocka");
107+
}
108+
44109
}

src/rust/bitbox02/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ lazy_static = { version = "1.4.0", optional = true }
2828

2929
[features]
3030
# Only to be enabled in unit tests.
31-
testing = ["lazy_static"]
31+
testing = ["lazy_static", "bitbox02-sys/testing"]
3232

3333
app-ethereum = []
3434
app-bitcoin = []

src/rust/bitbox02/build.rs

-26
This file was deleted.

0 commit comments

Comments
 (0)