build.rs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. println!("cargo:rerun-if-changed=bindgen-wrapper.h");
  36. let args = vec![
  37. "-nostdlibinc".to_string(),
  38. "-ffreestanding".to_string(),
  39. "-I".to_string(),
  40. "llvm-libunwind/include".to_string(),
  41. "-target".to_string(),
  42. env::var("TARGET").unwrap(),
  43. "-D_LIBUNWIND_IS_NATIVE_ONLY".to_string(),
  44. ];
  45. let bindings = bindgen::Builder::default()
  46. .header("llvm-libunwind/include/libunwind.h")
  47. .use_core()
  48. .ctypes_prefix("::cty")
  49. .prepend_enum_name(false)
  50. .parse_callbacks(Box::new(bindgen::CargoCallbacks))
  51. .clang_args(&args)
  52. .generate()
  53. .expect("Unable to generate bindings");
  54. let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
  55. bindings
  56. .write_to_file(out_path.join("bindings.rs"))
  57. .expect("Couldn't write bindings!");
  58. }
  59. fn main() {
  60. compile_libunwind();
  61. gen_libunwind_bindings();
  62. for entry in WalkDir::new("llvm-libunwind")
  63. .into_iter()
  64. .chain(WalkDir::new("include").into_iter())
  65. {
  66. println!(
  67. "cargo:rerun-if-changed={}",
  68. entry.unwrap().path().to_str().unwrap()
  69. );
  70. }
  71. }