From c59c072d3fb1702470b4b300f8f8e5e329eb36d4 Mon Sep 17 00:00:00 2001 From: Jiahao XU <30436523+NobodyXu@users.noreply.github.com> Date: Thu, 16 Jan 2025 01:11:23 +1100 Subject: [PATCH] Add prefer_clang_cl_over_msvc --- src/lib.rs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 8f203427..8e1e848e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -332,6 +332,7 @@ pub struct Build { shell_escaped_flags: Option, build_cache: Arc, inherit_rustflags: bool, + prefer_clang_cl_over_msvc: bool, } /// Represents the types of errors that may occur while using cc-rs. @@ -458,6 +459,7 @@ impl Build { shell_escaped_flags: None, build_cache: Arc::default(), inherit_rustflags: true, + prefer_clang_cl_over_msvc: false, } } @@ -1359,6 +1361,14 @@ impl Build { self } + /// Prefer to use clang-cl over msvc. + /// + /// This option defaults to `false`. + pub fn prefer_clang_cl_over_msvc(&mut self, prefer_clang_cl_over_msvc: bool) -> &mut Build { + self.prefer_clang_cl_over_msvc = prefer_clang_cl_over_msvc; + self + } + #[doc(hidden)] pub fn __set_env(&mut self, a: A, b: B) -> &mut Build where @@ -2732,10 +2742,17 @@ impl Build { } let target = self.get_target()?; let raw_target = self.get_raw_target()?; - let (env, msvc, gnu, traditional, clang) = if self.cpp { - ("CXX", "cl.exe", "g++", "c++", "clang++") + + let msvc = if self.prefer_clang_cl_over_msvc { + "clang-cl.exe" + } else { + "cl.exe" + }; + + let (env, gnu, traditional, clang) = if self.cpp { + ("CXX", "g++", "c++", "clang++") } else { - ("CC", "cl.exe", "gcc", "cc", "clang") + ("CC", "gcc", "cc", "clang") }; // On historical Solaris systems, "cc" may have been Sun Studio, which @@ -2748,7 +2765,7 @@ impl Build { traditional }; - let cl_exe = self.windows_registry_find_tool(&target, "cl.exe"); + let cl_exe = self.windows_registry_find_tool(&target, msvc); let tool_opt: Option = self .env_tool(env)