authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-01-01 11:48:36-08:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2021-01-01 11:48:36-08:00
log1cef0be01b80b087492c652b18304ec1946a81e6
treeaec40251834c2667528234bc77d200f972c880a2
parent93bb1d93cd18e739410009e7c77048d151a93b10
parentaa631cfd1f614a08b2fba2de22b46f8ad212894a
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #7640 from daurnimator/use-markInvalidUserInput

Don't process.exit() on invalid option use .markInvalidUserInput

1 files changed, 39 insertions(+), 32 deletions(-)

lib/std/build.zig+39-32
......@@ -471,32 +471,32 @@ pub const Builder = struct {
471471 } else if (mem.eql(u8, s, "false")) {
472472 return false;
473473 } else {
474 warn("Expected -D{} to be a boolean, but received '{}'\n", .{ name, s });
474 warn("Expected -D{} to be a boolean, but received '{}'\n\n", .{ name, s });
475475 self.markInvalidUserInput();
476476 return null;
477477 }
478478 },
479479 .List => {
480 warn("Expected -D{} to be a boolean, but received a list.\n", .{name});
480 warn("Expected -D{} to be a boolean, but received a list.\n\n", .{name});
481481 self.markInvalidUserInput();
482482 return null;
483483 },
484484 },
485485 .Int => switch (entry.value.value) {
486486 .Flag => {
487 warn("Expected -D{} to be an integer, but received a boolean.\n", .{name});
487 warn("Expected -D{} to be an integer, but received a boolean.\n\n", .{name});
488488 self.markInvalidUserInput();
489489 return null;
490490 },
491491 .Scalar => |s| {
492492 const n = std.fmt.parseInt(T, s, 10) catch |err| switch (err) {
493493 error.Overflow => {
494 warn("-D{} value {} cannot fit into type {}.\n", .{ name, s, @typeName(T) });
494 warn("-D{} value {} cannot fit into type {}.\n\n", .{ name, s, @typeName(T) });
495495 self.markInvalidUserInput();
496496 return null;
497497 },
498498 else => {
499 warn("Expected -D{} to be an integer of type {}.\n", .{ name, @typeName(T) });
499 warn("Expected -D{} to be an integer of type {}.\n\n", .{ name, @typeName(T) });
500500 self.markInvalidUserInput();
501501 return null;
502502 },
......@@ -504,34 +504,34 @@ pub const Builder = struct {
504504 return n;
505505 },
506506 .List => {
507 warn("Expected -D{} to be an integer, but received a list.\n", .{name});
507 warn("Expected -D{} to be an integer, but received a list.\n\n", .{name});
508508 self.markInvalidUserInput();
509509 return null;
510510 },
511511 },
512512 .Float => switch (entry.value.value) {
513513 .Flag => {
514 warn("Expected -D{} to be a float, but received a boolean.\n", .{name});
514 warn("Expected -D{} to be a float, but received a boolean.\n\n", .{name});
515515 self.markInvalidUserInput();
516516 return null;
517517 },
518518 .Scalar => |s| {
519519 const n = std.fmt.parseFloat(T, s) catch |err| {
520 warn("Expected -D{} to be a float of type {}.\n", .{ name, @typeName(T) });
520 warn("Expected -D{} to be a float of type {}.\n\n", .{ name, @typeName(T) });
521521 self.markInvalidUserInput();
522522 return null;
523523 };
524524 return n;
525525 },
526526 .List => {
527 warn("Expected -D{} to be a float, but received a list.\n", .{name});
527 warn("Expected -D{} to be a float, but received a list.\n\n", .{name});
528528 self.markInvalidUserInput();
529529 return null;
530530 },
531531 },
532532 .Enum => switch (entry.value.value) {
533533 .Flag => {
534 warn("Expected -D{} to be a string, but received a boolean.\n", .{name});
534 warn("Expected -D{} to be a string, but received a boolean.\n\n", .{name});
535535 self.markInvalidUserInput();
536536 return null;
537537 },
......@@ -539,25 +539,25 @@ pub const Builder = struct {
539539 if (std.meta.stringToEnum(T, s)) |enum_lit| {
540540 return enum_lit;
541541 } else {
542 warn("Expected -D{} to be of type {}.\n", .{ name, @typeName(T) });
542 warn("Expected -D{} to be of type {}.\n\n", .{ name, @typeName(T) });
543543 self.markInvalidUserInput();
544544 return null;
545545 }
546546 },
547547 .List => {
548 warn("Expected -D{} to be a string, but received a list.\n", .{name});
548 warn("Expected -D{} to be a string, but received a list.\n\n", .{name});
549549 self.markInvalidUserInput();
550550 return null;
551551 },
552552 },
553553 .String => switch (entry.value.value) {
554554 .Flag => {
555 warn("Expected -D{} to be a string, but received a boolean.\n", .{name});
555 warn("Expected -D{} to be a string, but received a boolean.\n\n", .{name});
556556 self.markInvalidUserInput();
557557 return null;
558558 },
559559 .List => {
560 warn("Expected -D{} to be a string, but received a list.\n", .{name});
560 warn("Expected -D{} to be a string, but received a list.\n\n", .{name});
561561 self.markInvalidUserInput();
562562 return null;
563563 },
......@@ -565,7 +565,7 @@ pub const Builder = struct {
565565 },
566566 .List => switch (entry.value.value) {
567567 .Flag => {
568 warn("Expected -D{} to be a list, but received a boolean.\n", .{name});
568 warn("Expected -D{} to be a list, but received a boolean.\n\n", .{name});
569569 self.markInvalidUserInput();
570570 return null;
571571 },
......@@ -615,7 +615,7 @@ pub const Builder = struct {
615615 else if (!release_fast and !release_safe and !release_small)
616616 builtin.Mode.Debug
617617 else x: {
618 warn("Multiple release modes (of -Drelease-safe, -Drelease-fast and -Drelease-small)", .{});
618 warn("Multiple release modes (of -Drelease-safe, -Drelease-fast and -Drelease-small)\n\n", .{});
619619 self.markInvalidUserInput();
620620 break :x builtin.Mode.Debug;
621621 };
......@@ -646,17 +646,19 @@ pub const Builder = struct {
646646 .diagnostics = &diags,
647647 }) catch |err| switch (err) {
648648 error.UnknownCpuModel => {
649 std.debug.warn("Unknown CPU: '{}'\nAvailable CPUs for architecture '{}':\n", .{
649 warn("Unknown CPU: '{}'\nAvailable CPUs for architecture '{}':\n", .{
650650 diags.cpu_name.?,
651651 @tagName(diags.arch.?),
652652 });
653653 for (diags.arch.?.allCpuModels()) |cpu| {
654 std.debug.warn(" {}\n", .{cpu.name});
654 warn(" {}\n", .{cpu.name});
655655 }
656 process.exit(1);
656 warn("\n", .{});
657 self.markInvalidUserInput();
658 return args.default_target;
657659 },
658660 error.UnknownCpuFeature => {
659 std.debug.warn(
661 warn(
660662 \\Unknown CPU feature: '{}'
661663 \\Available CPU features for architecture '{}':
662664 \\
......@@ -665,24 +667,29 @@ pub const Builder = struct {
665667 @tagName(diags.arch.?),
666668 });
667669 for (diags.arch.?.allFeaturesList()) |feature| {
668 std.debug.warn(" {}: {}\n", .{ feature.name, feature.description });
670 warn(" {}: {}\n", .{ feature.name, feature.description });
669671 }
670 process.exit(1);
672 warn("\n", .{});
673 self.markInvalidUserInput();
674 return args.default_target;
671675 },
672676 error.UnknownOperatingSystem => {
673 std.debug.warn(
677 warn(
674678 \\Unknown OS: '{}'
675679 \\Available operating systems:
676680 \\
677681 , .{diags.os_name});
678682 inline for (std.meta.fields(std.Target.Os.Tag)) |field| {
679 std.debug.warn(" {}\n", .{field.name});
683 warn(" {}\n", .{field.name});
680684 }
681 process.exit(1);
685 warn("\n", .{});
686 self.markInvalidUserInput();
687 return args.default_target;
682688 },
683689 else => |e| {
684 std.debug.warn("Unable to parse target '{}': {}\n", .{ triple, @errorName(e) });
685 process.exit(1);
690 warn("Unable to parse target '{}': {}\n\n", .{ triple, @errorName(e) });
691 self.markInvalidUserInput();
692 return args.default_target;
686693 },
687694 };
688695
......@@ -696,16 +703,16 @@ pub const Builder = struct {
696703 break :whitelist_check;
697704 }
698705 }
699 std.debug.warn("Chosen target '{}' does not match one of the supported targets:\n", .{
706 warn("Chosen target '{}' does not match one of the supported targets:\n", .{
700707 selected_canonicalized_triple,
701708 });
702709 for (list) |t| {
703710 const t_triple = t.zigTriple(self.allocator) catch unreachable;
704 std.debug.warn(" {}\n", .{t_triple});
711 warn(" {}\n", .{t_triple});
705712 }
706 // TODO instead of process exit, return error and have a zig build flag implemented by
707 // the build runner that turns process exits into error return traces
708 process.exit(1);
713 warn("\n", .{});
714 self.markInvalidUserInput();
715 return args.default_target;
709716 }
710717
711718 return selected_target;