1 use std::{path::PathBuf, process::Command};
2
3 use clap::Parser;
4
5 #[derive(Debug, Copy, Clone)]
6 pub enum Architecture {
7 BpfEl,
8 BpfEb,
9 }
10
11 impl std::str::FromStr for Architecture {
12 type Err = String;
13
from_str(s: &str) -> Result<Self, Self::Err>14 fn from_str(s: &str) -> Result<Self, Self::Err> {
15 Ok(match s {
16 "bpfel-unknown-none" => Architecture::BpfEl,
17 "bpfeb-unknown-none" => Architecture::BpfEb,
18 _ => return Err("invalid target".to_owned()),
19 })
20 }
21 }
22
23 impl std::fmt::Display for Architecture {
fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result24 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25 f.write_str(match self {
26 Architecture::BpfEl => "bpfel-unknown-none",
27 Architecture::BpfEb => "bpfeb-unknown-none",
28 })
29 }
30 }
31
32 #[derive(Debug, Parser)]
33 pub struct Options {
34 /// Set the endianness of the BPF target
35 #[clap(default_value = "bpfel-unknown-none", long)]
36 pub target: Architecture,
37 /// Build the release target
38 #[clap(long)]
39 pub release: bool,
40 }
41
build_ebpf(opts: Options) -> Result<(), anyhow::Error>42 pub fn build_ebpf(opts: Options) -> Result<(), anyhow::Error> {
43 let dir = PathBuf::from("syscall_ebpf-ebpf");
44 let target = format!("--target={}", opts.target);
45 let mut args = vec![
46 "build",
47 target.as_str(),
48 "-Z",
49 "build-std=core",
50 ];
51 if opts.release {
52 args.push("--release")
53 }
54
55 // Command::new creates a child process which inherits all env variables. This means env
56 // vars set by the cargo xtask command are also inherited. RUSTUP_TOOLCHAIN is removed
57 // so the rust-toolchain.toml file in the -ebpf folder is honored.
58
59 let status = Command::new("cargo")
60 .current_dir(dir)
61 .env_remove("RUSTUP_TOOLCHAIN")
62 .args(&args)
63 .status()
64 .expect("failed to build bpf program");
65 assert!(status.success());
66 Ok(())
67 }
68