use std::boxed::Box;
use std::env;
use std::error::Error;
use std::fs;
use std::path::PathBuf;
fn main() -> Result<(), Box<dyn Error>> {
compile_mimalloc();
let build_dir = get_build_dir()?;
println!(
"cargo:rerun-if-changed={}",
build_dir.join("mimalloc").display()
);
if env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("windows") {
println!("cargo:rustc-link-lib=advapi32");
}
Ok(())
}
fn compile_mimalloc() {
let mimalloc_vendor_dir = PathBuf::from("mimalloc");
let mut build = cc::Build::new();
let include_dir = mimalloc_vendor_dir.join("include");
let src_dir = mimalloc_vendor_dir.join("src");
let static_file = src_dir.join("static.c");
assert!(include_dir.exists(), "include_dir: {include_dir:?}");
assert!(src_dir.exists(), "src_dir: {src_dir:?}");
assert!(static_file.exists(), "static_file: {static_file:?}");
build.include(include_dir);
build.include(src_dir);
build.file(static_file);
if build.get_compiler().is_like_msvc() {
build.static_crt(true);
}
build.define("MI_DEBUG", "0");
build.cargo_debug(true);
build.cargo_warnings(false);
build.compile("mimalloc");
}
fn get_build_dir() -> Result<PathBuf, Box<dyn Error>> {
let manifest_dir = env::var("CARGO_MANIFEST_DIR")?;
let build_dir = PathBuf::from(manifest_dir.as_str());
let normalized_build_dir = fs::canonicalize(build_dir)?;
Ok(normalized_build_dir)
}