build.rs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. extern crate gcc;
  2. use std::env;
  3. use std::path::Path;
  4. use std::process::Command;
  5. struct Sources {
  6. files: Vec<&'static str>,
  7. }
  8. impl Sources {
  9. fn new() -> Sources {
  10. Sources { files: Vec::new() }
  11. }
  12. fn extend(&mut self, sources: &[&'static str]) {
  13. self.files.extend(sources);
  14. }
  15. }
  16. fn main() {
  17. if !Path::new("compiler-rt/.git").exists() {
  18. let _ = Command::new("git").args(&["submodule", "update", "--init"])
  19. .status();
  20. }
  21. let target = env::var("TARGET").expect("TARGET was not set");
  22. let cfg = &mut gcc::Config::new();
  23. if target.contains("msvc") {
  24. cfg.define("__func__", Some("__FUNCTION__"));
  25. } else {
  26. cfg.flag("-fno-builtin");
  27. cfg.flag("-fomit-frame-pointer");
  28. cfg.flag("-ffreestanding");
  29. }
  30. let mut sources = Sources::new();
  31. sources.extend(&[
  32. "muldi3.c",
  33. "mulosi4.c",
  34. "mulodi4.c",
  35. "divsi3.c",
  36. "divdi3.c",
  37. "modsi3.c",
  38. "moddi3.c",
  39. "divmodsi4.c",
  40. "divmoddi4.c",
  41. "ashldi3.c",
  42. "ashrdi3.c",
  43. "lshrdi3.c",
  44. "udivdi3.c",
  45. "umoddi3.c",
  46. "udivmoddi4.c",
  47. "udivsi3.c",
  48. "umodsi3.c",
  49. "udivmodsi4.c",
  50. "adddf3.c",
  51. "addsf3.c",
  52. ]);
  53. for src in sources.files.iter() {
  54. cfg.file(Path::new("compiler-rt/lib/builtins").join(src));
  55. }
  56. cfg.compile("libcompiler-rt.a");
  57. }