|
|
@ -217,6 +217,34 @@ mod impl_ { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
fn vs16_instance() -> Option<PathBuf> { |
|
|
|
vs15_instances()?.find_map(|instance| { |
|
|
|
let instance = instance.ok()?; |
|
|
|
let installation_name = instance.installation_name().ok()?;; |
|
|
|
if installation_name.to_str()?.starts_with("VisualStudio/16.") { |
|
|
|
Some(PathBuf::from(instance.installation_path().ok()?)) |
|
|
|
} else { |
|
|
|
None |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
fn find_tool_in_vs16_path(tool: &str, target: &str) -> Option<Tool> { |
|
|
|
let path = vs16_instance()?.join(tool); |
|
|
|
if !path.is_file() { |
|
|
|
return None; |
|
|
|
} |
|
|
|
let mut tool = Tool::new(path); |
|
|
|
if target.contains("x86_64") { |
|
|
|
tool.env.push(("Platform".into(), "X64".into())); |
|
|
|
} |
|
|
|
Some(tool) |
|
|
|
} |
|
|
|
|
|
|
|
fn find_msbuild_vs16(target: &str) -> Option<Tool> { |
|
|
|
find_tool_in_vs16_path(r"MSBuild\Current\Bin\MSBuild.exe", target) |
|
|
|
} |
|
|
|
|
|
|
|
// In MSVC 15 (2017) MS once again changed the scheme for locating
|
|
|
|
// the tooling. Now we must go through some COM interfaces, which
|
|
|
|
// is super fun for Rust.
|
|
|
@ -662,6 +690,10 @@ mod impl_ { |
|
|
|
|
|
|
|
pub fn has_msbuild_version(version: &str) -> bool { |
|
|
|
match version { |
|
|
|
"16.0" => { |
|
|
|
find_msbuild_vs16("x86_64-pc-windows-msvc").is_some() |
|
|
|
|| find_msbuild_vs16("i686-pc-windows-msvc").is_some() |
|
|
|
} |
|
|
|
"15.0" => { |
|
|
|
find_msbuild_vs15("x86_64-pc-windows-msvc").is_some() |
|
|
|
|| find_msbuild_vs15("i686-pc-windows-msvc").is_some() |
|
|
|