4
0

build.rs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. use std::{env, ffi::OsString, path::PathBuf, process::Command};
  2. fn main() {
  3. let manifest_dir = env::var_os("CARGO_MANIFEST_DIR").unwrap();
  4. let manifest_dir = PathBuf::from(manifest_dir);
  5. let out_dir = env::var_os("OUT_DIR").unwrap();
  6. let out_dir = PathBuf::from(out_dir);
  7. let libbpf_dir = manifest_dir
  8. .parent()
  9. .unwrap()
  10. .parent()
  11. .unwrap()
  12. .join("libbpf");
  13. let libbpf_headers_dir = out_dir.join("libbpf_headers");
  14. let mut includedir = OsString::new();
  15. includedir.push("INCLUDEDIR=");
  16. includedir.push(&libbpf_headers_dir);
  17. let mut cmd = Command::new("make");
  18. cmd.arg("-C")
  19. .arg(libbpf_dir.join("src"))
  20. .arg(includedir)
  21. .arg("install_headers");
  22. let status = cmd
  23. .status()
  24. .unwrap_or_else(|err| panic!("failed to run {cmd:?}: {err}"));
  25. match status.code() {
  26. Some(code) => match code {
  27. 0 => {}
  28. code => panic!("{cmd:?} exited with code {code}"),
  29. },
  30. None => panic!("{cmd:?} terminated by signal"),
  31. }
  32. let bpf_dir = manifest_dir.join("bpf");
  33. let endian = env::var_os("CARGO_CFG_TARGET_ENDIAN").unwrap();
  34. let target = if endian == "big" {
  35. "bpfeb"
  36. } else if endian == "little" {
  37. "bpfel"
  38. } else {
  39. panic!("unsupported endian={:?}", endian)
  40. };
  41. let mut target_arch = OsString::new();
  42. target_arch.push("-D__TARGET_ARCH_");
  43. let arch = env::var_os("CARGO_CFG_TARGET_ARCH").unwrap();
  44. if arch == "x86_64" {
  45. target_arch.push("x86");
  46. } else if arch == "aarch64" {
  47. target_arch.push("arm64");
  48. } else {
  49. target_arch.push(arch);
  50. };
  51. for (src, dst) in [
  52. ("ext.bpf.c", "ext.bpf.o"),
  53. ("main.bpf.c", "main.bpf.o"),
  54. ("multimap-btf.bpf.c", "multimap-btf.bpf.o"),
  55. ("text_64_64_reloc.c", "text_64_64_reloc.o"),
  56. ] {
  57. let src = bpf_dir.join(src);
  58. let out = out_dir.join(dst);
  59. let mut cmd = Command::new("clang");
  60. cmd.arg("-I")
  61. .arg(&libbpf_headers_dir)
  62. .args(["-g", "-O2", "-target", target, "-c"])
  63. .arg(&target_arch)
  64. .arg(src)
  65. .arg("-o")
  66. .arg(out);
  67. let status = cmd
  68. .status()
  69. .unwrap_or_else(|err| panic!("failed to run {cmd:?}: {err}"));
  70. match status.code() {
  71. Some(code) => match code {
  72. 0 => {}
  73. code => panic!("{cmd:?} exited with code {code}"),
  74. },
  75. None => panic!("{cmd:?} terminated by signal"),
  76. }
  77. }
  78. }