use std::{env, path::Path};
const COMPILE: &str = "cfoxtk";
const CAPI: &str = "src/foxtk.cpp";
#[cfg(target_os = "linux")]
fn compile() -> Vec<String> {
let library = "fox";
println!("cargo:rust-link-lib=dylib={library}");
let mut includes = Vec::new();
match pkg_config::probe_library(library) {
Ok(lib) => {
for dir in lib.include_paths {
includes.push(format!("-I{}", dir.display()));
}
}
Err(e) => panic!("Failed to find {library}: {e}"),
}
cc::Build::new()
.cpp(true)
.file(CAPI)
.flags(&includes)
.compile(COMPILE);
println!("cargo:rerun-if-changed={CAPI}");
includes
}
#[cfg(target_os = "windows")]
fn compile() -> Vec<String> {
const DIST: &str = "fox-snapshot";
let url = format!("http://fox-toolkit.org/ftp/{DIST}.zip");
let out = env::var("OUT_DIR").unwrap();
let zip = Path::new(&out).join(format!("{DIST}.zip"));
let extract_dir = Path::new(&out).join(DIST);
if !extract_dir.exists() {
let response = reqwest::blocking::get(url).expect("Failed to download fox zip");
std::fs::write(&zip, response.bytes().expect("Failed to read response"))
.expect("Failed to write zip");
zip_extract::extract(
std::fs::File::open(zip).expect("Failed to open zip"),
&extract_dir,
true,
)
.expect("Failed to extract zip");
}
cmake::Config::new("src")
.env("FOX_PATH", extract_dir)
.generator("Ninja")
.build_target("all")
.always_configure(true)
.build();
println!("cargo:rustc-link-search=native={}/build", out);
println!("cargo:rustc-link-lib=static={COMPILE}");
println!("cargo:rerun-if-env-changed={CAPI}");
Vec::new()
}
fn main() {
bindgen::Builder::default()
.header("src/foxtk.h")
.clang_args(compile())
.generate()
.expect("Unable to generate bindings")
.write_to_file(Path::new(&env::var("OUT_DIR").unwrap()).join("bindings.rs"))
.expect("Couldn't write bindings!");
}