meshopt 0.2.1

Rust ffi bindings and idiomatic wrapper for mesh optimizer
Documentation
use std::env;

fn main() {
    let mut build = cc::Build::new();

    build.include("src");

    // Add the files we build
    let source_files = [
        "vendor/src/allocator.cpp",
        "vendor/src/clusterizer.cpp",
        "vendor/src/indexcodec.cpp",
        "vendor/src/indexgenerator.cpp",
        "vendor/src/overdrawanalyzer.cpp",
        "vendor/src/overdrawoptimizer.cpp",
        "vendor/src/simplifier.cpp",
        "vendor/src/spatialorder.cpp",
        "vendor/src/stripifier.cpp",
        "vendor/src/vcacheanalyzer.cpp",
        "vendor/src/vcacheoptimizer.cpp",
        "vendor/src/vertexcodec.cpp",
        "vendor/src/vfetchanalyzer.cpp",
        "vendor/src/vfetchoptimizer.cpp",
    ];

    for source_file in &source_files {
        build.file(source_file);
    }

    let target = env::var("TARGET").unwrap();
    if target.contains("darwin") {
        build
            .flag("-std=c++11")
            .cpp_link_stdlib("c++")
            .cpp_set_stdlib("c++")
            .cpp(true);
    } else if target.contains("linux") || target.contains("windows-gnu") {
        build.flag("-std=c++11").cpp_link_stdlib("stdc++").cpp(true);
    }

    if target.starts_with("wasm32") {
        // In webassembly there's no stdlib, so we use
        // our own stripped down headers to provide the few
        // functions needed via LLVM intrinsics.
        build.flag("-isystem").flag("include_wasm32");
        // The Wasm backend needs a compatible ar
        // which will most likely be available under
        // this name on Windows, via manual LLVM install
        let host = env::var("HOST").unwrap();
        if host.contains("windows") {
            build.archiver("llvm-ar");
        }
    }

    build.compile("meshopt_cpp");

    generate_bindings("gen/bindings.rs");
}

#[cfg(feature = "generate_bindings")]
fn generate_bindings(output_file: &str) {
    let bindings = bindgen::Builder::default()
        .header("vendor/src/meshoptimizer.h")
        .rustfmt_bindings(true)
        .derive_debug(true)
        .impl_debug(true)
        .blocklist_type("__darwin_.*")
        .allowlist_function("meshopt.*")
        .trust_clang_mangling(false)
        .layout_tests(false)
        .size_t_is_usize(true)
        .generate()
        .expect("Unable to generate bindings!");

    bindings
        .write_to_file(std::path::Path::new(output_file))
        .expect("Unable to write bindings!");
}

#[cfg(not(feature = "generate_bindings"))]
fn generate_bindings(_: &str) {}