use std::{path::PathBuf, process::Command};
fn main() {
let lean_output = Command::new("lean")
.args(["--print-prefix"])
.output()
.expect("Failed to execute lean");
if !lean_output.status.success() {
panic!(
"Command \"lean --print-prefix\" exited unsuccessfully: error {}",
lean_output.status
);
}
let mut lean_dir = PathBuf::from(String::from_utf8(lean_output.stdout)
.expect("Path returned by \"lean --print-prefix\" is invalid UTF-8; this is currently not supported")
.trim());
if cfg!(target_os = "windows") {
lean_dir.push("bin")
} else {
lean_dir.push("lib/lean")
}
let mut shared_lib = lean_dir.clone();
let exists = if cfg!(target_os = "windows") {
shared_lib.push("libleanshared.dll");
shared_lib.exists()
} else if cfg!(target_os = "mac") {
shared_lib.push("libleanshared.dylib");
shared_lib.exists()
} else if cfg!(unix) {
shared_lib.push("libleanshared.so");
shared_lib.exists()
} else {
true
};
if !exists {
panic!(
"{} was not found. We errored, as this would probably cause a linking failure later",
shared_lib.display()
);
}
println!("cargo:rustc-link-search={}", lean_dir.display());
println!("cargo:rustc-link-lib=leanshared");
println!("cargo:rustc-link-arg=-Wl,-rpath,{}", lean_dir.display());
let bindings = bindgen::Builder::default()
.header("lean.h")
.use_core()
.wrap_static_fns(true)
.wrap_static_fns_path("wrap_static_fns.c")
.wrap_static_fns_suffix("_rs_extern")
.generate()
.expect("Unable to generate bindings");
cc::Build::new()
.file("wrap_static_fns.c")
.compile("wrap_static_fns");
bindings
.write_to_file("src/bindings.rs")
.expect("Couldn't write bindings!");
}