authorgravatar for jay@jayschwa.netJay Petacat <jay@jayschwa.net> 2018-09-25 20:13:02-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-25 22:05:44-04:00
log7b204649e3af348a7831837d5a36219733b505ca
tree3bed18bc49e418054ab0f7d88c1df00532a04f66
parent2e562a5f366aabefd34a4191b2cd0b5e72d3d089

stage1: Added `zig help` to show usage on stdout

This will make it easier to do things like `zig help | grep something`. Invalid arguments will now display a short notice for `zig help` instead of showing the full usage information. This will make it easier to see the actual error.

1 files changed, 46 insertions(+), 28 deletions(-)

src/main.cpp+46-28
......@@ -16,14 +16,22 @@
1616
1717#include <stdio.h>
1818
19static int usage(const char *arg0) {
20 fprintf(stderr, "Usage: %s [command] [options]\n"
19static int print_error_usage(const char *arg0) {
20 fprintf(stderr, "See `%s help` for detailed usage information\n", arg0);
21 return EXIT_FAILURE;
22}
23
24static int print_full_usage(const char *arg0) {
25 fprintf(stdout,
26 "Usage: %s [command] [options]\n"
27 "\n"
2128 "Commands:\n"
2229 " build build project from build.zig\n"
2330 " build-exe [source] create executable from source or object files\n"
2431 " build-lib [source] create library from source or object files\n"
2532 " build-obj [source] create object from source or assembly\n"
2633 " builtin show the source code of that @import(\"builtin\")\n"
34 " help show this usage information\n"
2735 " id print the base64-encoded compiler id\n"
2836 " init-exe initialize a `zig build` application in the cwd\n"
2937 " init-lib initialize a `zig build` library in the cwd\n"
......@@ -33,6 +41,7 @@ static int usage(const char *arg0) {
3341 " test [source] create and run a test build\n"
3442 " version print version number and exit\n"
3543 " zen print zen of zig and exit\n"
44 "\n"
3645 "Compile Options:\n"
3746 " --assembly [source] add assembly file to build\n"
3847 " --cache-dir [path] override the cache directory\n"
......@@ -63,6 +72,7 @@ static int usage(const char *arg0) {
6372 " -dirafter [dir] same as -isystem but do it last\n"
6473 " -isystem [dir] add additional search path for other .h files\n"
6574 " -mllvm [arg] forward an arg to LLVM's option processing\n"
75 "\n"
6676 "Link Options:\n"
6777 " --dynamic-linker [path] set the path to ld.so\n"
6878 " --each-lib-rpath add rpath for each used dynamic library\n"
......@@ -87,13 +97,14 @@ static int usage(const char *arg0) {
8797 " --ver-major [ver] dynamic library semver major version\n"
8898 " --ver-minor [ver] dynamic library semver minor version\n"
8999 " --ver-patch [ver] dynamic library semver patch version\n"
100 "\n"
90101 "Test Options:\n"
91102 " --test-filter [text] skip tests that do not match filter\n"
92103 " --test-name-prefix [text] add prefix to all tests\n"
93104 " --test-cmd [arg] specify test execution command one arg at a time\n"
94105 " --test-cmd-bin appends test binary path to test cmd args\n"
95106 , arg0);
96 return EXIT_FAILURE;
107 return EXIT_SUCCESS;
97108}
98109
99110static const char *ZIG_ZEN = "\n"
......@@ -144,15 +155,16 @@ static int print_target_list(FILE *f) {
144155}
145156
146157enum Cmd {
147 CmdInvalid,
158 CmdNone,
148159 CmdBuild,
149160 CmdBuiltin,
161 CmdHelp,
150162 CmdRun,
163 CmdTargets,
151164 CmdTest,
165 CmdTranslateC,
152166 CmdVersion,
153167 CmdZen,
154 CmdTranslateC,
155 CmdTargets,
156168};
157169
158170static const char *default_zig_cache_name = "zig-cache";
......@@ -251,7 +263,7 @@ int main(int argc, char **argv) {
251263 if (init_kind != InitKindNone) {
252264 if (argc >= 3) {
253265 fprintf(stderr, "Unexpected extra argument: %s\n", argv[2]);
254 return usage(arg0);
266 return print_error_usage(arg0);
255267 }
256268 Buf *cmd_template_path = buf_alloc();
257269 os_path_join(get_zig_special_dir(), buf_create_from_str(init_cmd), cmd_template_path);
......@@ -326,7 +338,7 @@ int main(int argc, char **argv) {
326338 }
327339 }
328340
329 Cmd cmd = CmdInvalid;
341 Cmd cmd = CmdNone;
330342 EmitFileType emit_file_type = EmitFileTypeBinary;
331343 const char *in_file = nullptr;
332344 const char *out_file = nullptr;
......@@ -547,7 +559,7 @@ int main(int argc, char **argv) {
547559 } else if (strcmp(arg, "--pkg-begin") == 0) {
548560 if (i + 2 >= argc) {
549561 fprintf(stderr, "Expected 2 arguments after --pkg-begin\n");
550 return usage(arg0);
562 return print_error_usage(arg0);
551563 }
552564 CliPkg *new_cur_pkg = allocate<CliPkg>(1);
553565 i += 1;
......@@ -565,7 +577,7 @@ int main(int argc, char **argv) {
565577 cur_pkg = cur_pkg->parent;
566578 } else if (i + 1 >= argc) {
567579 fprintf(stderr, "Expected another argument after %s\n", arg);
568 return usage(arg0);
580 return print_error_usage(arg0);
569581 } else {
570582 i += 1;
571583 if (strcmp(arg, "--output") == 0) {
......@@ -581,7 +593,7 @@ int main(int argc, char **argv) {
581593 color = ErrColorOff;
582594 } else {
583595 fprintf(stderr, "--color options are 'auto', 'on', or 'off'\n");
584 return usage(arg0);
596 return print_error_usage(arg0);
585597 }
586598 } else if (strcmp(arg, "--cache") == 0) {
587599 if (strcmp(argv[i], "auto") == 0) {
......@@ -592,7 +604,7 @@ int main(int argc, char **argv) {
592604 enable_cache = CacheOptOff;
593605 } else {
594606 fprintf(stderr, "--cache options are 'auto', 'on', or 'off'\n");
595 return usage(arg0);
607 return print_error_usage(arg0);
596608 }
597609 } else if (strcmp(arg, "--emit") == 0) {
598610 if (strcmp(argv[i], "asm") == 0) {
......@@ -603,7 +615,7 @@ int main(int argc, char **argv) {
603615 emit_file_type = EmitFileTypeLLVMIr;
604616 } else {
605617 fprintf(stderr, "--emit options are 'asm', 'bin', or 'llvm-ir'\n");
606 return usage(arg0);
618 return print_error_usage(arg0);
607619 }
608620 } else if (strcmp(arg, "--name") == 0) {
609621 out_name = argv[i];
......@@ -672,10 +684,10 @@ int main(int argc, char **argv) {
672684 test_exec_args.append(argv[i]);
673685 } else {
674686 fprintf(stderr, "Invalid argument: %s\n", arg);
675 return usage(arg0);
687 return print_error_usage(arg0);
676688 }
677689 }
678 } else if (cmd == CmdInvalid) {
690 } else if (cmd == CmdNone) {
679691 if (strcmp(arg, "build-exe") == 0) {
680692 cmd = CmdBuild;
681693 out_type = OutTypeExe;
......@@ -685,6 +697,8 @@ int main(int argc, char **argv) {
685697 } else if (strcmp(arg, "build-lib") == 0) {
686698 cmd = CmdBuild;
687699 out_type = OutTypeLib;
700 } else if (strcmp(arg, "help") == 0) {
701 cmd = CmdHelp;
688702 } else if (strcmp(arg, "run") == 0) {
689703 cmd = CmdRun;
690704 out_type = OutTypeExe;
......@@ -703,7 +717,7 @@ int main(int argc, char **argv) {
703717 cmd = CmdBuiltin;
704718 } else {
705719 fprintf(stderr, "Unrecognized command: %s\n", arg);
706 return usage(arg0);
720 return print_error_usage(arg0);
707721 }
708722 } else {
709723 switch (cmd) {
......@@ -719,16 +733,17 @@ int main(int argc, char **argv) {
719733 }
720734 } else {
721735 fprintf(stderr, "Unexpected extra parameter: %s\n", arg);
722 return usage(arg0);
736 return print_error_usage(arg0);
723737 }
724738 break;
725739 case CmdBuiltin:
740 case CmdHelp:
726741 case CmdVersion:
727742 case CmdZen:
728743 case CmdTargets:
729744 fprintf(stderr, "Unexpected extra parameter: %s\n", arg);
730 return usage(arg0);
731 case CmdInvalid:
745 return print_error_usage(arg0);
746 case CmdNone:
732747 zig_unreachable();
733748 }
734749 }
......@@ -751,19 +766,19 @@ int main(int argc, char **argv) {
751766 if (target_arch) {
752767 if (parse_target_arch(target_arch, &target->arch)) {
753768 fprintf(stderr, "invalid --target-arch argument\n");
754 return usage(arg0);
769 return print_error_usage(arg0);
755770 }
756771 }
757772 if (target_os) {
758773 if (parse_target_os(target_os, &target->os)) {
759774 fprintf(stderr, "invalid --target-os argument\n");
760 return usage(arg0);
775 return print_error_usage(arg0);
761776 }
762777 }
763778 if (target_environ) {
764779 if (parse_target_environ(target_environ, &target->env_type)) {
765780 fprintf(stderr, "invalid --target-environ argument\n");
766 return usage(arg0);
781 return print_error_usage(arg0);
767782 }
768783 }
769784 }
......@@ -785,13 +800,13 @@ int main(int argc, char **argv) {
785800 {
786801 if (cmd == CmdBuild && !in_file && objects.length == 0 && asm_files.length == 0) {
787802 fprintf(stderr, "Expected source file argument or at least one --object or --assembly argument.\n");
788 return usage(arg0);
803 return print_error_usage(arg0);
789804 } else if ((cmd == CmdTranslateC || cmd == CmdTest || cmd == CmdRun) && !in_file) {
790805 fprintf(stderr, "Expected source file argument.\n");
791 return usage(arg0);
806 return print_error_usage(arg0);
792807 } else if (cmd == CmdBuild && out_type == OutTypeObj && objects.length != 0) {
793808 fprintf(stderr, "When building an object file, --object arguments are invalid.\n");
794 return usage(arg0);
809 return print_error_usage(arg0);
795810 }
796811
797812 assert(cmd != CmdBuild || out_type != OutTypeUnknown);
......@@ -820,7 +835,7 @@ int main(int argc, char **argv) {
820835
821836 if (need_name && buf_out_name == nullptr) {
822837 fprintf(stderr, "--name [name] not provided and unable to infer\n\n");
823 return usage(arg0);
838 return print_error_usage(arg0);
824839 }
825840
826841 Buf *zig_root_source_file = (cmd == CmdTranslateC) ? nullptr : in_file_buf;
......@@ -1012,6 +1027,8 @@ int main(int argc, char **argv) {
10121027 zig_unreachable();
10131028 }
10141029 }
1030 case CmdHelp:
1031 return print_full_usage(arg0);
10151032 case CmdVersion:
10161033 printf("%s\n", ZIG_VERSION_STRING);
10171034 return EXIT_SUCCESS;
......@@ -1020,7 +1037,8 @@ int main(int argc, char **argv) {
10201037 return EXIT_SUCCESS;
10211038 case CmdTargets:
10221039 return print_target_list(stdout);
1023 case CmdInvalid:
1024 return usage(arg0);
1040 case CmdNone:
1041 fprintf(stderr, "Zig programming language\n");
1042 return print_error_usage(arg0);
10251043 }
10261044}