Commit 21dff1c4e2
Changed files (6)
src/codegen.cpp
@@ -8801,6 +8801,7 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) {
Termination term;
ZigList<const char *> args = {};
+ args.append(buf_ptr(self_exe_path));
args.append("cc");
Buf *out_dep_path = buf_sprintf("%s.d", buf_ptr(out_obj_path));
@@ -8819,7 +8820,7 @@ static void gen_c_object(CodeGen *g, Buf *self_exe_path, CFile *c_file) {
if (g->verbose_cc) {
print_zig_cc_cmd("zig", &args);
}
- os_spawn_process(buf_ptr(self_exe_path), args, &term);
+ os_spawn_process(args, &term);
if (term.how != TerminationIdClean || term.code != 0) {
fprintf(stderr, "\nThe following command failed:\n");
print_zig_cc_cmd(buf_ptr(self_exe_path), &args);
src/libc_installation.cpp
@@ -153,6 +153,7 @@ static Error zig_libc_find_native_include_dir_posix(ZigLibCInstallation *self, b
const char *cc_exe = getenv("CC");
cc_exe = (cc_exe == nullptr) ? CC_EXE : cc_exe;
ZigList<const char *> args = {};
+ args.append(cc_exe);
args.append("-E");
args.append("-Wp,-v");
args.append("-xc");
@@ -166,7 +167,7 @@ static Error zig_libc_find_native_include_dir_posix(ZigLibCInstallation *self, b
Buf *out_stderr = buf_alloc();
Buf *out_stdout = buf_alloc();
Error err;
- if ((err = os_exec_process(cc_exe, args, &term, out_stderr, out_stdout))) {
+ if ((err = os_exec_process(args, &term, out_stderr, out_stdout))) {
if (verbose) {
fprintf(stderr, "unable to determine libc include path: executing '%s': %s\n", cc_exe, err_str(err));
}
@@ -277,12 +278,13 @@ Error zig_libc_cc_print_file_name(const char *o_file, Buf *out, bool want_dirnam
const char *cc_exe = getenv("CC");
cc_exe = (cc_exe == nullptr) ? CC_EXE : cc_exe;
ZigList<const char *> args = {};
+ args.append(cc_exe);
args.append(buf_ptr(buf_sprintf("-print-file-name=%s", o_file)));
Termination term;
Buf *out_stderr = buf_alloc();
Buf *out_stdout = buf_alloc();
Error err;
- if ((err = os_exec_process(cc_exe, args, &term, out_stderr, out_stdout))) {
+ if ((err = os_exec_process(args, &term, out_stderr, out_stdout))) {
if (err == ErrorFileNotFound)
return ErrorNoCCompilerInstalled;
if (verbose) {
src/link.cpp
@@ -1721,10 +1721,11 @@ void codegen_link(CodeGen *g) {
if (g->system_linker_hack && g->zig_target->os == OsMacOSX) {
Termination term;
ZigList<const char *> args = {};
+ args.append("ld");
for (size_t i = 1; i < lj.args.length; i += 1) {
args.append(lj.args.at(i));
}
- os_spawn_process("ld", args, &term);
+ os_spawn_process(args, &term);
if (term.how != TerminationIdClean || term.code != 0) {
exit(1);
}
src/main.cpp
@@ -467,6 +467,7 @@ int main(int argc, char **argv) {
init_all_targets();
ZigList<const char *> args = {0};
+ args.append(NULL); // placeholder
args.append(zig_exe_path);
args.append(NULL); // placeholder
args.append(NULL); // placeholder
@@ -525,8 +526,8 @@ int main(int argc, char **argv) {
g->enable_time_report = timing_info;
codegen_set_out_name(g, buf_create_from_str("build"));
- args.items[1] = buf_ptr(&build_file_dirname);
- args.items[2] = buf_ptr(&full_cache_dir);
+ args.items[2] = buf_ptr(&build_file_dirname);
+ args.items[3] = buf_ptr(&full_cache_dir);
bool build_file_exists;
if ((err = os_file_exists(&build_file_abs, &build_file_exists))) {
@@ -580,12 +581,14 @@ int main(int argc, char **argv) {
codegen_build_and_link(g);
Termination term;
- os_spawn_process(buf_ptr(&g->output_file_path), args, &term);
+ args.items[0] = buf_ptr(&g->output_file_path);
+ os_spawn_process(args, &term);
if (term.how != TerminationIdClean || term.code != 0) {
fprintf(stderr, "\nBuild failed. The following command failed:\n");
- fprintf(stderr, "%s", buf_ptr(&g->output_file_path));
+ const char *prefix = "";
for (size_t i = 0; i < args.length; i += 1) {
- fprintf(stderr, " %s", args.at(i));
+ fprintf(stderr, "%s%s", prefix, args.at(i));
+ prefix = " ";
}
fprintf(stderr, "\n");
}
@@ -1161,7 +1164,7 @@ int main(int argc, char **argv) {
args.pop();
Termination term;
- os_spawn_process(exec_path, args, &term);
+ os_spawn_process(args, &term);
return term.code;
} else if (cmd == CmdBuild) {
if (g->enable_cache) {
@@ -1213,17 +1216,10 @@ int main(int argc, char **argv) {
}
Termination 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_path), no_args, &term);
+ if (test_exec_args.length == 0) {
+ test_exec_args.append(buf_ptr(test_exe_path));
}
-
+ os_spawn_process(test_exec_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_path));
src/os.cpp
@@ -105,16 +105,15 @@ static void populate_termination(Termination *term, int status) {
}
}
-static void os_spawn_process_posix(const char *exe, ZigList<const char *> &args, Termination *term) {
- const char **argv = allocate<const char *>(args.length + 2);
- argv[0] = exe;
- argv[args.length + 1] = nullptr;
+static void os_spawn_process_posix(ZigList<const char *> &args, Termination *term) {
+ const char **argv = allocate<const char *>(args.length + 1);
for (size_t i = 0; i < args.length; i += 1) {
- argv[i + 1] = args.at(i);
+ argv[i] = args.at(i);
}
+ argv[args.length] = nullptr;
pid_t pid;
- int rc = posix_spawnp(&pid, exe, nullptr, nullptr, const_cast<char *const*>(argv), environ);
+ int rc = posix_spawnp(&pid, args.at(0), nullptr, nullptr, const_cast<char *const*>(argv), environ);
if (rc != 0) {
zig_panic("posix_spawn failed: %s", strerror(rc));
}
@@ -126,16 +125,14 @@ static void os_spawn_process_posix(const char *exe, ZigList<const char *> &args,
#endif
#if defined(ZIG_OS_WINDOWS)
-static void os_windows_create_command_line(Buf *command_line, const char *exe, ZigList<const char *> &args) {
- buf_resize(command_line, 0);
-
- buf_append_char(command_line, '\"');
- buf_append_str(command_line, exe);
- buf_append_char(command_line, '\"');
+static void os_windows_create_command_line(Buf *command_line, ZigList<const char *> &args) {
+ buf_resize(command_line, 0);
+ char *prefix = "\"";
for (size_t arg_i = 0; arg_i < args.length; arg_i += 1) {
- buf_append_str(command_line, " \"");
const char *arg = args.at(arg_i);
+ buf_append_str(command_line, prefix);
+ prefix = " \"";
size_t arg_len = strlen(arg);
for (size_t c_i = 0; c_i < arg_len; c_i += 1) {
if (arg[c_i] == '\"') {
@@ -147,14 +144,15 @@ static void os_windows_create_command_line(Buf *command_line, const char *exe, Z
}
}
-static void os_spawn_process_windows(const char *exe, ZigList<const char *> &args, Termination *term) {
+static void os_spawn_process_windows(ZigList<const char *> &args, Termination *term) {
Buf command_line = BUF_INIT;
- os_windows_create_command_line(&command_line, exe, args);
+ os_windows_create_command_line(&command_line, args);
PROCESS_INFORMATION piProcInfo = {0};
STARTUPINFO siStartInfo = {0};
siStartInfo.cb = sizeof(STARTUPINFO);
+ const char *exe = args.at(0);
BOOL success = CreateProcessA(exe, buf_ptr(&command_line), nullptr, nullptr, TRUE, 0, nullptr, nullptr,
&siStartInfo, &piProcInfo);
@@ -173,11 +171,11 @@ static void os_spawn_process_windows(const char *exe, ZigList<const char *> &arg
}
#endif
-void os_spawn_process(const char *exe, ZigList<const char *> &args, Termination *term) {
+void os_spawn_process(ZigList<const char *> &args, Termination *term) {
#if defined(ZIG_OS_WINDOWS)
- os_spawn_process_windows(exe, args, term);
+ os_spawn_process_windows(args, term);
#elif defined(ZIG_OS_POSIX)
- os_spawn_process_posix(exe, args, term);
+ os_spawn_process_posix(args, term);
#else
#error "missing os_spawn_process implementation"
#endif
@@ -785,7 +783,7 @@ Error os_file_exists(Buf *full_path, bool *result) {
}
#if defined(ZIG_OS_POSIX)
-static Error os_exec_process_posix(const char *exe, ZigList<const char *> &args,
+static Error os_exec_process_posix(ZigList<const char *> &args,
Termination *term, Buf *out_stderr, Buf *out_stdout)
{
int stdin_pipe[2];
@@ -817,13 +815,12 @@ static Error os_exec_process_posix(const char *exe, ZigList<const char *> &args,
if (dup2(stderr_pipe[1], STDERR_FILENO) == -1)
zig_panic("dup2 failed");
- const char **argv = allocate<const char *>(args.length + 2);
- argv[0] = exe;
- argv[args.length + 1] = nullptr;
+ const char **argv = allocate<const char *>(args.length + 1);
+ argv[args.length] = nullptr;
for (size_t i = 0; i < args.length; i += 1) {
- argv[i + 1] = args.at(i);
+ argv[i] = args.at(i);
}
- execvp(exe, const_cast<char * const *>(argv));
+ execvp(argv[0], const_cast<char * const *>(argv));
Error report_err = ErrorUnexpected;
if (errno == ENOENT) {
report_err = ErrorFileNotFound;
@@ -874,11 +871,11 @@ static Error os_exec_process_posix(const char *exe, ZigList<const char *> &args,
// LocalFree(messageBuffer);
//}
-static Error os_exec_process_windows(const char *exe, ZigList<const char *> &args,
+static Error os_exec_process_windows(ZigList<const char *> &args,
Termination *term, Buf *out_stderr, Buf *out_stdout)
{
Buf command_line = BUF_INIT;
- os_windows_create_command_line(&command_line, exe, args);
+ os_windows_create_command_line(&command_line, args);
HANDLE g_hChildStd_IN_Rd = NULL;
HANDLE g_hChildStd_IN_Wr = NULL;
@@ -925,6 +922,7 @@ static Error os_exec_process_windows(const char *exe, ZigList<const char *> &arg
siStartInfo.hStdInput = g_hChildStd_IN_Rd;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
+ const char *exe = args.at(0);
BOOL success = CreateProcess(exe, buf_ptr(&command_line), nullptr, nullptr, TRUE, 0, nullptr, nullptr,
&siStartInfo, &piProcInfo);
@@ -1005,13 +1003,13 @@ Error os_execv(const char *exe, const char **argv) {
#endif
}
-Error os_exec_process(const char *exe, ZigList<const char *> &args,
+Error os_exec_process(ZigList<const char *> &args,
Termination *term, Buf *out_stderr, Buf *out_stdout)
{
#if defined(ZIG_OS_WINDOWS)
- return os_exec_process_windows(exe, args, term, out_stderr, out_stdout);
+ return os_exec_process_windows(args, term, out_stderr, out_stdout);
#elif defined(ZIG_OS_POSIX)
- return os_exec_process_posix(exe, args, term, out_stderr, out_stdout);
+ return os_exec_process_posix(args, term, out_stderr, out_stdout);
#else
#error "missing os_exec_process implementation"
#endif
src/os.hpp
@@ -100,8 +100,8 @@ struct OsFileAttr {
int os_init(void);
-void os_spawn_process(const char *exe, ZigList<const char *> &args, Termination *term);
-Error os_exec_process(const char *exe, ZigList<const char *> &args,
+void os_spawn_process(ZigList<const char *> &args, Termination *term);
+Error os_exec_process(ZigList<const char *> &args,
Termination *term, Buf *out_stderr, Buf *out_stdout);
Error os_execv(const char *exe, const char **argv);