Skip to content

Commit 5e5efb0

Browse files
martyngiggemabrey
authored andcommitted
MSVC: Pass through further /external flags (mozilla#1141)
Adding /experimental:external or /experimental:W... causes caching to fail: [2022-03-14T09:34:13Z DEBUG sccache::server] check_compiler: Supported compiler [2022-03-14T09:34:13Z DEBUG sccache::server] parse_arguments: CannotCache(multiple input files): ["/nologo", "/TP", "-Dlibrary_EXPORTS", ... "/experimental:external", "/external:I", "C:\\src", "/external:W0", "/O2", "/Ob2", "/DNDEBUG", "-MD", "/showIncludes", "/Fosrc\\library\\CMakeFiles\\library.dir\\speak.cpp.obj", "/Fdsrc\\library\\CMakeFiles\\library.dir\\", "/FS", "-c", "C:\\src\\library\\speak.cpp"] This change adds the additional flags to the msvc_args macro and simply passes them on to the compiler. Tests have been added that use forward slashes instead of dashes
1 parent ba5bef4 commit 5e5efb0

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

src/compiler/msvc.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,10 +388,16 @@ msvc_args!(static ARGS: [ArgInfo<ArgData>; _] = [
388388
msvc_take_arg!("doc", PathBuf, Concatenated, TooHardPath), // Creates an .xdc file.
389389
msvc_take_arg!("errorReport:", OsString, Concatenated, PassThroughWithSuffix), // Deprecated.
390390
msvc_take_arg!("execution-charset:", OsString, Concatenated, PassThroughWithSuffix),
391+
msvc_flag!("experimental:external", PassThrough),
391392
msvc_flag!("experimental:module", TooHardFlag),
392393
msvc_flag!("experimental:module-", PassThrough), // Explicitly disabled modules.
393394
msvc_take_arg!("experimental:preprocessor", OsString, Concatenated, PassThroughWithSuffix),
394395
msvc_take_arg!("external:I", PathBuf, CanBeSeparated, ExternalIncludePath),
396+
msvc_flag!("external:W0", PassThrough),
397+
msvc_flag!("external:W1", PassThrough),
398+
msvc_flag!("external:W2", PassThrough),
399+
msvc_flag!("external:W3", PassThrough),
400+
msvc_flag!("external:W4", PassThrough),
395401
msvc_take_arg!("favor:", OsString, Concatenated, PassThroughWithSuffix),
396402
msvc_take_arg!("fp:", OsString, Concatenated, PassThroughWithSuffix),
397403
msvc_take_arg!("fsanitize-blacklist", PathBuf, Concatenated('='), ExtraHashFile),
@@ -1238,6 +1244,43 @@ mod test {
12381244
assert!(!msvc_show_includes);
12391245
}
12401246

1247+
#[test]
1248+
fn test_parse_arguments_external_warning_suppression_forward_slashes() {
1249+
// Parsing /external:W relies on /experimental:external being parsed
1250+
// and placed into common_args.
1251+
for n in 0..5 {
1252+
let args = ovec![
1253+
"-c",
1254+
"foo.c",
1255+
"/Fofoo.obj",
1256+
"/experimental:external",
1257+
format!("/external:W{}", n)
1258+
];
1259+
let ParsedArguments {
1260+
input,
1261+
language,
1262+
outputs,
1263+
preprocessor_args,
1264+
msvc_show_includes,
1265+
common_args,
1266+
..
1267+
} = match parse_arguments(args) {
1268+
CompilerArguments::Ok(args) => args,
1269+
o => panic!("Got unexpected parse result: {:?}", o),
1270+
};
1271+
assert_eq!(Some("foo.c"), input.to_str());
1272+
assert_eq!(Language::C, language);
1273+
assert_map_contains!(outputs, ("obj", PathBuf::from("foo.obj")));
1274+
assert_eq!(1, outputs.len());
1275+
assert!(preprocessor_args.is_empty());
1276+
assert_eq!(
1277+
common_args,
1278+
ovec!["/experimental:external", format!("/external:W{}", n)]
1279+
);
1280+
assert!(!msvc_show_includes);
1281+
}
1282+
}
1283+
12411284
#[test]
12421285
fn test_parse_arguments_empty_args() {
12431286
assert_eq!(CompilerArguments::NotCompilation, parse_arguments(vec!()));

0 commit comments

Comments
 (0)