bsc_m03_sys 0.2.0

A short description of the bsc_m03_sys crate.
Documentation
use std::{env, path::PathBuf};

fn main() {
    let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
    let bsc_dir = manifest_dir.join("bsc-m03");

    let mut c_sources = cc::Build::new();
    c_sources.include(&bsc_dir);
    c_sources.file(bsc_dir.join("hutucker/hu-tucker.c"));
    c_sources.file(bsc_dir.join("libbscsais/libbscsais.c"));
    c_sources.file(bsc_dir.join("libbscsais/libbscsais16.c"));
    c_sources.compile("bsc_m03_support");

    let mut cpp_sources = cc::Build::new();
    cpp_sources.cpp(true);
    cpp_sources.include(&bsc_dir);
    cpp_sources.file(manifest_dir.join("src/bsc_wrapper.cpp"));
    cpp_sources.flag("-w");

    if cfg!(target_env = "msvc") {
        cpp_sources.flag_if_supported("/std:c++17");
    } else {
        cpp_sources.flag_if_supported("-std=c++17");
    }

    cpp_sources.compile("bsc_m03_wrapper");

    for path in [
        "src/bsc_wrapper.cpp",
        "bsc-m03/bsc-m03.cpp",
        "bsc-m03/hutucker/hu-tucker.c",
        "bsc-m03/libbscsais/libbscsais.c",
        "bsc-m03/libbscsais/libbscsais16.c",
    ] {
        println!("cargo:rerun-if-changed={path}");
    }

    println!("cargo:rustc-link-lib=static=bsc_m03_wrapper");
    println!("cargo:rustc-link-lib=static=bsc_m03_support");

    if cfg!(all(target_os = "macos", not(target_env = "msvc"))) {
        println!("cargo:rustc-link-lib=dylib=c++");
    } else if cfg!(all(any(target_os = "linux", target_os = "android"), not(target_env = "msvc"))) {
        println!("cargo:rustc-link-lib=dylib=stdc++");
    }
}