-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbuild.rs
98 lines (83 loc) · 3.12 KB
/
build.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use flapigen::{JavaConfig, JavaReachabilityFence, LanguageConfig};
use std::{
env, fs,
path::{Path, PathBuf},
};
fn main() {
env_logger::init();
let out_dir = env::var("OUT_DIR").unwrap();
let jni_c_headers_rs = Path::new(&out_dir).join("jni_c_header.rs");
gen_jni_bindings(&jni_c_headers_rs);
let have_java_9 = fs::read_to_string(&jni_c_headers_rs)
.unwrap()
.contains("JNI_VERSION_9");
let java_cfg = JavaConfig::new(
Path::new("fluvio")
.join("src")
.join("main")
.join("java")
.join("com")
.join("infinyon")
.join("fluvio"),
"com.infinyon.fluvio".into(),
)
//.use_optional_package("com.hadisatrio.optional".into())
.use_reachability_fence(if have_java_9 {
JavaReachabilityFence::Std
} else {
JavaReachabilityFence::GenerateFence(8)
});
//.use_null_annotation_from_package("android.support.annotation".into())
let in_src = Path::new("src").join("java_glue.rs.in");
let out_dir = env::var("OUT_DIR").unwrap();
let out_src = Path::new(&out_dir).join("java_glue.rs");
let flap_gen =
flapigen::Generator::new(LanguageConfig::JavaConfig(java_cfg)).rustfmt_bindings(true);
flap_gen.expand("java bindings", &in_src, out_src);
println!("cargo:rerun-if-changed={}", in_src.display());
}
fn gen_jni_bindings(jni_c_headers_rs: &Path) {
let java_home = env::var("JAVA_HOME").expect("JAVA_HOME env variable not settted");
let java_include_dir = Path::new(&java_home).join("include");
let target = env::var("TARGET").expect("target env var not setted");
let java_sys_include_dir = java_include_dir.join(if target.contains("windows") {
"win32"
} else if target.contains("darwin") {
"darwin"
} else {
"linux"
});
let include_dirs = [java_include_dir, java_sys_include_dir];
println!("jni include dirs {:?}", include_dirs);
let jni_h_path =
search_file_in_directory(&include_dirs[..], "jni.h").expect("Can not find jni.h");
println!("cargo:rerun-if-changed={}", jni_h_path.display());
gen_binding(&include_dirs[..], &jni_h_path, jni_c_headers_rs).expect("gen_binding failed");
}
fn search_file_in_directory<P: AsRef<Path>>(dirs: &[P], file: &str) -> Result<PathBuf, ()> {
for dir in dirs {
let dir = dir.as_ref().to_path_buf();
let file_path = dir.join(file);
if file_path.exists() && file_path.is_file() {
return Ok(file_path);
}
}
Err(())
}
fn gen_binding<P: AsRef<Path>>(
include_dirs: &[P],
c_file_path: &Path,
output_rust: &Path,
) -> Result<(), String> {
let mut bindings: bindgen::Builder = bindgen::builder().header(c_file_path.to_str().unwrap());
bindings = include_dirs.iter().fold(bindings, |acc, x| {
acc.clang_arg("-I".to_string() + x.as_ref().to_str().unwrap())
});
let generated_bindings = bindings
.generate()
.map_err(|_| "Failed to generate bindings".to_string())?;
generated_bindings
.write_to_file(output_rust)
.map_err(|err| err.to_string())?;
Ok(())
}