diff options
Diffstat (limited to 'build.rs')
| -rw-r--r-- | build.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..3b9da80 --- /dev/null +++ b/build.rs @@ -0,0 +1,61 @@ +extern crate winreg; +#[macro_use] +extern crate failure; + +use std::env::var; +use std::path::{Path, PathBuf}; + +use winreg::enums::*; +use winreg::RegKey; + +use failure::Error; + +fn get_windows_kits_dir() -> Result<PathBuf, Error> { + let hklm = RegKey::predef(HKEY_LOCAL_MACHINE); + + let key = r"SOFTWARE\Microsoft\Windows Kits\Installed Roots"; + + let dir: String = hklm.open_subkey(key)?.get_value("KitsRoot10")?; + + Ok(dir.into()) +} + +fn get_km_dir(windows_kits_dir: &PathBuf) -> Result<PathBuf, Error> { + let readdir = Path::new(windows_kits_dir).join("lib").read_dir()?; + + let max_libdir = readdir + .filter_map(|dir| dir.ok()) + .map(|dir| dir.path()) + .filter(|dir| { + dir.components() + .last() + .and_then(|c| c.as_os_str().to_str()) + .map(|c| c.starts_with("10.") && dir.join("km").is_dir()) + .unwrap_or(false) + }).max() + .ok_or_else(|| format_err!("Can not find a valid km dir in `{:?}`", windows_kits_dir))?; + + Ok(max_libdir.join("km")) +} + +fn main() { + let windows_kits_dir = get_windows_kits_dir().unwrap(); + + let km_dir = get_km_dir(&windows_kits_dir).unwrap(); + + let target = var("TARGET").unwrap(); + + let arch = if target.contains("x86_64") { + "x64" + } else if target.contains("i686") { + "x86" + } else { + panic!("Only support x86_64 and i686!"); + }; + + let lib_dir = km_dir.join(arch); + println!( + "cargo:rustc-link-search=native={}", + lib_dir.to_str().unwrap() + ); +} |