From cab8fcc3a6ec1fc514b42cf43f5dfed91755d5a3 Mon Sep 17 00:00:00 2001 From: adumbidiot Date: Fri, 30 Oct 2020 20:58:28 -0700 Subject: [PATCH] Remove use of global node.lib cache --- build/src/windows.rs | 71 ++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 38 deletions(-) diff --git a/build/src/windows.rs b/build/src/windows.rs index 1deb581a..d493eea8 100644 --- a/build/src/windows.rs +++ b/build/src/windows.rs @@ -1,5 +1,7 @@ use crate::*; -use std::fs::{create_dir, metadata, write}; +use std::collections::hash_map::DefaultHasher; +use std::fs::{metadata, write}; +use std::hash::{Hash, Hasher}; use std::io::Read; use std::path::PathBuf; @@ -33,8 +35,11 @@ fn download_node_lib(dist_url: &str, version: &str, arch: &str) -> Vec { } pub fn setup() { + let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR is not set"); + // Assume nodejs if not specified. - let dist_url = std::env::var("NPM_CONFIG_DISTURL").unwrap_or("https://nodejs.org/dist".into()); + let dist_url = + std::env::var("NPM_CONFIG_DISTURL").unwrap_or_else(|_| "https://nodejs.org/dist".to_string()); // Try to get local nodejs version if not specified. let node_version = std::env::var("NPM_CONFIG_TARGET") @@ -62,55 +67,45 @@ pub fn setup() { println!("cargo:rerun-if-env-changed=NPM_CONFIG_DISTURL"); println!("cargo:rerun-if-env-changed=NPM_CONFIG_TARGET"); - let mut node_lib_file_dir = PathBuf::from( - String::from_utf8( - Command::new("node") - .arg("-e") - .arg("console.log(require('os').homedir())") - .output() - .unwrap() - .stdout, - ) - .unwrap() - .trim_end() - .to_owned(), + let mut node_lib_file_path = PathBuf::from(out_dir); + let link_search_dir = node_lib_file_path.clone(); + + // Hash the dist_url and store it in the node lib file name. + let dist_url_hash = { + let mut hasher = DefaultHasher::new(); + dist_url.hash(&mut hasher); + hasher.finish() + }; + + // Encode version, arch, and dist_url to detect and reaquire node.lib when these 3 change. + let node_lib_file_name = format!( + "node-{version}-{arch}-{dist_url_hash}.lib", + version = node_version, + arch = arch, + dist_url_hash = dist_url_hash ); + node_lib_file_path.push(&node_lib_file_name); - node_lib_file_dir.push(".napi-rs"); - - match create_dir(&node_lib_file_dir) { - Ok(_) => {} - Err(err) => { - if err.kind() != std::io::ErrorKind::AlreadyExists { - panic!( - "create {} folder failed: {}", - node_lib_file_dir.to_str().unwrap(), - err - ) - } - } - } - - let link_search_dir = node_lib_file_dir.clone(); - - node_lib_file_dir.push(format!("node-{}.lib", node_version)); - - if let Err(_) = metadata(&node_lib_file_dir) { + // If file does not exist, download it. + if metadata(&node_lib_file_path).is_err() { let node_lib = download_node_lib(&dist_url, &node_version, &arch); - write(&node_lib_file_dir, &node_lib).expect(&format!( + + write(&node_lib_file_path, &node_lib).expect(&format!( "Could not save file to {}", - node_lib_file_dir.to_str().unwrap() + node_lib_file_path.to_str().unwrap() )); } + println!( "cargo:rustc-link-lib={}", - &node_lib_file_dir.file_stem().unwrap().to_str().unwrap() + node_lib_file_path.file_stem().unwrap().to_str().unwrap() ); println!( "cargo:rustc-link-search=native={}", - link_search_dir.to_str().unwrap() + link_search_dir.display() ); println!("cargo:rustc-cdylib-link-arg=delayimp.lib"); println!("cargo:rustc-cdylib-link-arg=/DELAYLOAD:node.exe"); + setup_napi_feature(); }