aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-09-20 12:52:54 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-09-20 12:52:54 -0400
commit3c41c2d84b8de5a95a322a3f0d8424adf6df8667 (patch)
tree0a0722e68311711a6b9dafafa3c713184cd13306 /src/main.cpp
parent32c51e015674af346aae1c3f40fed9ef098a6693 (diff)
parentc4a54377e3f07bbd2f9c54c1962c7941792c2c1f (diff)
downloadzig-3c41c2d84b8de5a95a322a3f0d8424adf6df8667.tar.gz
zig-3c41c2d84b8de5a95a322a3f0d8424adf6df8667.zip
Merge branch 'master' into c-to-zig
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp51
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));