gitrel 0.2.12

GitHub binary manager - install and update single binary releases via GitHub API
use std::collections::HashSet;
use std::env;
use std::fmt::Write;
use std::fs;
use std::path::Path;

use lazy_static::lazy_static;

fn main() {
    let exclude_set: HashSet<&str> = ALL_EXCLUDES.iter().copied().collect();
    let include_set: HashSet<&str> = ALL_INCLUDES.iter().copied().collect();

    #[cfg(not(any(target_os = "linux", target_os = "windows", target_os = "macos")))]
    panic!("unsupported target Architecture/OS");

    #[cfg(not(any(target_arch = "x86", target_arch = "x86_64", target_arch = "aarch4")))]
    panic!("unsupported target Architecture/OS");

    #[cfg(all(target_os = "windows", target_arch = "aarch"))]
    panic!("unsupported target Architecture/OS");

    let out_dir = env::var_os("OUT_DIR").unwrap();
    let dest_path = Path::new(&out_dir).join("generated.rs");

    let mut msg = String::with_capacity((exclude_set.len() + include_set.len()) * 12);

    // generate EXCLUDE_SET
    msg.write_str("lazy_static! { static ref EXCLUDE_SET: HashSet<&'static str> = vec![")
        .unwrap();
    for term in exclude_set.iter() {
        msg.write_str(format!("\"{}\",", term).as_str()).unwrap();
    }
    msg.write_str("].iter().copied().collect();}\n").unwrap();

    // generate INCLUDE_SET
    msg.write_str("lazy_static! { static ref INCLUDE_SET: HashSet<&'static str> = vec![")
        .unwrap();
    for term in include_set.iter() {
        msg.write_str(format!("\"{}\",", term).as_str()).unwrap();
    }
    msg.write_str("].iter().copied().collect();}\n").unwrap();

    fs::write(&dest_path, msg).unwrap();
    println!("cargo:rerun-if-changed=build.rs");
}

lazy_static! {
    pub static ref ALL_INCLUDES: Vec<&'static str> = vec![
        #[cfg(target_os="linux")]
        "linux",

        #[cfg(target_os="windows")]
        "windows",
        #[cfg(target_os="windows")]
        "win",
        #[cfg(target_os="windows")]
        "exe",

        #[cfg(target_os="macos")]
        "macos",
        #[cfg(target_os="macos")]
        "apple",
        #[cfg(target_os="macos")]
        "darwin",
        #[cfg(target_os="macos")]
        "osx",
    ];

    // combined values from:
    //   1. https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63
    //   2. rustup target list
    pub static ref ALL_EXCLUDES: Vec<&'static str> = vec![
        // ===============================================
        // also good to exclude
        "source",
        "src",
        "vsix",
        "apk",

        #[cfg(not(all(target_os="windows", target_arch="x86_64")))]
        "win64",

        #[cfg(not(all(target_os="windows", target_arch="x86")))]
        "win32",

        "txt",
        "deb",
        "rpm",
        "sha256",
        "sha256sum",

        // ===============================================
        // OS
        "aix",
        "android",

        #[cfg(not(target_os="macos"))]
        "apple",
        #[cfg(not(target_os="macos"))]
        "darwin",

        #[cfg(not(target_os="macos"))]
        "osx",

        "dragonfly",
        "freebsd",
        "fuchsia",
        "hurd",
        "illumos",
        "ios",
        "js",

        #[cfg(not(target_os="linux"))]
        "linux",

        #[cfg(not(target_os="macos"))]
        "macos",

        "nacl",
        "netbsd",
        "openbsd",
        "plan9",
        "redox",
        "solaris",
        "sun",

        #[cfg(not(target_os="windows"))]
        "windows",

        #[cfg(not(target_os="windows"))]
        "win",
        "zos",

        // ===============================================
        // ARCH
        #[cfg(not(target_arch="x86"))]
        "32-bit",

        #[cfg(not(target_arch="x86"))]
        "386",

        #[cfg(not(target_arch="aarch64"))]
        "aarch64",

        #[cfg(not(target_arch="x86_64"))]
        "amd64",

        "amd64p32",
        "arm",
        "arm64",
        "arm64be",
        "armbe",
        "armebv7r",
        "armv5te",
        "armv6",
        "armv7",
        "armv7a",
        "armv7r",
        "asmjs",

        #[cfg(not(target_arch="x86"))]
        "i386",

        #[cfg(not(target_arch="x86"))]
        "i586",

        #[cfg(not(target_arch="x86"))]
        "i686",

        "loong64",
        "mips",
        "mips64",
        "mips64el",
        "mips64le",
        "mips64p32",
        "mips64p32le",
        "mipsel",
        "mipsle",
        "nvptx64",
        "powerpc",
        "powerpc64",
        "powerpc64le",
        "ppc",
        "ppc64",
        "ppc64le",
        "riscv",
        "riscv32i",
        "riscv32imac",
        "riscv32imc",
        "riscv64",
        "riscv64gc",
        "riscv64imac",
        "s390",
        "s390x",
        "sparc",
        "sparc64",
        "sparcv9",
        "thumbv6m",
        "thumbv7em",
        "thumbv7m",
        "thumbv7neon",
        "thumbv8m",
        "wasm",
        "wasm32",

        #[cfg(not(target_arch="x86_64"))]
        "x86_64",

        // ===============================================
        // ABI
        "androideabi",
        "eabi",
        "eabihf",

        #[cfg(not(target_env="gnu"))]
        "gnu",

        "gnuabi64",
        "gnuabihf",
        "gnueabi64",
        "gnueabihf",
        "gnux32",

        #[cfg(not(target_env="msvc"))]
        "msvc",

        #[cfg(not(target_env="musl"))]
        "musl",

        "muslabi64",
        "musleabi",
        "musleabihf",
        "sgx",

        #[cfg(not(target_env="uclibc"))]
        "uclibc",
    ];
}