From a733a950a3ad85e873541fd4077775f9806c675a Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sun, 18 Aug 2024 13:40:49 -0600 Subject: [PATCH] Avoid requiring protoc unless protos change --- objdiff-cli/build.rs | 31 +++++++++++++++++------- objdiff-cli/protos/proto_descriptor.bin | Bin 0 -> 5977 bytes 2 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 objdiff-cli/protos/proto_descriptor.bin diff --git a/objdiff-cli/build.rs b/objdiff-cli/build.rs index 7b02675..3ba1c19 100644 --- a/objdiff-cli/build.rs +++ b/objdiff-cli/build.rs @@ -10,20 +10,33 @@ fn main() { println!("cargo:rustc-rerun-if-changed=.git/HEAD"); let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("protos"); + let descriptor_path = root.join("proto_descriptor.bin"); + println!("cargo:rerun-if-changed={}", descriptor_path.display()); + let descriptor_mtime = std::fs::metadata(&descriptor_path) + .map(|m| m.modified().unwrap()) + .unwrap_or(std::time::SystemTime::UNIX_EPOCH); + let mut run_protoc = false; let proto_files = vec![root.join("report.proto")]; - - // Tell cargo to recompile if any of these proto files are changed for proto_file in &proto_files { println!("cargo:rerun-if-changed={}", proto_file.display()); + let mtime = match std::fs::metadata(proto_file) { + Ok(m) => m.modified().unwrap(), + Err(e) => panic!("Failed to stat proto file {}: {:?}", proto_file.display(), e), + }; + if mtime > descriptor_mtime { + run_protoc = true; + } } - let descriptor_path = - PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("proto_descriptor.bin"); - - prost_build::Config::new() - .file_descriptor_set_path(&descriptor_path) - .compile_protos(&proto_files, &[root]) - .expect("Failed to compile protos"); + let mut config = prost_build::Config::new(); + config.file_descriptor_set_path(&descriptor_path); + // If our cached descriptor is up-to-date, we don't need to run protoc. + // This is helpful so that users don't need to have protoc installed + // unless they're updating the protos. + if !run_protoc { + config.skip_protoc_run(); + } + config.compile_protos(&proto_files, &[root]).expect("Failed to compile protos"); let descriptor_set = std::fs::read(descriptor_path).expect("Failed to read descriptor set"); pbjson_build::Builder::new() diff --git a/objdiff-cli/protos/proto_descriptor.bin b/objdiff-cli/protos/proto_descriptor.bin new file mode 100644 index 0000000000000000000000000000000000000000..1c1f0228ddc22edbaf20a3a9f00824ca0134c844 GIT binary patch literal 5977 zcmdS9lk-zjC72W#HCTc;!6MH2 zDXBt=Ts&ZdQd1xbn86CTp<-Yq23#UgE?5cNN*1t{LQpx7QVcs&5=#;#Siwd@>~u*i zNkq02tbh%y0A?px36h;4C2%|0QS1aMh1sdj#SivXd|GKUagqjZ{5Igofs2mIOf*Ds5ol;zEcD330LHCFZ7rHX4J@YaU|#G7UZOsq)LFIkHdo@ z2rkmW$S9=3#hsgj6pDg4n{^NK`#DyxE`=sPF!3Z@lY*FNnAY6 z8Hsu6sl}do1*IiIT3jq?MfthlOu%g+F(KAgzmr)E}Hl$tuLm1$QJXmvZT%-nEC zvay1AFh{a63NdrT9m&Ql#LNwMB)bqZ50fm^{p_qD9?Uj&Mj>V%PFN_jGYc{ENXtO| z#v#Pa%Onrg#=#2W!L)HO3NiC?!a|vYS%{feRt~C-Q;3<5Ngb+FVa%r6E@GhEC<%=~f+;3UW> z#3IC?07-(3j6%#p9715j89_-wWCQuR-VS;#tkqKnJ2sGs~GBGj>F^fP`E+Z3@5VI&WQ7|%rlAtKuHc%22 zg(eC{CMISfW>ILOU<7f*poxN!36uoI;Mzb*Pz;(V7@3%vg_y;liGq=dMTl7(ZW|~G zio>;mlAt);Hc%22hug*~#4G`~4U_~W;Mzb*Py%inC<#iyZDSK+mV~AyMkY`al!R*o zB|%AOT4H1ZB|%AOT4H2k7h;xzrX@xuP!g1aYXc=gDQH?^WCA5YDQH?^Wa1EFmWJEL z!2;qz5(Og@C_zed^F!kelpv)AAnBNq36vnE;dXNhG0QM1LlttefOs%NK*>{vTM#D4 zD8wuy1j#6jOrYc`qo4#$3S2_Wve4wo$OKBBvP>{TxLAdlW#NW^lBcW?BzZD2fs&`J z9Hg{hWa1WLmSa+Z+Q!WS;=v5zW)otTgQjstCT>O{W;roAm`Y|LW;sP=s7rW+nB|#N zp;A07ARf#R9yTFndAK1wj6%%vVvr2X$i%}e#4N9*0?sH*LM%!Q8jy?vN|8#?jKT!U zD9X@`!UWDJ%FuXX0%sIuXhvaTVqg|xR)%I2CXg8_aBZNBq5{_j$|x#uZJ>;z0@ubQ z#HN2ui z##|sKi#CHEqm;TrXmM(aLSnH(aY;&MoL}9g_w2u_`$KxBE(|AU;>GCkf#hd_`$AV0lC7ENerxo1?&n#CLS1%QHa@) z7m`C*z^*V95rt}F6k;}F5`iiNxxxsp4des;#Cs`|KJZf1GKTh$^W^&>&_91+fn_h}pqG>;nyA zc5o2;K!cba9K=4*AZ7>o*%#_Dc5o2;Lfym;4q{(!NCC|b4q{&^NWsny4q{)Z$JjwZ z><3NK?BF2wgBt=0Vn4VcAnW|3AWeRDa1i^+L)w@eLM(xxZV;%O14@{I9Ae;NjRWMd zAZW?M0rprBG%0d`Jr)Elc{sox3xbwB93Y#5q2a*+E_s5X;lTm+N-#7$IKW;B77$Eg J0}rDc0|2IDpvwRN literal 0 HcmV?d00001