fn main() {
println!("cargo::rerun-if-changed=contrib/fuse_t/shim.c");
println!("cargo::rerun-if-changed=contrib/fuse_t/shim.h");
pin_server();
if std::env::var_os("CARGO_FEATURE_MOUNT").is_none() {
return;
}
match std::env::var("CARGO_CFG_TARGET_OS").as_deref() {
Ok("macos") => fuse_t_shim(),
Ok("windows") => delay_load_dokan(),
_ => {}
}
}
fn pin_server() {
const ENV: &str = "VIRTX_UVM_PINNED_VERSION";
println!("cargo::rerun-if-env-changed={ENV}");
if std::env::var_os(ENV).is_some() {
return;
}
let file = std::path::Path::new(&std::env::var_os("CARGO_MANIFEST_DIR").unwrap())
.join("virtx-uvm.version");
let Ok(version) = std::fs::read_to_string(&file) else {
return;
};
println!("cargo::rerun-if-changed={}", file.display());
let version = version.trim();
if !version.is_empty() {
println!("cargo::rustc-env={ENV}={version}");
}
}
fn fuse_t_shim() {
let mut build = cc::Build::new();
build
.file("contrib/fuse_t/shim.c")
.include("contrib/fuse_t")
.define("_FILE_OFFSET_BITS", "64")
.warnings(true);
let libdir = pkg_config::Config::new()
.cargo_metadata(false)
.env_metadata(false)
.probe("fuse-t")
.ok()
.and_then(|fuse_t| fuse_t.link_paths.first().cloned());
if let Some(dir) = libdir {
build.define(
"VIRTX_FUSE_T_LIBDIR",
format!("\"{}\"", dir.display()).as_str(),
);
}
println!("cargo::rerun-if-changed=contrib/fuse_t/fuse_t.h");
build.compile("virtx_fuse_t_shim");
}
fn delay_load_dokan() {
if std::env::var("CARGO_CFG_TARGET_ENV").as_deref() == Ok("msvc") {
println!("cargo::rustc-link-arg=/DELAYLOAD:dokan2.dll");
println!("cargo::rustc-link-lib=delayimp");
}
}