@@ -7,19 +7,26 @@ fn main() {
7
7
// if we are being invoked from CMAKE, the bindings are here:
8
8
format ! ( "{}/rust" , cmake_dir)
9
9
} else {
10
+ // generate list of includes using CMake
11
+
10
12
let bitbox02_sys_dir = std:: env:: var ( "CARGO_MANIFEST_DIR" ) . unwrap ( ) ;
11
13
let cmake_dir = format ! ( "{}/../../../" , bitbox02_sys_dir) ;
12
14
let outdir = std:: env:: var ( "OUT_DIR" ) . unwrap ( ) ;
13
15
14
- // generate list of includes using CMake
15
16
let cmake_builddir = format ! ( "{}/_cmake_build_dir" , outdir) ;
16
17
std:: fs:: create_dir_all ( & cmake_builddir) . expect ( "failed to create a directory" ) ;
17
18
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
+ }
19
24
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
+ }
23
30
let mut includes_file = File :: open ( format ! ( "{}/src/rust-bindgen.flags" , cmake_builddir) ) . unwrap ( ) ;
24
31
let mut includes = String :: new ( ) ;
25
32
includes_file. read_to_string ( & mut includes) . unwrap ( ) ;
@@ -41,4 +48,62 @@ fn main() {
41
48
outdir
42
49
} ;
43
50
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
+
44
109
}
0 commit comments