build.rs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. fn main() -> Result<(), Box<dyn std::error::Error>> {
  2. // Only compile protobuf files when the fuzz feature is enabled.
  3. #[cfg(feature = "fuzz")]
  4. {
  5. use std::{env, fs, path::PathBuf};
  6. // Get absolute proto dir from producer
  7. let proto_dir = PathBuf::from(
  8. env::var("DEP_PROTOSOL_PROTO_DIR")
  9. .expect("protosol did not expose PROTO_DIR, did protosol build.rs run first?"),
  10. );
  11. println!("cargo:rerun-if-env-changed=DEP_PROTOSOL_PROTO_DIR");
  12. println!("cargo:rerun-if-changed={}", proto_dir.display());
  13. // Collect absolute .proto paths
  14. let mut proto_files = vec![];
  15. for entry in fs::read_dir(&proto_dir)? {
  16. let path = entry?.path();
  17. if path.extension().and_then(|e| e.to_str()) == Some("proto") {
  18. println!("cargo:rerun-if-changed={}", path.display());
  19. proto_files.push(path);
  20. }
  21. }
  22. // Ensure deterministic order for rebuilds
  23. proto_files.sort();
  24. // Compile protos into Rust
  25. let out_dir = PathBuf::from(env::var("OUT_DIR")?);
  26. let mut config = prost_build::Config::new();
  27. config.out_dir(&out_dir);
  28. config.compile_protos(
  29. &proto_files
  30. .iter()
  31. .map(|p| p.display().to_string())
  32. .collect::<Vec<_>>(),
  33. &[proto_dir.to_str().unwrap()],
  34. )?;
  35. }
  36. Ok(())
  37. }