Skip to content

Commit 88ca3c0

Browse files
Bug 1943149 - build(swgl): work around broken (upstream) cc::Tool detection of clang --driver-mode=cl r=#gfx-reviewers
In upstream, a new heuristic for detecting compiler families in `cc::Tool` was introduced. The heuristic we originally patched upstream is now the fallback heuristic, and does not get used for our `clang` compiler. This causes our interaction with default flags and `cc::Tool::is_like_msvc` to be incorrect in `swgl`, since `clang`'s CLI to use `cl`-like arguments, and rejects `clang`-like arguments. Work around this by detecting checking `Tool`s' base command and "wrapper arguments" to see if we're (1) using `clang` and (2) we have a wrapper argument matching `--driver-mode=cl`. If so, provide `cl`-like arguments in `swgl`, rather than `clang`-like arguments.
1 parent ae658df commit 88ca3c0

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

gfx/wr/swgl/build.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ fn translate_shader(
116116
let mut build = cc::Build::new();
117117
build.no_default_flags(true);
118118
if let Ok(tool) = build.try_get_compiler() {
119-
if tool.is_like_msvc() {
119+
if is_like_msvc(&tool) {
120120
build.flag("/EP");
121121
if tool.path().to_str().is_some_and(|p| p.contains("clang")) {
122122
build.flag("/clang:-undef");
@@ -185,7 +185,7 @@ fn main() {
185185
build.cpp(true);
186186

187187
if let Ok(tool) = build.try_get_compiler() {
188-
if tool.is_like_msvc() {
188+
if is_like_msvc(&tool) {
189189
build
190190
.flag("/std:c++17")
191191
.flag("/EHs-")
@@ -212,7 +212,7 @@ fn main() {
212212
// instructions makes things easier on the processor and in places where it matters we can
213213
// probably explicitly use reciprocal instructions and avoid the refinement step.
214214
// Also, allow checks for non-finite values which fast-math may disable.
215-
if tool.is_like_msvc() {
215+
if is_like_msvc(&tool) {
216216
build
217217
.flag("/fp:fast")
218218
.flag("-Xclang")
@@ -252,3 +252,20 @@ impl Drop for EnvVarGuard {
252252
}
253253
}
254254
}
255+
256+
fn is_like_msvc(tool: &cc::Tool) -> bool {
257+
tool.is_like_msvc() || {
258+
tool.is_like_clang()
259+
&& tool.to_command().get_args().any(|arg| {
260+
// `mozilla-central` does this funky thing where it replaces `clang-cl.exe` with
261+
// `clang.exe --driver-mode=cl`, which isn't considered by `Tool::is_like_msvc`, _but_
262+
// it forces the CLI to adhere to a `cl`-like interface and reject naively `clang`-like
263+
// arguments.
264+
//
265+
// See also `config/static-checking-config.mk`:
266+
// <https://searchfox.org/mozilla-central/rev/dd8b64a6198ff599a5eb2ca096845ebd6997457f/config/static-checking-config.mk>
267+
arg.to_str()
268+
.is_some_and(|a| a.starts_with("--driver-mode=cl"))
269+
})
270+
}
271+
}

0 commit comments

Comments
 (0)