diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2017-09-20 12:52:54 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2017-09-20 12:52:54 -0400 |
| commit | 3c41c2d84b8de5a95a322a3f0d8424adf6df8667 (patch) | |
| tree | 0a0722e68311711a6b9dafafa3c713184cd13306 /src/main.cpp | |
| parent | 32c51e015674af346aae1c3f40fed9ef098a6693 (diff) | |
| parent | c4a54377e3f07bbd2f9c54c1962c7941792c2c1f (diff) | |
| download | zig-3c41c2d84b8de5a95a322a3f0d8424adf6df8667.tar.gz zig-3c41c2d84b8de5a95a322a3f0d8424adf6df8667.zip | |
Merge branch 'master' into c-to-zig
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/src/main.cpp b/src/main.cpp index d6912ab6f2..ab37de95cd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,9 +20,9 @@ static int usage(const char *arg0) { fprintf(stderr, "Usage: %s [command] [options]\n" "Commands:\n" " build build project from build.zig\n" - " build_exe [source] create executable from source or object files\n" - " build_lib [source] create library from source or object files\n" - " build_obj [source] create object from source or assembly\n" + " build-exe [source] create executable from source or object files\n" + " build-lib [source] create library from source or object files\n" + " build-obj [source] create object from source or assembly\n" " parsec [source] convert c code to zig code\n" " targets list available compilation targets\n" " test [source] create and run a test build\n" @@ -47,9 +47,11 @@ static int usage(const char *arg0) { " --target-environ [name] specify target environment\n" " --target-os [name] specify target operating system\n" " --verbose turn on compiler debug output\n" + " --verbose-link turn on compiler debug output for linking only\n" " --zig-std-dir [path] directory where zig standard library resides\n" " -dirafter [dir] same as -isystem but do it last\n" " -isystem [dir] add additional search path for other .h files\n" + " -mllvm [arg] additional arguments to forward to LLVM's option processing\n" "Link Options:\n" " --ar-path [path] set the path to ar\n" " --dynamic-linker [path] set the path to ld.so\n" @@ -75,6 +77,8 @@ static int usage(const char *arg0) { "Test Options:\n" " --test-filter [text] skip tests that do not match filter\n" " --test-name-prefix [text] add prefix to all tests\n" + " --test-cmd [arg] specify test execution command one arg at a time\n" + " --test-cmd-bin appends test binary path to test cmd args\n" , arg0); return EXIT_FAILURE; } @@ -181,6 +185,7 @@ int main(int argc, char **argv) { OutType out_type = OutTypeUnknown; const char *out_name = nullptr; bool verbose = false; + bool verbose_link = false; ErrColor color = ErrColorAuto; const char *libc_lib_dir = nullptr; const char *libc_static_lib_dir = nullptr; @@ -188,6 +193,7 @@ int main(int argc, char **argv) { const char *zig_std_dir = nullptr; const char *dynamic_linker = nullptr; ZigList<const char *> clang_argv = {0}; + ZigList<const char *> llvm_argv = {0}; ZigList<const char *> lib_dirs = {0}; ZigList<const char *> link_libs = {0}; ZigList<const char *> frameworks = {0}; @@ -215,6 +221,7 @@ int main(int argc, char **argv) { const char *cache_dir = nullptr; CliPkg *cur_pkg = allocate<CliPkg>(1); BuildMode build_mode = BuildModeDebug; + ZigList<const char *> test_exec_args = {0}; if (argc >= 2 && strcmp(argv[1], "build") == 0) { const char *zig_exe_path = arg0; @@ -343,6 +350,8 @@ int main(int argc, char **argv) { is_static = true; } else if (strcmp(arg, "--verbose") == 0) { verbose = true; + } else if (strcmp(arg, "--verbose-link") == 0) { + verbose_link = true; } else if (strcmp(arg, "-mwindows") == 0) { mwindows = true; } else if (strcmp(arg, "-mconsole") == 0) { @@ -355,6 +364,8 @@ int main(int argc, char **argv) { each_lib_rpath = true; } else if (strcmp(arg, "--enable-timing-info") == 0) { timing_info = true; + } else if (strcmp(arg, "--test-cmd-bin") == 0) { + test_exec_args.append(nullptr); } else if (arg[1] == 'L' && arg[2] != 0) { // alias for --library-path lib_dirs.append(&arg[2]); @@ -415,6 +426,11 @@ int main(int argc, char **argv) { } else if (strcmp(arg, "-dirafter") == 0) { clang_argv.append("-dirafter"); clang_argv.append(argv[i]); + } else if (strcmp(arg, "-mllvm") == 0) { + clang_argv.append("-mllvm"); + clang_argv.append(argv[i]); + + llvm_argv.append(argv[i]); } else if (strcmp(arg, "--library-path") == 0 || strcmp(arg, "-L") == 0) { lib_dirs.append(argv[i]); } else if (strcmp(arg, "--library") == 0) { @@ -451,19 +467,21 @@ int main(int argc, char **argv) { ver_minor = atoi(argv[i]); } else if (strcmp(arg, "--ver-patch") == 0) { ver_patch = atoi(argv[i]); + } else if (strcmp(arg, "--test-cmd") == 0) { + test_exec_args.append(argv[i]); } else { fprintf(stderr, "Invalid argument: %s\n", arg); return usage(arg0); } } } else if (cmd == CmdInvalid) { - if (strcmp(arg, "build_exe") == 0) { + if (strcmp(arg, "build-exe") == 0) { cmd = CmdBuild; out_type = OutTypeExe; - } else if (strcmp(arg, "build_obj") == 0) { + } else if (strcmp(arg, "build-obj") == 0) { cmd = CmdBuild; out_type = OutTypeObj; - } else if (strcmp(arg, "build_lib") == 0) { + } else if (strcmp(arg, "build-lib") == 0) { cmd = CmdBuild; out_type = OutTypeLib; } else if (strcmp(arg, "version") == 0) { @@ -597,6 +615,7 @@ int main(int argc, char **argv) { codegen_set_each_lib_rpath(g, each_lib_rpath); codegen_set_clang_argv(g, clang_argv.items, clang_argv.length); + codegen_set_llvm_argv(g, llvm_argv.items, llvm_argv.length); codegen_set_strip(g, strip); codegen_set_is_static(g, is_static); if (libc_lib_dir) @@ -610,6 +629,7 @@ int main(int argc, char **argv) { if (dynamic_linker) codegen_set_dynamic_linker(g, buf_create_from_str(dynamic_linker)); codegen_set_verbose(g, verbose); + g->verbose_link = verbose_link; codegen_set_errmsg_color(g, color); for (size_t i = 0; i < lib_dirs.length; i += 1) { @@ -682,6 +702,12 @@ int main(int argc, char **argv) { Buf *test_exe_name = buf_sprintf("./test%s", target_exe_file_ext(non_null_target)); + for (size_t i = 0; i < test_exec_args.length; i += 1) { + if (test_exec_args.items[i] == nullptr) { + test_exec_args.items[i] = buf_ptr(test_exe_name); + } + } + codegen_build(g); codegen_link(g, buf_ptr(test_exe_name)); @@ -693,9 +719,18 @@ int main(int argc, char **argv) { return 0; } - ZigList<const char *> args = {0}; Termination term; - os_spawn_process(buf_ptr(test_exe_name), args, &term); + if (test_exec_args.length > 0) { + ZigList<const char *> rest_args = {0}; + for (size_t i = 1; i < test_exec_args.length; i += 1) { + rest_args.append(test_exec_args.at(i)); + } + os_spawn_process(test_exec_args.items[0], rest_args, &term); + } else { + ZigList<const char *> no_args = {0}; + os_spawn_process(buf_ptr(test_exe_name), no_args, &term); + } + if (term.how != TerminationIdClean || term.code != 0) { fprintf(stderr, "\nTests failed. Use the following command to reproduce the failure:\n"); fprintf(stderr, "%s\n", buf_ptr(test_exe_name)); |
