diff options
| author | Harry Fei <[email protected]> | 2018-09-30 17:53:14 +0800 |
|---|---|---|
| committer | Harry Fei <[email protected]> | 2018-10-08 16:47:01 +0800 |
| commit | 7dc14791e3e1e0e7cac4b3c2cbb6ea25b5fa2fa5 (patch) | |
| tree | 038239674bf2f5daa2a98ff6871fe5df1dd615b5 /build.rs | |
| download | win-kmd-alloc-rebase.tar.xz win-kmd-alloc-rebase.zip | |
init commitrebase
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() + ); +} |