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
use std::path::{Path, PathBuf};
fn main() {
bindgen();
}
fn get_header() -> PathBuf {
#[cfg(feature = "515-1609")]
return Path::new(&std::env::var("CARGO_MANIFEST_DIR").unwrap())
.join("headers")
.join("515-1609")
.join("byondapi.h");
}
fn copy_wrapper(lib_dir: &Path) -> PathBuf {
let wrapper_path = lib_dir.join("wrapper.hpp");
std::fs::copy(
Path::new(&std::env::var("CARGO_MANIFEST_DIR").unwrap())
.join("src")
.join("wrapper.hpp"),
&wrapper_path,
)
.expect("Failed to copy wrapper.hpp to byondapi");
wrapper_path
}
fn bindgen() {
let out_dir = PathBuf::from(std::env::var("OUT_DIR").expect("OUT_DIR not defined"));
let vendored_header = get_header();
std::fs::copy(&vendored_header, out_dir.join("byondapi.h"))
.expect("Failed to copy header to OUT_DIR");
let wrapper = copy_wrapper(&out_dir);
// Make byondapi-c interface header a dependency of the build
println!(
"cargo:rerun-if-changed={}",
vendored_header.to_string_lossy()
);
let builder = bindgen::Builder::default()
.header(wrapper.to_string_lossy())
.dynamic_library_name("ByondApi")
.dynamic_link_require_all(true)
// Also make headers included by main header dependencies of the build
.parse_callbacks(Box::new(bindgen::CargoCallbacks));
// TODO: Enable C++ conversion when bindgen supports CUnwind correctly
// let rust_version = rustc_version::version().unwrap();
// if rust_version.major > 1 || (rust_version.major == 1 && rust_version.minor > 72) {
// builder = builder
// // Tweaks
// .override_abi(bindgen::Abi::CUnwind, "Byond_GetVar")
// .override_abi(bindgen::Abi::CUnwind, "Byond_SetVar")
// .override_abi(bindgen::Abi::CUnwind, "Byond_GetVarByStrId")
// .override_abi(bindgen::Abi::CUnwind, "Byond_SetVarByStrId")
// .override_abi(bindgen::Abi::CUnwind, "Byond_CreateList")
// .override_abi(bindgen::Abi::CUnwind, "Byond_GetList")
// .override_abi(bindgen::Abi::CUnwind, "Byond_SetList")
// .override_abi(bindgen::Abi::CUnwind, "Byond_ReadPointer")
// .override_abi(bindgen::Abi::CUnwind, "Byond_WritePointer")
// .override_abi(bindgen::Abi::CUnwind, "Byond_CallProc")
// .override_abi(bindgen::Abi::CUnwind, "Byond_CallProcByStrId");
// }
builder
.generate()
.expect("Unable to generate bindings")
.write_to_file(out_dir.join("bindings.rs"))
.expect("Couldn't write bindings!");
}