From b3ddab3bce8b22e698a3998a2dd12759d61758ce Mon Sep 17 00:00:00 2001 From: Romain Malmain Date: Thu, 14 Mar 2024 18:25:19 +0100 Subject: [PATCH] fix libafl_qemu_sys unnecessarily rebuilding. (#1938) --- libafl_qemu/libafl_qemu_build/src/bindings.rs | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/libafl_qemu/libafl_qemu_build/src/bindings.rs b/libafl_qemu/libafl_qemu_build/src/bindings.rs index b4aac972ad..23904d46f6 100644 --- a/libafl_qemu/libafl_qemu_build/src/bindings.rs +++ b/libafl_qemu/libafl_qemu_build/src/bindings.rs @@ -1,4 +1,4 @@ -use std::{fs, path::Path}; +use std::{collections::hash_map, fs, hash::Hasher, io::Read, path::Path}; use bindgen::{BindgenError, Bindings}; @@ -88,7 +88,31 @@ pub fn generate( clang_args: Vec, ) -> Result { let wrapper_h = build_dir.join("wrapper.h"); - fs::write(&wrapper_h, WRAPPER_HEADER).expect("Unable to write wrapper.h"); + let existing_wrapper_h = fs::File::open(&wrapper_h); + let mut must_rewrite_wrapper = true; + + // Check if equivalent wrapper file already exists without relying on filesystem timestamp. + if let Ok(mut wrapper_file) = existing_wrapper_h { + let mut existing_wrapper_content = Vec::with_capacity(WRAPPER_HEADER.len()); + wrapper_file + .read_to_end(existing_wrapper_content.as_mut()) + .unwrap(); + + let mut existing_wrapper_hasher = hash_map::DefaultHasher::new(); + existing_wrapper_hasher.write(existing_wrapper_content.as_ref()); + + let mut wrapper_h_hasher = hash_map::DefaultHasher::new(); + wrapper_h_hasher.write(WRAPPER_HEADER.as_bytes()); + + // Check if wrappers are the same + if existing_wrapper_hasher.finish() == wrapper_h_hasher.finish() { + must_rewrite_wrapper = false; + } + } + + if must_rewrite_wrapper { + fs::write(&wrapper_h, WRAPPER_HEADER).expect("Unable to write wrapper.h"); + } let bindings = bindgen::Builder::default() .derive_debug(true)