diff --git a/src/lipo.rs b/src/lipo.rs index caf41b5..54a4277 100644 --- a/src/lipo.rs +++ b/src/lipo.rs @@ -2,9 +2,28 @@ use crate::Result; use crate::cargo::Cargo; use crate::meta::Meta; use failure::ResultExt; -use log::info; +use log::{info, warn}; use std::fs; use std::process::Command; +use std::path::Path; + +fn should_update_output( + output: impl AsRef, + inputs: impl IntoIterator>, +) -> std::io::Result { + let output_metadata = match fs::metadata(output) { + Ok(metadata) => metadata, + Err(_) => return Ok(true), + }; + let output_mtime = output_metadata.modified()?; + for input in inputs { + let input_mtime = fs::metadata(input)?.modified()?; + if input_mtime > output_mtime { + return Ok(true); + } + } + Ok(false) +} pub(crate) fn build(cargo: &Cargo, meta: &Meta, targets: &[impl AsRef]) -> Result<()> { for package in meta.packages() { @@ -37,6 +56,23 @@ pub(crate) fn build(cargo: &Cargo, meta: &Meta, targets: &[impl AsRef]) -> output.push(&lib_name); + match should_update_output(&output, &inputs) { + Ok(true) => {} + Ok(false) => { + info!( + "Universal library is up-to-date, skipping lipo invocation for {}", + package.name() + ); + continue; + } + Err(e) => { + warn!( + "Failed to check if universal library for {:?} is up-to-date: {}", + package.name(), + e + ) + } + } let mut cmd = Command::new("lipo"); cmd.arg("-create").arg("-output").arg(output); cmd.args(inputs);