simdriver 0.2.4

Native iOS simulator frames, input, device controls, and accessibility for macOS
use std::path::PathBuf;
use std::process::Command;

const CORE_SIMULATOR: &str =
    "/Library/Developer/PrivateFrameworks/CoreSimulator.framework/CoreSimulator";

fn main() {
    let manifest = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
    let helpers = manifest.join("helpers");
    let out = PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("helpers");
    std::fs::create_dir_all(&out).unwrap();

    println!("cargo:rerun-if-changed=helpers");

    // (name, extra frameworks)
    let helper_specs: [(&str, &[&str]); 3] = [
        ("sdframe", &["CoreGraphics", "IOSurface", "Accelerate"]),
        ("sdhid", &["CoreGraphics"]),
        ("sdax", &["AppKit"]),
    ];
    for (name, extra) in helper_specs {
        let tmp = out.join(format!("{name}.tmp"));
        let mut cmd = Command::new("clang");
        cmd.args(["-fobjc-arc", "-O2", "-Wall", "-Wno-unused-value"])
            .args(["-framework", "Foundation"]);
        for fw in extra {
            cmd.args(["-framework", fw]);
        }
        cmd.arg("-I")
            .arg(helpers.join("private-headers"))
            .arg(helpers.join(name).join("main.m"))
            .arg(CORE_SIMULATOR)
            .arg("-o")
            .arg(&tmp);
        let status = cmd.status().expect("failed to run clang");
        assert!(status.success(), "clang failed building {name}");
        // Build under a temp name then rename so a running binary is never overwritten in place.
        std::fs::rename(&tmp, out.join(name)).unwrap();
    }
}