use super::{collect_from_prefix, run, BuildOutput, DepBuilder};
use crate::error::{BuildError, Result};
use std::path::Path;
use std::process::Command;
pub struct MakeBuilder;
impl DepBuilder for MakeBuilder {
fn detect(src_dir: &Path) -> bool {
src_dir.join("Makefile").exists() || src_dir.join("makefile").exists()
}
fn name(&self) -> &'static str {
"make"
}
fn build(&self, src_dir: &Path, prefix: &Path) -> Result<BuildOutput> {
let configure = src_dir.join("configure");
if configure.exists() {
run(Command::new("./configure")
.arg(format!("--prefix={}", prefix.display()))
.current_dir(src_dir))?;
}
run(Command::new("make").current_dir(src_dir))?;
let install_status = Command::new("make")
.arg(format!("PREFIX={}", prefix.display()))
.arg("install")
.current_dir(src_dir)
.status()
.map_err(BuildError::Io)?;
if !install_status.success() {
return Err(BuildError::Dependency {
name: src_dir.display().to_string(),
reason: "`make install PREFIX=...` did not work - this Makefile \
may not support PREFIX=. Set build_system = \"custom\" \
with explicit build_commands in smidr.toml"
.to_string(),
});
}
Ok(collect_from_prefix(prefix))
}
}