mirror of https://github.com/aya-rs/aya
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.6 KiB
Rust
89 lines
2.6 KiB
Rust
use std::{env, ffi::OsString, path::PathBuf, process::Command};
|
|
|
|
fn main() {
|
|
let manifest_dir = env::var_os("CARGO_MANIFEST_DIR").unwrap();
|
|
let manifest_dir = PathBuf::from(manifest_dir);
|
|
let out_dir = env::var_os("OUT_DIR").unwrap();
|
|
let out_dir = PathBuf::from(out_dir);
|
|
|
|
let libbpf_dir = manifest_dir
|
|
.parent()
|
|
.unwrap()
|
|
.parent()
|
|
.unwrap()
|
|
.join("libbpf");
|
|
|
|
let libbpf_headers_dir = out_dir.join("libbpf_headers");
|
|
|
|
let mut includedir = OsString::new();
|
|
includedir.push("INCLUDEDIR=");
|
|
includedir.push(&libbpf_headers_dir);
|
|
|
|
let mut cmd = Command::new("make");
|
|
cmd.arg("-C")
|
|
.arg(libbpf_dir.join("src"))
|
|
.arg(includedir)
|
|
.arg("install_headers");
|
|
let status = cmd
|
|
.status()
|
|
.unwrap_or_else(|err| panic!("failed to run {cmd:?}: {err}"));
|
|
match status.code() {
|
|
Some(code) => match code {
|
|
0 => {}
|
|
code => panic!("{cmd:?} exited with code {code}"),
|
|
},
|
|
None => panic!("{cmd:?} terminated by signal"),
|
|
}
|
|
|
|
let bpf_dir = manifest_dir.join("bpf");
|
|
|
|
let endian = env::var_os("CARGO_CFG_TARGET_ENDIAN").unwrap();
|
|
let target = if endian == "big" {
|
|
"bpfeb"
|
|
} else if endian == "little" {
|
|
"bpfel"
|
|
} else {
|
|
panic!("unsupported endian={:?}", endian)
|
|
};
|
|
|
|
let mut target_arch = OsString::new();
|
|
target_arch.push("-D__TARGET_ARCH_");
|
|
|
|
let arch = env::var_os("CARGO_CFG_TARGET_ARCH").unwrap();
|
|
if arch == "x86_64" {
|
|
target_arch.push("x86");
|
|
} else if arch == "aarch64" {
|
|
target_arch.push("arm64");
|
|
} else {
|
|
target_arch.push(arch);
|
|
};
|
|
|
|
for (src, dst) in [
|
|
("ext.bpf.c", "ext.bpf.o"),
|
|
("main.bpf.c", "main.bpf.o"),
|
|
("multimap-btf.bpf.c", "multimap-btf.bpf.o"),
|
|
("text_64_64_reloc.c", "text_64_64_reloc.o"),
|
|
] {
|
|
let src = bpf_dir.join(src);
|
|
let out = out_dir.join(dst);
|
|
let mut cmd = Command::new("clang");
|
|
cmd.arg("-I")
|
|
.arg(&libbpf_headers_dir)
|
|
.args(["-g", "-O2", "-target", target, "-c"])
|
|
.arg(&target_arch)
|
|
.arg(src)
|
|
.arg("-o")
|
|
.arg(out);
|
|
let status = cmd
|
|
.status()
|
|
.unwrap_or_else(|err| panic!("failed to run {cmd:?}: {err}"));
|
|
match status.code() {
|
|
Some(code) => match code {
|
|
0 => {}
|
|
code => panic!("{cmd:?} exited with code {code}"),
|
|
},
|
|
None => panic!("{cmd:?} terminated by signal"),
|
|
}
|
|
}
|
|
}
|