use std::{env, fs, path::PathBuf, process::Command};
fn main() {
println!("cargo:rerun-if-changed=blocknet.c");
println!("cargo:rerun-if-changed=build.rs");
let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap_or_default();
if target_os == "windows" {
return;
}
let lib = if target_os == "macos" {
"blocknet.dylib"
} else {
"blocknet.so"
};
let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR"));
let built = out_dir.join(lib);
let cc = env::var("CC").unwrap_or_else(|_| "cc".to_string());
let status = Command::new(&cc)
.args([
"-shared", "-fPIC", "-O2", "-Wall", "-Wextra", "-Werror", "-o",
])
.arg(&built)
.arg("blocknet.c")
.status();
match status {
Ok(s) if s.success() => {}
Ok(s) => {
println!(
"cargo:warning=blocknet shim failed to build ({s}); --no-net will report itself unenforced on macOS or a Linux kernel without seccomp support (seccomp-capable Linux still enforces it)"
);
return;
}
Err(e) => {
println!(
"cargo:warning=could not run {cc} to build the blocknet shim ({e}); --no-net will report itself unenforced on macOS or a Linux kernel without seccomp support (seccomp-capable Linux still enforces it)"
);
return;
}
}
let profile = env::var("PROFILE").unwrap_or_default();
if let Some(exe_dir) = out_dir.ancestors().find(|a| {
a.file_name()
.map(|n| n == profile.as_str())
.unwrap_or(false)
}) && let Err(e) = fs::copy(&built, exe_dir.join(lib))
{
println!(
"cargo:warning=built the blocknet shim but could not place it beside the executable ({e})"
);
}
}