build.rs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. use std::env;
  2. use std::path::PathBuf;
  3. use walkdir::WalkDir;
  4. fn compile_libunwind() {
  5. let mut cfg = cc::Build::new();
  6. cfg.warnings(false);
  7. cfg.cpp_set_stdlib(None);
  8. cfg.cpp(true);
  9. cfg.flag("-std=c++11");
  10. cfg.flag("-fno-exceptions");
  11. cfg.flag("-fno-rtti");
  12. cfg.flag("-fstrict-aliasing");
  13. cfg.flag("-fvisibility=hidden");
  14. cfg.flag("-funwind-tables");
  15. cfg.define("_LIBUNWIND_NO_HEAP", None);
  16. cfg.define("_LIBUNWIND_IS_BAREMETAL", None);
  17. cfg.define("_LIBUNWIND_IS_NATIVE_ONLY", None);
  18. cfg.define("_LIBUNWIND_HAS_NO_THREADS", None);
  19. cfg.define("NDEBUG", None);
  20. cfg.include("llvm-libunwind/include");
  21. cfg.include("include");
  22. let libunwind_sources = [
  23. "llvm-libunwind/src/UnwindRegistersRestore.S",
  24. "llvm-libunwind/src/UnwindRegistersSave.S",
  25. "llvm-libunwind/src/libunwind.cpp",
  26. // Needed on ARM targets for EHABI unwinding
  27. "llvm-libunwind/src/Unwind-EHABI.cpp",
  28. ];
  29. for source in &libunwind_sources {
  30. cfg.file(source);
  31. }
  32. cfg.compile("llvm_libunwind");
  33. }
  34. fn gen_libunwind_bindings() {
  35. let args = vec![
  36. "-nostdlibinc".to_string(),
  37. "-ffreestanding".to_string(),
  38. "-I".to_string(),
  39. "llvm-libunwind/include".to_string(),
  40. "-D_LIBUNWIND_IS_NATIVE_ONLY".to_string(),
  41. ];
  42. let bindings = bindgen::Builder::default()
  43. .header("llvm-libunwind/include/libunwind.h")
  44. .use_core()
  45. .ctypes_prefix("::cty")
  46. .prepend_enum_name(false)
  47. .parse_callbacks(Box::new(bindgen::CargoCallbacks))
  48. .clang_args(args)
  49. .generate()
  50. .expect("Unable to generate bindings");
  51. let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
  52. bindings
  53. .write_to_file(out_path.join("bindings.rs"))
  54. .expect("Couldn't write bindings!");
  55. }
  56. fn main() {
  57. compile_libunwind();
  58. gen_libunwind_bindings();
  59. for entry in WalkDir::new("llvm-libunwind")
  60. .into_iter()
  61. .chain(WalkDir::new("include").into_iter())
  62. {
  63. println!(
  64. "cargo:rerun-if-changed={}",
  65. entry.unwrap().path().to_str().unwrap()
  66. );
  67. }
  68. }