mac-process 0.1.0

User-mode library for querying and verifying integrity of MacOS processes
fn main() {
    let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap_or_default();
    if target_os == "macos" {
        build_macos_bindings();
    }
}

fn build_macos_bindings() {
    use bindgen::RustTarget;

    match RustTarget::stable(85, 0) {
        Ok(rust_target) => {
            #[cfg(target_os = "macos")]
            generate_macos_bindings(rust_target);

            #[cfg(not(target_os = "macos"))]
            copy_committed_macos_bindings(rust_target);
        }
        _ => eprintln!("Error executing bindgen"),
    }
}

#[cfg(target_os = "macos")]
fn generate_macos_bindings(rust_target: bindgen::RustTarget) {
    use bindgen::RustEdition;
    use std::env;
    use std::path::Path;

    let sdk_path = env::var("SDKROOT")
        .unwrap_or_else(|_| "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk".into());

    let bindings = bindgen::builder()
        .header_contents("libproc_rs.h", "#include <libproc.h>")
        .rust_target(rust_target)
        .rust_edition(RustEdition::Edition2024)
        .layout_tests(false)
        .clang_args(&["-x", "c++", "-I", &format!("{sdk_path}/usr/include/")])
        .generate()
        .expect("Failed to build libproc bindings");

    let output_path = Path::new(&env::var("OUT_DIR").expect("OUT_DIR env var was not defined"))
        .join("osx_libproc_bindings.rs");

    bindings
        .write_to_file(output_path)
        .expect("Failed to write libproc bindings");
}

#[cfg(not(target_os = "macos"))]
fn copy_committed_macos_bindings(_: bindgen::RustTarget) {
    use std::env;
    use std::path::Path;

    const COMMITTED_BINDINGS: &str = "docs_rs/osx_libproc_bindings.rs";
    let output_path = Path::new(&env::var("OUT_DIR").expect("OUT_DIR env var was not defined"))
        .join("osx_libproc_bindings.rs");

    std::fs::copy(COMMITTED_BINDINGS, &output_path).unwrap_or_else(|error| {
        panic!(
            "failed to copy committed libproc bindings {COMMITTED_BINDINGS} to {}: {error}",
            output_path.display()
        )
    });
    println!("cargo:rerun-if-changed={COMMITTED_BINDINGS}");
}