diff options
| author | gingerBill <bill@gingerbill.org> | 2021-10-12 13:56:36 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-10-12 13:56:36 +0100 |
| commit | d0001dc11d702819c650e698f6d7c79c15095a13 (patch) | |
| tree | 1679ee1a24e917030b477f6c95e9bb9f1d1ace46 /src/main.cpp | |
| parent | 68719779d778bf6b0312f30938622fe2b1ef38ba (diff) | |
Increase `system_exec_command_line_app` buffer from 4 KiB to 64 MiB, and unify some logic
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 142 |
1 files changed, 63 insertions, 79 deletions
diff --git a/src/main.cpp b/src/main.cpp index d29b03cf6..27b6ab6d8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -67,34 +67,35 @@ gb_global Timings global_timings = {0}; // NOTE(bill): 'name' is used in debugging and profiling modes i32 system_exec_command_line_app(char const *name, char const *fmt, ...) { -#if defined(GB_SYSTEM_WINDOWS) - STARTUPINFOW start_info = {gb_size_of(STARTUPINFOW)}; - PROCESS_INFORMATION pi = {0}; + isize const cmd_cap = 64<<20; // 64 MiB should be more than enough + char *cmd_line = gb_alloc_array(gb_heap_allocator(), char, cmd_cap); isize cmd_len = 0; - isize const cmd_cap = 4096; - char cmd_line[cmd_cap] = {}; va_list va; - String16 cmd; i32 exit_code = 0; - - + + va_start(va, fmt); + cmd_len = gb_snprintf_va(cmd_line, cmd_cap-1, fmt, va); + va_end(va); + +#if defined(GB_SYSTEM_WINDOWS) + STARTUPINFOW start_info = {gb_size_of(STARTUPINFOW)}; + PROCESS_INFORMATION pi = {0}; + String16 wcmd = {}; + start_info.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; start_info.wShowWindow = SW_SHOW; start_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE); start_info.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); start_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); - va_start(va, fmt); - cmd_len = gb_snprintf_va(cmd_line, cmd_cap-1, fmt, va); - va_end(va); if (build_context.show_system_calls) { gb_printf_err("[SYSTEM CALL] %s\n", name); gb_printf_err("%.*s\n\n", cast(int)(cmd_len-1), cmd_line); } - cmd = string_to_string16(permanent_allocator(), make_string(cast(u8 *)cmd_line, cmd_len-1)); - if (CreateProcessW(nullptr, cmd.text, + wcmd = string_to_string16(permanent_allocator(), make_string(cast(u8 *)cmd_line, cmd_len-1)); + if (CreateProcessW(nullptr, wcmd.text, nullptr, nullptr, true, 0, nullptr, nullptr, &start_info, &pi)) { WaitForSingleObject(pi.hProcess, INFINITE); @@ -108,58 +109,19 @@ i32 system_exec_command_line_app(char const *name, char const *fmt, ...) { exit_code = -1; } - if (exit_code) { - exit(exit_code); - } - - return exit_code; - #elif defined(GB_SYSTEM_OSX) || defined(GB_SYSTEM_UNIX) - - char cmd_line[4096] = {0}; - isize cmd_len; - va_list va; - String cmd; - i32 exit_code = 0; - - va_start(va, fmt); - cmd_len = gb_snprintf_va(cmd_line, gb_size_of(cmd_line), fmt, va); - va_end(va); - cmd = make_string(cast(u8 *)&cmd_line, cmd_len-1); - if (build_context.show_system_calls) { gb_printf_err("[SYSTEM CALL] %s\n", name); gb_printf_err("%s\n\n", cmd_line); } exit_code = system(cmd_line); - // pid_t pid = fork(); - // int status = 0; - - // if(pid == 0) { - // // in child, pid == 0. - // int ret = execvp(cmd.text, (char* const*) cmd.text); - - // if(ret == -1) { - // gb_printf_err("Failed to execute command:\n\t%s\n", cmd_line); - - // // we're in the child, so returning won't do us any good -- just quit. - // exit(-1); - // } - - // // unreachable - // abort(); - // } else { - // // wait for child to finish, then we can continue cleanup - - // int s = 0; - // waitpid(pid, &s, 0); - - // status = WEXITSTATUS(s); - // } - - // exit_code = status - return exit_code; #endif + + if (exit_code) { + exit(exit_code); + } + + return exit_code; } @@ -173,10 +135,13 @@ i32 linker_stage(lbGenerator *gen) { if (is_arch_wasm()) { timings_start_section(timings, str_lit("wasm-ld")); - system_exec_command_line_app("wasm-ld", + result = system_exec_command_line_app("wasm-ld", "\"%.*s\\bin\\wasm-ld\" \"%.*s.wasm-obj\" -o \"%.*s.wasm\" %.*s %.*s", LIT(build_context.ODIN_ROOT), LIT(output_base), LIT(output_base), LIT(build_context.link_flags), LIT(build_context.extra_linker_flags)); + if (result) { + return result; + } } if (build_context.cross_compiling && selected_target_metrics->metrics == &target_essence_amd64) { @@ -298,23 +263,25 @@ i32 linker_stage(lbGenerator *gen) { LIT(output_base), LIT(build_context.resource_filepath) ); - - if (result == 0) { - result = system_exec_command_line_app("msvc-link", - "\"%.*slink.exe\" %s \"%.*s.res\" -OUT:\"%.*s.%s\" %s " - "/nologo /incremental:no /opt:ref /subsystem:%s " - " %.*s " - " %.*s " - " %s " - "", - LIT(find_result.vs_exe_path), object_files, LIT(output_base), LIT(output_base), output_ext, - link_settings, - subsystem_str, - LIT(build_context.link_flags), - LIT(build_context.extra_linker_flags), - lib_str - ); + + if (result) { + return result; } + + result = system_exec_command_line_app("msvc-link", + "\"%.*slink.exe\" %s \"%.*s.res\" -OUT:\"%.*s.%s\" %s " + "/nologo /incremental:no /opt:ref /subsystem:%s " + " %.*s " + " %.*s " + " %s " + "", + LIT(find_result.vs_exe_path), object_files, LIT(output_base), LIT(output_base), output_ext, + link_settings, + subsystem_str, + LIT(build_context.link_flags), + LIT(build_context.extra_linker_flags), + lib_str + ); } else { result = system_exec_command_line_app("msvc-link", "\"%.*slink.exe\" %s -OUT:\"%.*s.%s\" %s " @@ -331,8 +298,13 @@ i32 linker_stage(lbGenerator *gen) { lib_str ); } + + if (result) { + return result; + } + } else { // lld - result = system_exec_command_line_app("msvc-lld-link", + result = system_exec_command_line_app("msvc-lld-link", "\"%.*s\\bin\\lld-link\" %s -OUT:\"%.*s.%s\" %s " "/nologo /incremental:no /opt:ref /subsystem:%s " " %.*s " @@ -346,6 +318,10 @@ i32 linker_stage(lbGenerator *gen) { LIT(build_context.extra_linker_flags), lib_str ); + + if (result) { + return result; + } } #else timings_start_section(timings, str_lit("ld-link")); @@ -483,14 +459,22 @@ i32 linker_stage(lbGenerator *gen) { LIT(build_context.link_flags), LIT(build_context.extra_linker_flags), link_settings); + + if (result) { + return result; + } #if defined(GB_SYSTEM_OSX) if (build_context.ODIN_DEBUG) { // NOTE: macOS links DWARF symbols dynamically. Dsymutil will map the stubs in the exe // to the symbols in the object file - system_exec_command_line_app("dsymutil", + result = system_exec_command_line_app("dsymutil", "dsymutil %.*s%.*s", LIT(output_base), LIT(output_ext) ); + + if (result) { + return result; + } } #endif @@ -2495,11 +2479,11 @@ int main(int arg_count, char const **arg_ptr) { case BuildMode_Executable: case BuildMode_DynamicLibrary: i32 result = linker_stage(gen); - if (result != 0) { + if (result) { if (build_context.show_timings) { show_timings(checker, &global_timings); } - return 1; + return result; } break; } |