summaryrefslogtreecommitdiff
path: root/build.rs
diff options
context:
space:
mode:
authorHarry Fei <[email protected]>2018-09-30 17:53:14 +0800
committerHarry Fei <[email protected]>2018-10-08 16:54:05 +0800
commitc22b255d6f91d7b2420fe20038cefb2b116821bf (patch)
tree038239674bf2f5daa2a98ff6871fe5df1dd615b5 /build.rs
downloadwin-kmd-alloc-master.tar.xz
win-kmd-alloc-master.zip
init commitHEADmaster
Diffstat (limited to 'build.rs')
-rw-r--r--build.rs61
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()
+ );
+}