2019-02-01 18:52:22 -06:00
|
|
|
extern crate cbindgen;
|
|
|
|
|
2019-03-06 10:39:34 +01:00
|
|
|
use cbindgen::{Builder, Language};
|
2019-03-06 10:58:40 +01:00
|
|
|
use std::{env, fs, path::PathBuf};
|
2019-02-01 18:52:22 -06:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
|
2019-03-06 10:58:40 +01:00
|
|
|
let mut crate_wasmer_header_file = PathBuf::from(&crate_dir);
|
|
|
|
crate_wasmer_header_file.push("wasmer");
|
2019-03-06 10:39:34 +01:00
|
|
|
|
2019-03-05 15:52:18 +01:00
|
|
|
let out_dir = env::var("OUT_DIR").unwrap();
|
2019-03-06 10:58:40 +01:00
|
|
|
let mut out_wasmer_header_file = PathBuf::from(&out_dir);
|
|
|
|
out_wasmer_header_file.push("wasmer");
|
2019-02-01 18:52:22 -06:00
|
|
|
|
2019-12-13 13:04:54 -08:00
|
|
|
let mut pre_header = r#"
|
2019-11-13 15:28:04 +01:00
|
|
|
#if !defined(WASMER_H_MACROS)
|
2019-11-14 14:37:06 +01:00
|
|
|
#define WASMER_H_MACROS
|
|
|
|
|
|
|
|
#if defined(MSVC)
|
|
|
|
#if defined(_M_AMD64)
|
|
|
|
#define ARCH_X86_64
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2019-11-20 13:27:18 +01:00
|
|
|
#if defined(GCC) || defined(__GNUC__) || defined(__clang__)
|
2019-11-14 14:37:06 +01:00
|
|
|
#if defined(__x86_64__)
|
|
|
|
#define ARCH_X86_64
|
|
|
|
#endif
|
2019-11-11 14:45:14 -08:00
|
|
|
#endif
|
2019-11-14 14:37:06 +01:00
|
|
|
|
2019-12-13 13:04:54 -08:00
|
|
|
"#
|
|
|
|
.to_string();
|
|
|
|
|
2019-12-17 16:25:26 -05:00
|
|
|
#[cfg(feature = "wasi")]
|
|
|
|
{
|
|
|
|
pre_header += "#define WASMER_WASI_ENABLED\n";
|
|
|
|
}
|
|
|
|
|
2019-12-13 13:04:54 -08:00
|
|
|
#[cfg(feature = "emscripten")]
|
|
|
|
{
|
|
|
|
pre_header += "#define WASMER_EMSCRIPTEN_ENABLED\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
// close pre header
|
|
|
|
pre_header += "#endif // WASMER_H_MACROS\n";
|
|
|
|
|
2019-03-06 10:58:40 +01:00
|
|
|
// Generate the C bindings in the `OUT_DIR`.
|
|
|
|
out_wasmer_header_file.set_extension("h");
|
2019-03-06 10:39:34 +01:00
|
|
|
Builder::new()
|
2019-02-04 19:54:12 -06:00
|
|
|
.with_crate(crate_dir.clone())
|
2019-02-01 22:10:36 -06:00
|
|
|
.with_language(Language::C)
|
2019-02-09 18:07:05 -06:00
|
|
|
.with_include_guard("WASMER_H")
|
2019-12-13 13:04:54 -08:00
|
|
|
.with_header(&pre_header)
|
2019-11-11 14:45:14 -08:00
|
|
|
.with_define("target_family", "windows", "_WIN32")
|
|
|
|
.with_define("target_arch", "x86_64", "ARCH_X86_64")
|
2019-12-17 16:25:26 -05:00
|
|
|
.with_define("feature", "wasi", "WASMER_WASI_ENABLED")
|
2019-12-13 13:04:54 -08:00
|
|
|
.with_define("feature", "emscripten", "WASMER_EMSCRIPTEN_ENABLED")
|
2019-02-01 18:52:22 -06:00
|
|
|
.generate()
|
2019-02-04 19:54:12 -06:00
|
|
|
.expect("Unable to generate C bindings")
|
2019-03-06 10:58:40 +01:00
|
|
|
.write_to_file(out_wasmer_header_file.as_path());
|
2019-02-04 19:54:12 -06:00
|
|
|
|
2019-03-06 10:58:40 +01:00
|
|
|
// Generate the C++ bindings in the `OUT_DIR`.
|
|
|
|
out_wasmer_header_file.set_extension("hh");
|
2019-03-06 10:39:34 +01:00
|
|
|
Builder::new()
|
2019-02-04 19:54:12 -06:00
|
|
|
.with_crate(crate_dir)
|
|
|
|
.with_language(Language::Cxx)
|
2019-02-09 18:07:05 -06:00
|
|
|
.with_include_guard("WASMER_H")
|
2019-12-13 13:04:54 -08:00
|
|
|
.with_header(&pre_header)
|
2019-11-11 14:45:14 -08:00
|
|
|
.with_define("target_family", "windows", "_WIN32")
|
|
|
|
.with_define("target_arch", "x86_64", "ARCH_X86_64")
|
2019-12-17 16:25:26 -05:00
|
|
|
.with_define("feature", "wasi", "WASMER_WASI_ENABLED")
|
2019-12-13 13:04:54 -08:00
|
|
|
.with_define("feature", "emscripten", "WASMER_EMSCRIPTEN_ENABLED")
|
2019-02-04 19:54:12 -06:00
|
|
|
.generate()
|
|
|
|
.expect("Unable to generate C++ bindings")
|
2019-03-06 10:58:40 +01:00
|
|
|
.write_to_file(out_wasmer_header_file.as_path());
|
|
|
|
|
|
|
|
// Copy the generated C bindings from `OUT_DIR` to
|
|
|
|
// `CARGO_MANIFEST_DIR`.
|
|
|
|
crate_wasmer_header_file.set_extension("h");
|
|
|
|
out_wasmer_header_file.set_extension("h");
|
|
|
|
fs::copy(
|
|
|
|
out_wasmer_header_file.as_path(),
|
|
|
|
crate_wasmer_header_file.as_path(),
|
|
|
|
)
|
|
|
|
.expect("Unable to copy the generated C bindings");
|
|
|
|
|
|
|
|
// Copy the generated C++ bindings from `OUT_DIR` to
|
|
|
|
// `CARGO_MANIFEST_DIR`.
|
|
|
|
crate_wasmer_header_file.set_extension("h");
|
|
|
|
crate_wasmer_header_file.set_extension("hh");
|
|
|
|
out_wasmer_header_file.set_extension("hh");
|
|
|
|
fs::copy(out_wasmer_header_file, crate_wasmer_header_file)
|
|
|
|
.expect("Unable to copy the generated C++ bindings");
|
2019-02-01 18:52:22 -06:00
|
|
|
}
|