build.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. extern crate cbindgen;
  2. use cbindgen::{Config, Language, MacroExpansionConfig};
  3. use std::env;
  4. use std::path::PathBuf;
  5. fn main() {
  6. #[cfg(feature = "ztcontroller")]
  7. {
  8. // Ensure the `cbindgen` crate is available
  9. cbindgen::generate("src/ext.rs")
  10. .expect("Unable to generate bindings")
  11. .write_to_file("rustybits.h");
  12. let mut prost_build = prost_build::Config::new();
  13. prost_build
  14. .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
  15. .compile_protos(
  16. &[
  17. "src/pubsub/metadata.proto",
  18. "src/pubsub/network.proto",
  19. "src/pubsub/member.proto",
  20. "src/pubsub/member_status.proto",
  21. ],
  22. &["src/pubsub/"],
  23. )
  24. .expect("Failed to compile protobuf files");
  25. }
  26. let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
  27. let package_name = env::var("CARGO_PKG_NAME").unwrap();
  28. let output_file = target_dir().join(format!("{package_name}.h")).display().to_string();
  29. let meconfig = MacroExpansionConfig { bitflags: true, ..Default::default() };
  30. let config = Config {
  31. language: Language::C,
  32. cpp_compat: true,
  33. namespace: Some(String::from("rustybits")),
  34. macro_expansion: meconfig,
  35. ..Default::default()
  36. };
  37. cbindgen::generate_with_config(&crate_dir, config)
  38. .unwrap()
  39. .write_to_file(&output_file);
  40. }
  41. /// Find the location of the `target/` directory. Note that this may be
  42. /// overridden by `cmake`, so we also need to check the `CARGO_TARGET_DIR`
  43. /// variable.
  44. fn target_dir() -> PathBuf {
  45. if let Ok(target) = env::var("CARGO_TARGET_DIR") {
  46. PathBuf::from(target)
  47. } else {
  48. PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join("target")
  49. }
  50. }