use std::process::Command;
fn main() {
println!("cargo:rerun-if-env-changed=DOCS_RS");
if std::env::var_os("DOCS_RS").is_some() {
return;
}
println!("cargo:rerun-if-env-changed=GOATD_CXX");
let mut build = cc::Build::new();
if let Some(cxx) = find_cxx() {
assert!(
have(&cxx),
"goatd's vendored FlowCutter needs a C++20 compiler, and `{cxx}` does not run — \
install one (gcc 12 or newer, or a recent clang), or name another in GOATD_CXX."
);
build.compiler(&cxx);
}
build
.cpp(true)
.std("c++20")
.opt_level(3)
.define("NDEBUG", None)
.warnings(false)
.include("vendor/treedecomp")
.include("vendor/treedecomp/upstream")
.include("vendor/treedecomp/upstream/flow-cutter-pace17/src")
.file("vendor/treedecomp/ffi.cpp")
.file("vendor/treedecomp/heap_selftest.cpp")
.file("vendor/treedecomp/upstream/IFlowCutter.cpp")
.file("vendor/treedecomp/upstream/TreeDecomposition.cpp")
.file("vendor/treedecomp/upstream/graph.cpp")
.file("vendor/treedecomp/upstream/flow-cutter-pace17/src/cell.cpp")
.file("vendor/treedecomp/upstream/flow-cutter-pace17/src/greedy_order.cpp")
.file("vendor/treedecomp/upstream/flow-cutter-pace17/src/tree_decomposition.cpp")
.compile("treedecomp");
println!("cargo:rerun-if-changed=vendor/treedecomp/");
}
fn find_cxx() -> Option<String> {
if let Ok(cxx) = std::env::var("GOATD_CXX")
&& !cxx.is_empty()
{
return Some(cxx);
}
if std::env::var("CARGO_CFG_TARGET_OS").as_deref() != Ok("linux") {
return None;
}
for v in ["14", "13", "12"] {
let candidate = format!("g++-{v}");
if have(&candidate) {
return Some(candidate);
}
}
Some("g++".into())
}
fn have(tool: &str) -> bool {
Command::new(tool)
.arg("--version")
.stdout(std::process::Stdio::null())
.stderr(std::process::Stdio::null())
.status()
.map(|s| s.success())
.unwrap_or(false)
}