fmod-studio-sys 1.0.2

FMOD Studio bindings
Documentation
use build_rs::{input::*, output::*};
use fmod_build_helper::{fmod_studio_path, transpile};

#[rustfmt::skip]
static HEADERS: &[(&str, &[(&str, &str)])] = &[
    ("fmod_studio.h", &[]),
    ("fmod_studio_common.h", &[]),
];

fn main() {
    rerun_if_changed("build.rs");

    rerun_if_env_changed("DOCS_RS");
    if std::env::var("DOCS_RS").is_ok() {
        let out_dir = out_dir();
        for (header, _) in HEADERS {
            std::fs::write(out_dir.join(header).with_extension("rs"), "// dummy").unwrap();
        }
        return;
    }

    let (inc, lib) = fmod_studio_path();

    metadata("inc", &inc);
    metadata("lib", &lib);

    rustc_link_search(&lib);
    rerun_if_changed(&lib);
    rustc_link_lib(&fmodstudio_obj());

    for (header, extra_fixup) in HEADERS {
        transpile(&inc, header, extra_fixup);
    }
}

fn fmodstudio_obj() -> String {
    if let Some(obj) = dep_metadata("fmodstudio", "obj") {
        return obj;
    }

    let vendor = cargo_cfg_target_vendor();
    let arch = cargo_cfg_target_arch();
    let profile = profile();
    let atomics = cargo_cfg_target_feature().contains(&"atomics".to_string());
    let mut obj = match (&*arch, &*profile) {
        ("wasm32", "debug") if atomics => "fmodstudioPL",
        ("wasm32", "release") if atomics => "fmodstudioP",
        (_, "debug") => "fmodstudioL",
        (_, "release") => "fmodstudio",
        _ => unreachable!("unexpected $PROFILE"),
    }
    .to_string();

    if vendor == "pc" && matches!(&*arch, "x86" | "x86_64") {
        obj += "_vc";
    }

    if vendor == "apple" {
        let sim = if cargo_cfg_target_abi().as_deref() == Some("sim") {
            "simulator"
        } else {
            "os"
        };
        match &*cargo_cfg_target_os() {
            "ios" => obj = obj + "_iphone" + sim,
            "tvos" => obj = obj + "_appletv" + sim,
            "visionos" => obj = obj + "_xr" + sim,
            _ => {},
        }
    }

    obj
}