use errors::Result;
use file_utils::path_to_str;
use utils::{is_msvc, run_command};
use std::process::Command;
use std::path::PathBuf;
pub struct CMakeVar {
pub name: String,
pub value: String,
}
pub struct CppLibBuilder<'a> {
pub cmake_source_dir: &'a PathBuf,
pub build_dir: &'a PathBuf,
pub install_dir: &'a PathBuf,
pub num_jobs: i32,
pub pipe_output: bool,
pub cmake_vars: Vec<CMakeVar>,
}
impl<'a> CppLibBuilder<'a> {
pub fn run(self) -> Result<()> {
let mut cmake_command = Command::new("cmake");
cmake_command.arg(self.cmake_source_dir)
.arg(format!("-DCMAKE_INSTALL_PREFIX={}",
try!(path_to_str(&self.install_dir))))
.current_dir(self.build_dir);
if is_msvc() {
cmake_command.arg("-G").arg("NMake Makefiles");
cmake_command.arg("-DCMAKE_BUILD_TYPE=Release");
}
for var in self.cmake_vars {
cmake_command.arg(format!("-D{}={}", var.name, var.value));
}
try!(run_command(&mut cmake_command, false, self.pipe_output));
let make_command_name = if is_msvc() { "nmake" } else { "make" }.to_string();
let mut make_args = Vec::new();
if !is_msvc() {
make_args.push(format!("-j{}", self.num_jobs));
}
make_args.push("install".to_string());
let mut make_command = Command::new(make_command_name);
make_command.args(&make_args)
.current_dir(self.build_dir);
try!(run_command(&mut make_command, false, self.pipe_output));
Ok(())
}
}