build.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. extern crate glob;
  2. use std::{
  3. env, fs,
  4. ops::Deref,
  5. path::{Path, PathBuf},
  6. };
  7. fn out_dir() -> PathBuf {
  8. Path::new(&env::var("OUT_DIR").expect("env")).to_path_buf()
  9. }
  10. fn cleanup() {
  11. let _ = fs::remove_dir_all(&out_dir());
  12. }
  13. fn compile() {
  14. let proto_dir = Path::new(&env::var("CARGO_MANIFEST_DIR").expect("env")).join("proto");
  15. let files = &[
  16. proto_dir.join("authentication.proto"),
  17. proto_dir.join("keyexchange.proto"),
  18. proto_dir.join("mercury.proto"),
  19. proto_dir.join("metadata.proto"),
  20. proto_dir.join("playlist4changes.proto"),
  21. proto_dir.join("playlist4content.proto"),
  22. proto_dir.join("playlist4issues.proto"),
  23. proto_dir.join("playlist4meta.proto"),
  24. proto_dir.join("playlist4ops.proto"),
  25. proto_dir.join("pubsub.proto"),
  26. proto_dir.join("spirc.proto"),
  27. ];
  28. let slices = files.iter().map(Deref::deref).collect::<Vec<_>>();
  29. let out_dir = out_dir();
  30. fs::create_dir(&out_dir).expect("create_dir");
  31. protobuf_codegen_pure::Codegen::new()
  32. .out_dir(&out_dir)
  33. .inputs(&slices)
  34. .include(&proto_dir)
  35. .run()
  36. .expect("Codegen failed.");
  37. }
  38. fn generate_mod_rs() {
  39. let out_dir = out_dir();
  40. let mods = glob::glob(&out_dir.join("*.rs").to_string_lossy())
  41. .expect("glob")
  42. .filter_map(|p| {
  43. p.ok()
  44. .map(|p| format!("pub mod {};", p.file_stem().unwrap().to_string_lossy()))
  45. })
  46. .collect::<Vec<_>>()
  47. .join("\n");
  48. let mod_rs = out_dir.join("mod.rs");
  49. fs::write(&mod_rs, format!("// @generated\n{}\n", mods)).expect("write");
  50. println!("cargo:rustc-env=PROTO_MOD_RS={}", mod_rs.to_string_lossy());
  51. }
  52. fn main() {
  53. cleanup();
  54. compile();
  55. generate_mod_rs();
  56. }