#[cfg(feature = "rebuild-bindings")] extern crate bindgen; fn main() -> Result<(), Box> { use std::env; use std::fs::{self}; use std::path::{Path, PathBuf}; let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); let sdk_loc = if let Ok(sdk_loc) = env::var("STEAM_SDK_LOCATION") { Path::new(&sdk_loc).to_path_buf() } else { let mut path = PathBuf::new(); path.push(env::var("CARGO_MANIFEST_DIR").unwrap()); path.push("lib"); path.push("steam"); path }; println!("cargo:rerun-if-env-changed=STEAM_SDK_LOCATION"); let triple = env::var("TARGET").unwrap(); let mut lib = "steam_api"; let mut link_path = sdk_loc.join("redistributable_bin"); if triple.contains("windows") { if !triple.contains("i686") { lib = "steam_api64"; link_path.push("win64"); } } else if triple.contains("linux") { if triple.contains("i686") { link_path.push("linux32"); } else { link_path.push("linux64"); } } else if triple.contains("darwin") { link_path.push("osx"); } else { panic!("Unsupported OS"); }; if triple.contains("windows") { let dll_file = format!("{}.dll", lib); let lib_file = format!("{}.lib", lib); fs::copy(link_path.join(&dll_file), out_path.join(dll_file))?; fs::copy(link_path.join(&lib_file), out_path.join(lib_file))?; } else if triple.contains("darwin") { fs::copy( link_path.join("libsteam_api.dylib"), out_path.join("libsteam_api.dylib"), )?; } else if triple.contains("linux") { fs::copy( link_path.join("libsteam_api.so"), out_path.join("libsteam_api.so"), )?; } println!("cargo:rustc-link-search={}", out_path.display()); println!("cargo:rustc-link-lib=dylib={}", lib); #[cfg(feature = "rebuild-bindings")] { let target_os = if triple.contains("windows") { "windows" } else if triple.contains("darwin") { "macos" } else if triple.contains("linux") { "linux" } else { panic!("Unsupported OS"); }; let binding_path = Path::new(&format!("src/{}_bindings.rs", target_os)).to_owned(); let bindings = bindgen::Builder::default() .header( sdk_loc .join("public/steam/steam_api_flat.h") .to_string_lossy(), ) .header( sdk_loc .join("public/steam/steam_gameserver.h") .to_string_lossy(), ) .clang_arg("-xc++") .clang_arg("-std=c++11") .clang_arg(format!("-I{}", sdk_loc.join("public").display())) .rustfmt_bindings(true) .default_enum_style(bindgen::EnumVariation::Rust { non_exhaustive: true, }) .generate() .expect("Unable to generate bindings"); bindings .write_to_file(binding_path) .expect("Couldn't write bindings!"); } Ok(()) }