lgbm-sys 0.0.2

Unofficial Rust bindings for LightGBM
Documentation
use std::{env, path::Path};

fn main() {
    if std::env::var("DOCS_RS").is_ok() {
        return;
    }

    let os = std::env::consts::OS;
    match os {
        "windows" => build_windows(),
        "linux" => build_linux(),
        "macos" => build_macos(),
        _ => panic!("Unsupported OS: {os}"),
    }
}
fn build_windows() {
    let dir = env_var("LIGHTGBM_LIB_DIR");
    println!("cargo:rustc-link-search={dir}");
    let dir_path = Path::new(&dir);
    let lib_path = dir_path.join("lib_lightgbm.lib");
    let dll_path = dir_path.join("lib_lightgbm.dll");
    rerun_if_changed(dir_path);
    if !lib_path.is_file() {
        panic!("lib_lightgbm.lib not found in {dir}");
    }
    if dll_path.is_file() {
        println!("cargo:rustc-link-lib=dylib=lib_lightgbm");
    } else {
        println!("cargo:rustc-link-lib=static=lib_lightgbm");
    }
}
fn build_linux() {
    let dir = env_var("LIGHTGBM_LIB_DIR");
    println!("cargo:rustc-link-search={dir}");
    let dir_path = Path::new(&dir);
    let a_path = dir_path.join("lib_lightgbm.a");
    let so_path = dir_path.join("lib_lightgbm.so");
    rerun_if_changed(dir_path);
    if a_path.is_file() {
        println!("cargo:rustc-link-lib=static=_lightgbm");
        println!("cargo:rustc-link-lib=stdc++");
        println!("cargo:rustc-link-lib=dylib=gomp");
    } else if so_path.is_file() {
        println!("cargo:rustc-link-lib=dylib=_lightgbm");
    } else {
        panic!("both lib_lightgbm.a and lib_lightgbm.so not found in {dir}");
    }
}
fn build_macos() {
    if let Some(dir) = try_env_var("LIGHTGBM_LIB_DIR") {
        println!("cargo:rustc-link-search={dir}");
    }
    println!("cargo:rustc-link-lib=dylib=_lightgbm");
}

fn env_var(key: &str) -> String {
    try_env_var(key).unwrap_or_else(|| panic!("environment variable `{key}` is not set"))
}
fn try_env_var(key: &str) -> Option<String> {
    println!("cargo:rerun-if-env-changed={key}");
    env::var(key).ok()
}

fn rerun_if_changed(path: &Path) {
    println!("cargo:rerun-if-changed={}", path.display());
}