procinsh 0.1.0

A local, read-only Linux x86-64 process inspector
use std::{env, path::PathBuf, process::Command};
fn main() {
    println!("cargo:rerun-if-changed=src/space/activity.bpf.c");
    println!("cargo:rerun-if-changed=src/space/ibs.c");
    println!("cargo:rerun-if-changed=src/space/files.bpf.c");
    let out = PathBuf::from(env::var_os("OUT_DIR").unwrap());
    let btf = Command::new("bpftool")
        .args([
            "btf",
            "dump",
            "file",
            "/sys/kernel/btf/vmlinux",
            "format",
            "c",
        ])
        .output()
        .expect("bpftool is required to build the CO-RE collector");
    assert!(btf.status.success(), "BTF header generation failed");
    std::fs::write(out.join("vmlinux.h"), btf.stdout).unwrap();
    for name in ["activity", "files"] {
        libbpf_cargo::SkeletonBuilder::new()
            .source(format!("src/space/{name}.bpf.c"))
            .clang_args([format!("-I{}", out.display()), "-D__TARGET_ARCH_x86".into()])
            .obj(out.join(format!("{name}.bpf.o")))
            .build()
            .expect("BPF compile");
    }
    assert!(
        Command::new("cc")
            .args([
                "-O2",
                "-Wall",
                "-Wextra",
                "-Werror",
                "-c",
                "src/space/ibs.c",
                "-o"
            ])
            .arg(out.join("ibs.o"))
            .status()
            .unwrap()
            .success()
    );
    assert!(
        Command::new("ar")
            .arg("crs")
            .arg(out.join("libprocinsh_ibs.a"))
            .arg(out.join("ibs.o"))
            .status()
            .unwrap()
            .success()
    );
    println!("cargo:rustc-link-search=native={}", out.display());
    println!("cargo:rustc-link-lib=static=procinsh_ibs");
}