use std::process::{Command, Stdio}; use std::fs::{File}; use std::io::{Write}; use std::path::{Path, PathBuf}; use std::env::{self}; use pkg_config::Library; fn main() { println!("cargo:rerun-if-env-changed=PKG_CONFIG_PATH"); let slang_lib = pkg_config::Config::new() .atleast_version("1.2") .probe("slang") .unwrap(); generate_version_rs(&slang_lib); println!("cargo:rustc-link-lib=slang"); } fn generate_version_rs(lib: &Library) { let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); let c_file = Path::new(&out_dir).join("version.c"); let bin_file = Path::new(&out_dir).join("version"); let rs_file = Path::new(&out_dir).join("version.rs"); { let c_file_display = c_file.display(); let mut c_file = File::create(&c_file).expect(&format!("cannot create {}", c_file_display)); c_file.write_all(br##" #include #include int main() { printf("pub const SLANG_VERSION: u32 = %d;\n", SLANG_VERSION); printf("pub const SLANG_VERSION_STRING: &[u8] = b\"%s\\0\";\n", SLANG_VERSION_STRING); return 0; } "##).expect(&format!("cannot write {}", c_file_display)); } let mut build = cc::Build::new(); for include_path in lib.include_paths.iter() { build.include(include_path); } let mut compiler = build.try_get_compiler().unwrap().to_command(); compiler.arg("-o").arg(&bin_file).arg(&c_file); let compiler_status = compiler.stdin(Stdio::null()).status().expect(&format!("cannot compile {}", c_file.display())); if !compiler_status.success() { panic!("{} compilation failed with non-zero {}", c_file.display(), compiler_status); } let rs_file = File::create(&rs_file).expect(&format!("cannot create {}", rs_file.display())); Command::new(&bin_file).stdin(Stdio::null()).stdout(rs_file).status().expect(&format!("{} failed", bin_file.display())); }