use std::{ffi::OsString, path::Path, process::Command}; use anyhow::{Context as _, Result, bail}; pub const AYA_BUILD_INTEGRATION_BPF: &str = "AYA_BUILD_INTEGRATION_BPF"; pub const LIBBPF_DIR: &str = "xtask/libbpf"; pub fn exec(cmd: &mut Command) -> Result<()> { let status = cmd .status() .with_context(|| format!("failed to run {cmd:?}"))?; if status.code() != Some(0) { bail!("{cmd:?} failed: {status:?}") } Ok(()) } /// Installs the libbpf headers files from the `source_dir` to the /// `headers_dir`. pub fn install_libbpf_headers( source_dir: impl AsRef, headers_dir: impl AsRef, ) -> Result<()> { let mut includedir = OsString::new(); includedir.push("INCLUDEDIR="); includedir.push(headers_dir.as_ref().as_os_str()); exec( Command::new("make") .arg("-C") .arg(source_dir.as_ref().join("src")) .arg(includedir) .arg("install_headers"), )?; Ok(()) } #[derive(Debug)] pub struct Errors(Vec); impl Errors { pub fn new(errors: Vec) -> Self { Self(errors) } } impl std::fmt::Display for Errors where E: std::fmt::Debug, { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let Self(errors) = self; for (i, error) in errors.iter().enumerate() { if i != 0 { writeln!(f)?; } write!(f, "{:?}", error)?; } Ok(()) } } impl std::error::Error for Errors where E: std::fmt::Debug {}