Browse Source

Set env vars for clang-cl invocations

wintest
Alex Crichton 7 years ago
parent
commit
0b89a4072d
  1. 27
      src/lib.rs

27
src/lib.rs

@ -1495,6 +1495,8 @@ impl Build {
traditional traditional
}; };
let cl_exe = windows_registry::find_tool(&target, "cl.exe");
let tool_opt: Option<Tool> = self.env_tool(env) let tool_opt: Option<Tool> = self.env_tool(env)
.map(|(tool, cc, args)| { .map(|(tool, cc, args)| {
// chop off leading/trailing whitespace to work around // chop off leading/trailing whitespace to work around
@ -1526,7 +1528,7 @@ impl Build {
None None
} }
}) })
.or_else(|| windows_registry::find_tool(&target, "cl.exe")); .or_else(|| cl_exe.clone());
let tool = match tool_opt { let tool = match tool_opt {
Some(t) => t, Some(t) => t,
@ -1599,7 +1601,7 @@ impl Build {
} }
}; };
let tool = if self.cuda { let mut tool = if self.cuda {
assert!( assert!(
tool.args.is_empty(), tool.args.is_empty(),
"CUDA compilation currently assumes empty pre-existing args" "CUDA compilation currently assumes empty pre-existing args"
@ -1617,6 +1619,27 @@ impl Build {
tool tool
}; };
// If we found `cl.exe` in our environment, the tool we're returning is
// an MSVC-like tool, *and* no env vars were set then set env vars for
// the tool that we're returning.
//
// Env vars are needed for things like `link.exe` being put into PATH as
// well as header include paths sometimes. These paths are automatically
// included by default but if the `CC` or `CXX` env vars are set these
// won't be used. This'll ensure that when the env vars are used to
// configure for invocations like `clang-cl` we still get a "works out
// of the box" experience.
if let Some(cl_exe) = cl_exe {
if tool.family == ToolFamily::Msvc &&
tool.env.len() == 0 &&
target.contains("msvc")
{
for (k, v) in cl_exe.env.iter() {
tool.env.push((k.to_owned(), v.to_owned()));
}
}
}
Ok(tool) Ok(tool)
} }

Loading…
Cancel
Save