use std::io::prelude::*;
use std::process::Command;
fn build_cpp_usd(out_dir: &std::path::PathBuf) -> [std::path::PathBuf; 3] {
let mut script_dir = std::path::PathBuf::from(std::env::current_dir().unwrap());
script_dir.push("thirdparty");
script_dir.push("USD");
script_dir.push("build_scripts");
script_dir.push("build_usd.py");
let mut cpp_out_dir = std::path::PathBuf::new();
cpp_out_dir.push(&out_dir);
cpp_out_dir.push("install");
let mut lib_dir = cpp_out_dir.clone();
lib_dir.push("lib");
let mut include_dir = cpp_out_dir.clone();
include_dir.push("include");
println!("Downloading dependencies and building USD c++ library");
let result = Command::new("python")
.arg(script_dir)
.arg("--build-monolithic")
.arg("--no-tests")
.arg("--no-examples")
.arg("--no-tutorials")
.arg("--no-tools")
.arg("--no-docs")
.arg("--no-python")
.arg("--no-imaging")
.arg("--no-ptex")
.arg("--no-openvdb")
.arg("--no-usdview")
.arg("--no-embree")
.arg("--no-prman")
.arg("--no-openimageio")
.arg("--no-opencolorio")
.arg("--no-alembic")
.arg("--no-hdf5")
.arg("--no-draco")
.arg("--no-materialx")
.arg(cpp_out_dir)
.current_dir(out_dir)
.status()
.unwrap();
assert!(result.success());
let lib = std::path::PathBuf::from("usd_ms");
println!("cargo:rustc-link-lib={}", lib.to_str().unwrap());
println!("cargo:rustc-link-search={}", lib_dir.to_str().unwrap());
[include_dir, lib_dir, lib]
}
fn write_lib_info(out_dir: &std::path::PathBuf, info: [std::path::PathBuf; 3]) {
let mut locations_path = out_dir.clone();
locations_path.push("locations.rs");
write!(
std::fs::File::create(locations_path).unwrap(),
"\
pub const INCLUDE : &str = \"{}\"; \n\
pub const LIBS : &str = \"{}\"; \n\
pub const LIB : &str = \"{}\"; \n\
",
info[0].to_str().unwrap(),
info[1].to_str().unwrap(),
info[2].to_str().unwrap(),
);
}
fn write_stub_lib_info(out_dir: &std::path::PathBuf) {
let mut locations_path = out_dir.clone();
locations_path.push("locations.rs");
write!(
std::fs::File::create(locations_path).unwrap(),
"\
pub const INCLUDE : &str = \"\"; \n\
pub const LIBS : &str = \"\"; \n\
pub const LIB : &str = \"\"; \n\
");
}
fn main() {
let out_dir = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap());
let mut thirdparty_usd = std::path::PathBuf::from("thirdparty");
thirdparty_usd.push("USD");
println!(
"cargo:rerun-if-changed={}",
thirdparty_usd.to_str().unwrap()
);
if let Ok(_) = std::env::var("DOCS_RS") {
write_stub_lib_info(&out_dir);
} else {
write_lib_info(&out_dir, build_cpp_usd(&out_dir));
}
}