apple-sys 0.2.0

The auto-managed -sys crate for Apple platforms using bindgen directly from build environment
use apple_bindgen::Builder;
use std::io::Write;

fn main() {
    println!("cargo:rerun-if-changed=macos.inc.rs");
    println!("cargo:rerun-if-changed=ios.inc.rs");

    let target = std::env::var("TARGET").expect("env TARGET must be set");
    let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();

    let frameworks = match target_os.as_str() {
        "macos" => include!("macos.inc.rs"),
        "ios" => include!("ios.inc.rs"),
        unknown => panic!("unexpected target_os: {}", unknown),
    };

    let platform = apple_sdk::Platform::from_target_triple(&target)
        .expect("Unknown apple platform. please report it.");

    #[cfg(not(feature = "__allow_empty"))]
    if frameworks.is_empty() {
        panic!("apple-sys accepts module names as features. Empty feature maybe a mistake. If this is intentional, add to features: '__allow_empty'");
    }

    // Get the cargo out directory.
    let out_dir =
        std::path::PathBuf::from(std::env::var("OUT_DIR").expect("env variable OUT_DIR not found"));

    for framework in frameworks {
        println!("cargo:rustc-link-lib=framework={framework}");

        let mut builder =
            Builder::with_builtin_config(framework, &platform).expect("sdk lookup failed");
        if let Ok(target) = std::env::var("TARGET") {
            builder = builder.target(target);
        }
        let out = builder.generate().expect("binding generation failed");

        // Write them to the crate root.
        let mut file = std::fs::File::create(out_dir.join(format!("{framework}.rs")))
            .expect("could not open bindings file");
        file.write_all(out.as_bytes())
            .expect("could not write bindings");
    }
}