@@ -351,6 +351,7 @@ pub struct Build {
351
351
shell_escaped_flags: Option<bool>,
352
352
build_cache: Arc<BuildCache>,
353
353
inherit_rustflags: bool,
354
+ prefer_clang_cl_over_msvc: bool,
354
355
}
355
356
356
357
/// Represents the types of errors that may occur while using cc-rs.
@@ -479,6 +480,7 @@ impl Build {
479
480
shell_escaped_flags: None,
480
481
build_cache: Arc::default(),
481
482
inherit_rustflags: true,
483
+ prefer_clang_cl_over_msvc: false,
482
484
}
483
485
}
484
486
@@ -1290,6 +1292,14 @@ impl Build {
1290
1292
self
1291
1293
}
1292
1294
1295
+ /// Prefer to use clang-cl over msvc.
1296
+ ///
1297
+ /// This option defaults to `false`.
1298
+ pub fn prefer_clang_cl_over_msvc(&mut self, prefer_clang_cl_over_msvc: bool) -> &mut Build {
1299
+ self.prefer_clang_cl_over_msvc = prefer_clang_cl_over_msvc;
1300
+ self
1301
+ }
1302
+
1293
1303
#[doc(hidden)]
1294
1304
pub fn __set_env<A, B>(&mut self, a: A, b: B) -> &mut Build
1295
1305
where
@@ -2868,10 +2878,17 @@ impl Build {
2868
2878
}
2869
2879
let target = self.get_target()?;
2870
2880
let raw_target = self.get_raw_target()?;
2871
- let (env, msvc, gnu, traditional, clang) = if self.cpp {
2872
- ("CXX", "cl.exe", "g++", "c++", "clang++")
2881
+
2882
+ let msvc = if self.prefer_clang_cl_over_msvc {
2883
+ "clang-cl.exe"
2884
+ } else {
2885
+ "cl.exe"
2886
+ };
2887
+
2888
+ let (env, gnu, traditional, clang) = if self.cpp {
2889
+ ("CXX", "g++", "c++", "clang++")
2873
2890
} else {
2874
- ("CC", "cl.exe", " gcc", "cc", "clang")
2891
+ ("CC", "gcc", "cc", "clang")
2875
2892
};
2876
2893
2877
2894
// On historical Solaris systems, "cc" may have been Sun Studio, which
@@ -2884,7 +2901,7 @@ impl Build {
2884
2901
traditional
2885
2902
};
2886
2903
2887
- let cl_exe = self.windows_registry_find_tool(&target, "cl.exe" );
2904
+ let cl_exe = self.windows_registry_find_tool(&target, msvc );
2888
2905
2889
2906
let tool_opt: Option<Tool> = self
2890
2907
.env_tool(env)
0 commit comments