diff --git a/Earthfile b/Earthfile index 79c18901..4cb5cd72 100644 --- a/Earthfile +++ b/Earthfile @@ -29,14 +29,6 @@ WORKDIR /veilid deps-base: RUN apt-get -y update RUN apt-get install -y iproute2 curl build-essential cmake libssl-dev openssl file git pkg-config libdbus-1-dev libdbus-glib-1-dev libgirepository1.0-dev libcairo2-dev checkinstall unzip libncursesw5-dev libncurses5-dev - # Install a fixed version of capnproto - RUN curl -O https://capnproto.org/capnproto-c++-1.0.2.tar.gz; \ - tar zxf capnproto-c++-1.0.2.tar.gz; \ - cd capnproto-c++-1.0.2; \ - ./configure; \ - make -j6 check; \ - make install; \ - rm -rf capnproto-*; # Install Rust deps-rust: diff --git a/veilid-core/build.rs b/veilid-core/build.rs index b2d6ed9f..f14bc1cd 100644 --- a/veilid-core/build.rs +++ b/veilid-core/build.rs @@ -36,14 +36,30 @@ where P: AsRef, Q: AsRef, { - let Some(out_bh) = get_build_hash(output) else { + let (Some(out_bh), Some(out_capnp_hash)) = get_build_hash_and_capnp_version_hash(output) else { // output file not found or no build hash, we are outdated + println!("cargo:warning=Output file not found or no build hash."); return Ok(true); }; + // Check if capnp version hash has changed + let mut hasher = Sha256::new(); + hasher.update(get_capnp_version_string().as_bytes()); + let capnp_hash = hex::encode(hasher.finalize()).as_bytes().to_vec(); + let in_bh = make_build_hash(input); - Ok(out_bh != in_bh) + if out_bh != in_bh { + println!("cargo:warning=Build hash has changed."); + return Ok(true); + } + + if out_capnp_hash != capnp_hash { + println!("cargo:warning=Capnp version hash has changed."); + return Ok(true); + } + + Ok(false) } fn calculate_hash(lines: std::io::Lines>) -> Vec { @@ -58,15 +74,21 @@ fn calculate_hash(lines: std::io::Lines>) -> V out.to_vec() } -fn get_build_hash>(output_path: Q) -> Option> { - let lines = std::io::BufReader::new(std::fs::File::open(output_path).ok()?).lines(); +fn get_build_hash_and_capnp_version_hash>( + output_path: Q, +) -> (Option>, Option>) { + let lines = std::io::BufReader::new(std::fs::File::open(output_path).ok().unwrap()).lines(); + let mut build_hash = None; + let mut capnp_version_hash = None; for l in lines { let l = l.unwrap(); if let Some(rest) = l.strip_prefix("//BUILDHASH:") { - return Some(hex::decode(rest).unwrap()); + build_hash = Some(hex::decode(rest).unwrap()); + } else if let Some(rest) = l.strip_prefix("//CAPNPVERSIONHASH:") { + capnp_version_hash = Some(hex::decode(rest).unwrap()); } } - None + (build_hash, capnp_version_hash) } fn make_build_hash>(input_path: P) -> Vec { @@ -75,13 +97,26 @@ fn make_build_hash>(input_path: P) -> Vec { calculate_hash(lines) } -fn append_hash, Q: AsRef>(input_path: P, output_path: Q) { +fn append_hash_and_detected_capnp_version_hash, Q: AsRef>( + input_path: P, + output_path: Q, +) { let input_path = input_path.as_ref(); let output_path = output_path.as_ref(); let lines = std::io::BufReader::new(std::fs::File::open(input_path).unwrap()).lines(); let h = calculate_hash(lines); + let mut out_file = OpenOptions::new().append(true).open(output_path).unwrap(); writeln!(out_file, "\n//BUILDHASH:{}", hex::encode(h)).unwrap(); + + let mut hasher = Sha256::new(); + hasher.update(get_capnp_version_string().as_bytes()); + writeln!( + out_file, + "\n//CAPNPVERSIONHASH:{}", + hex::encode(hasher.finalize()) + ) + .unwrap(); } fn do_capnp_build() { @@ -122,7 +157,8 @@ fn do_capnp_build() { .expect("compiling schema"); // If successful, append a hash of the input to the output file - append_hash("proto/veilid.capnp", "proto/veilid_capnp.rs"); + // Also append a hash of the detected capnp version to the output file + append_hash_and_detected_capnp_version_hash("proto/veilid.capnp", "proto/veilid_capnp.rs"); } fn main() { @@ -133,13 +169,7 @@ fn main() { return; } - // Check if installed capnp version is different from the desired version - force rebuild then - if get_capnp_version_string() != get_desired_capnp_version_string() { - println!("cargo:warning=rebuilding proto/veilid_capnp.rs because desired capnp version is different from the installed version"); - do_capnp_build(); - } - // Check if the hash in the generated file is different from the hash of the input file - force rebuild then (This signifies there's been a change in the input) - else if is_input_file_outdated("./proto/veilid.capnp", "./proto/veilid_capnp.rs").unwrap() { + if is_input_file_outdated("./proto/veilid.capnp", "./proto/veilid_capnp.rs").unwrap() { println!("cargo:warning=rebuilding proto/veilid_capnp.rs because it has changed from the last generation of proto/veilid.capnp"); do_capnp_build(); } diff --git a/veilid-core/proto/veilid_capnp.rs b/veilid-core/proto/veilid_capnp.rs index cafea922..07d4f639 100644 --- a/veilid-core/proto/veilid_capnp.rs +++ b/veilid-core/proto/veilid_capnp.rs @@ -22243,3 +22243,5 @@ pub mod operation { } //BUILDHASH:a28970f74fcf7989d47e1457e848e5de33d8b7a4003a0e439c95f442ecf69fd3 + +//CAPNPVERSIONHASH:bfec2e34583ada7e6af2cb73993fb75a3f7147a6c943e5ff5f5c4294fc577b90