zig cc: fix handling of -MM flag

Clang docs say:
> Like -MMD, but also implies -E and writes to stdout by default.

Previously, Zig handled this option by forwarding it directly to Clang,
and disabling depfiles. However this did not adhere to Clang's documented
behavior of these flags.

Now, in addition to being forwarded directly to Clang, `-MM` also
sets c_out_mode = .preprocessor, just like `-E`.

Another issue I noticed is that Zig did not recognize the aliases for
-MG, -MM, or -MMD. The aliases are now recognized.
This commit is contained in:
Andrew Kelley 2021-03-04 18:14:00 -07:00
parent 98b24aa47f
commit 041212a41c
3 changed files with 29 additions and 6 deletions

View File

@ -46,7 +46,7 @@ flagpd1("M"),
.{ .{
.name = "MM", .name = "MM",
.syntax = .flag, .syntax = .flag,
.zig_equivalent = .dep_file, .zig_equivalent = .dep_file_mm,
.pd1 = true, .pd1 = true,
.pd2 = false, .pd2 = false,
.psl = false, .psl = false,
@ -1878,7 +1878,7 @@ flagpsl("MT"),
.{ .{
.name = "print-missing-file-dependencies", .name = "print-missing-file-dependencies",
.syntax = .flag, .syntax = .flag,
.zig_equivalent = .other, .zig_equivalent = .dep_file,
.pd1 = false, .pd1 = false,
.pd2 = true, .pd2 = true,
.psl = false, .psl = false,
@ -1998,7 +1998,7 @@ flagpsl("MT"),
.{ .{
.name = "user-dependencies", .name = "user-dependencies",
.syntax = .flag, .syntax = .flag,
.zig_equivalent = .other, .zig_equivalent = .dep_file_mm,
.pd1 = false, .pd1 = false,
.pd2 = true, .pd2 = true,
.psl = false, .psl = false,
@ -2022,7 +2022,7 @@ flagpsl("MT"),
.{ .{
.name = "write-dependencies", .name = "write-dependencies",
.syntax = .flag, .syntax = .flag,
.zig_equivalent = .other, .zig_equivalent = .dep_file,
.pd1 = false, .pd1 = false,
.pd2 = true, .pd2 = true,
.psl = false, .psl = false,
@ -2030,7 +2030,7 @@ flagpsl("MT"),
.{ .{
.name = "write-user-dependencies", .name = "write-user-dependencies",
.syntax = .flag, .syntax = .flag,
.zig_equivalent = .other, .zig_equivalent = .dep_file,
.pd1 = false, .pd1 = false,
.pd2 = true, .pd2 = true,
.psl = false, .psl = false,

View File

@ -1192,6 +1192,12 @@ fn buildOutputType(
disable_c_depfile = true; disable_c_depfile = true;
try clang_argv.appendSlice(it.other_args); try clang_argv.appendSlice(it.other_args);
}, },
.dep_file_mm => { // -MM
// "Like -MMD, but also implies -E and writes to stdout by default"
c_out_mode = .preprocessor;
disable_c_depfile = true;
try clang_argv.appendSlice(it.other_args);
},
.framework_dir => try framework_dirs.append(it.only_arg), .framework_dir => try framework_dirs.append(it.only_arg),
.framework => try frameworks.append(it.only_arg), .framework => try frameworks.append(it.only_arg),
.nostdlibinc => want_native_include_dirs = false, .nostdlibinc => want_native_include_dirs = false,
@ -3055,6 +3061,7 @@ pub const ClangArgIterator = struct {
lib_dir, lib_dir,
mcpu, mcpu,
dep_file, dep_file,
dep_file_mm,
framework_dir, framework_dir,
framework, framework,
nostdlibinc, nostdlibinc,

View File

@ -268,6 +268,10 @@ const known_options = [_]KnownOpt{
.name = "MD", .name = "MD",
.ident = "dep_file", .ident = "dep_file",
}, },
.{
.name = "write-dependencies",
.ident = "dep_file",
},
.{ .{
.name = "MV", .name = "MV",
.ident = "dep_file", .ident = "dep_file",
@ -284,18 +288,30 @@ const known_options = [_]KnownOpt{
.name = "MG", .name = "MG",
.ident = "dep_file", .ident = "dep_file",
}, },
.{
.name = "print-missing-file-dependencies",
.ident = "dep_file",
},
.{ .{
.name = "MJ", .name = "MJ",
.ident = "dep_file", .ident = "dep_file",
}, },
.{ .{
.name = "MM", .name = "MM",
.ident = "dep_file", .ident = "dep_file_mm",
},
.{
.name = "user-dependencies",
.ident = "dep_file_mm",
}, },
.{ .{
.name = "MMD", .name = "MMD",
.ident = "dep_file", .ident = "dep_file",
}, },
.{
.name = "write-user-dependencies",
.ident = "dep_file",
},
.{ .{
.name = "MP", .name = "MP",
.ident = "dep_file", .ident = "dep_file",