diff --git a/native/src/base/gen.rs b/native/src/base/gen.rs index 5456c46e5..0b4d2c20b 100644 --- a/native/src/base/gen.rs +++ b/native/src/base/gen.rs @@ -3,7 +3,8 @@ use std::fmt::Display; use std::fs::File; use std::io::Write; -use std::process; +use std::path::Path; +use std::{fs, io, process}; use cxx_gen::Opt; @@ -23,16 +24,22 @@ impl ResultExt for Result { } } +fn write_if_diff>(path: P, bytes: &[u8]) -> io::Result<()> { + let path = path.as_ref(); + if let Ok(orig) = fs::read(path) { + // Do not modify the file if content is the same to make incremental build more optimal + if orig.as_slice() == bytes { + return Ok(()); + } + } + let mut f = File::create(path)?; + f.write_all(bytes) +} + pub fn gen_cxx_binding(name: &str) { println!("cargo:rerun-if-changed=lib.rs"); let opt = Opt::default(); let gen = cxx_gen::generate_header_and_cc_with_path("lib.rs", &opt); - { - let mut cpp = File::create(format!("{}.cpp", name)).unwrap(); - cpp.write_all(gen.implementation.as_slice()).ok_or_exit(); - } - { - let mut hpp = File::create(format!("{}.hpp", name)).unwrap(); - hpp.write_all(gen.header.as_slice()).ok_or_exit(); - } + write_if_diff(format!("{}.cpp", name), gen.implementation.as_slice()).ok_or_exit(); + write_if_diff(format!("{}.hpp", name), gen.header.as_slice()).ok_or_exit(); }