diff options
| author | gingerBill <bill@gingerbill.org> | 2019-03-14 23:26:32 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2019-03-14 23:26:32 +0000 |
| commit | dbcd49acfc853d136935605222e5c824b621dbd9 (patch) | |
| tree | e5c519012773886c5e202791835e5647d3f90a1b /src | |
| parent | 291bf0c143081c5b3e577f6a6fbf90781de95096 (diff) | |
Add -pdb-name for custom names of PDBs
Diffstat (limited to 'src')
| -rw-r--r-- | src/build_settings.cpp | 1 | ||||
| -rw-r--r-- | src/main.cpp | 103 |
2 files changed, 71 insertions, 33 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d7b85644d..2b8f99e4c 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -92,6 +92,7 @@ struct BuildContext { String out_filepath; String resource_filepath; + String pdb_filepath; bool has_resource; String opt_flags; String llc_flags; diff --git a/src/main.cpp b/src/main.cpp index beda80cad..83397fa48 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,7 +18,7 @@ #include "ir_print.cpp" // NOTE(bill): 'name' is used in debugging and profiling modes -i32 system_exec_command_line_app(char *name, bool is_silent, char *fmt, ...) { +i32 system_exec_command_line_app(char *name, char *fmt, ...) { #if defined(GB_SYSTEM_WINDOWS) STARTUPINFOW start_info = {gb_size_of(STARTUPINFOW)}; PROCESS_INFORMATION pi = {0}; @@ -201,7 +201,6 @@ enum BuildFlagKind { BuildFlag_Invalid, BuildFlag_OutFile, - BuildFlag_ResourceFile, BuildFlag_OptimizationLevel, BuildFlag_ShowTimings, BuildFlag_ThreadCount, @@ -218,6 +217,11 @@ enum BuildFlagKind { BuildFlag_Vet, BuildFlag_IgnoreUnknownAttributes, +#if defined(GB_SYSTEM_WINDOWS) + BuildFlag_ResourceFile, + BuildFlag_WindowsPdbName, +#endif + BuildFlag_COUNT, }; @@ -281,7 +285,6 @@ ExactValue build_param_to_exact_value(String name, String param) { bool parse_build_flags(Array<String> args) { auto build_flags = array_make<BuildFlag>(heap_allocator(), 0, BuildFlag_COUNT); add_flag(&build_flags, BuildFlag_OutFile, str_lit("out"), BuildFlagParam_String); - add_flag(&build_flags, BuildFlag_ResourceFile, str_lit("resource"), BuildFlagParam_String); add_flag(&build_flags, BuildFlag_OptimizationLevel, str_lit("opt"), BuildFlagParam_Integer); add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_ThreadCount, str_lit("thread-count"), BuildFlagParam_Integer); @@ -298,6 +301,11 @@ bool parse_build_flags(Array<String> args) { add_flag(&build_flags, BuildFlag_Vet, str_lit("vet"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("-ignore-unknown-attributes"), BuildFlagParam_None); +#if defined(GB_SYSTEM_WINDOWS) + add_flag(&build_flags, BuildFlag_ResourceFile, str_lit("resource"), BuildFlagParam_String); + add_flag(&build_flags, BuildFlag_WindowsPdbName, str_lit("pdb-name"), BuildFlagParam_String); +#endif + GB_ASSERT(args.count >= 3); Array<String> flag_args = array_slice(args, 3, args.count); @@ -436,24 +444,6 @@ bool parse_build_flags(Array<String> args) { } break; } - case BuildFlag_ResourceFile: { - GB_ASSERT(value.kind == ExactValue_String); - String path = value.value_string; - path = string_trim_whitespace(path); - if (is_import_path_valid(path)) { - if(!string_ends_with(path, str_lit(".rc"))) { - gb_printf_err("Invalid -resource path %.*s, missing .rc\n", LIT(path)); - bad_flags = true; - break; - } - build_context.resource_filepath = substring(path, 0, string_extension_position(path)); - build_context.has_resource = true; - } else { - gb_printf_err("Invalid -resource path, got %.*s\n", LIT(path)); - bad_flags = true; - } - break; - } case BuildFlag_OptimizationLevel: GB_ASSERT(value.kind == ExactValue_Integer); build_context.optimization_level = cast(i32)big_int_to_i64(&value.value_integer); @@ -671,6 +661,48 @@ bool parse_build_flags(Array<String> args) { case BuildFlag_IgnoreUnknownAttributes: build_context.ignore_unknown_attributes = true; break; + + #if defined(GB_SYSTEM_WINDOWS) + case BuildFlag_ResourceFile: { + GB_ASSERT(value.kind == ExactValue_String); + String path = value.value_string; + path = string_trim_whitespace(path); + if (is_import_path_valid(path)) { + if(!string_ends_with(path, str_lit(".rc"))) { + gb_printf_err("Invalid -resource path %.*s, missing .rc\n", LIT(path)); + bad_flags = true; + break; + } + build_context.resource_filepath = substring(path, 0, string_extension_position(path)); + build_context.has_resource = true; + } else { + gb_printf_err("Invalid -resource path, got %.*s\n", LIT(path)); + bad_flags = true; + } + break; + } + case BuildFlag_WindowsPdbName: { + GB_ASSERT(value.kind == ExactValue_String); + String path = value.value_string; + path = string_trim_whitespace(path); + if (is_import_path_valid(path)) { + // #if defined(GB_SYSTEM_WINDOWS) + // String ext = path_extension(path); + // if (ext != ".pdb") { + // path = substring(path, 0, string_extension_position(path)); + // } + // #endif + build_context.pdb_filepath = path; + } else { + gb_printf_err("Invalid -pdb-name path, got %.*s\n", LIT(path)); + bad_flags = true; + } + break; + + break; + } + #endif + } } @@ -784,7 +816,7 @@ void remove_temp_files(String output_base) { i32 exec_llvm_opt(String output_base) { #if defined(GB_SYSTEM_WINDOWS) // For more passes arguments: http://llvm.org/docs/Passes.html - return system_exec_command_line_app("llvm-opt", false, + return system_exec_command_line_app("llvm-opt", "\"%.*sbin/opt\" \"%.*s.ll\" -o \"%.*s.bc\" %.*s " "", LIT(build_context.ODIN_ROOT), @@ -804,10 +836,10 @@ i32 exec_llvm_opt(String output_base) { i32 exec_llvm_llc(String output_base) { #if defined(GB_SYSTEM_WINDOWS) // For more arguments: http://llvm.org/docs/CommandGuide/llc.html - return system_exec_command_line_app("llvm-llc", false, + return system_exec_command_line_app("llvm-llc", "\"%.*sbin\\llc\" \"%.*s.bc\" -filetype=obj -O%d " "-o \"%.*s.obj\" " - "%.*s " + "%.*s" "", LIT(build_context.ODIN_ROOT), LIT(output_base), @@ -817,7 +849,7 @@ i32 exec_llvm_llc(String output_base) { #else // NOTE(zangent): Linux / Unix is unfinished and not tested very well. // For more arguments: http://llvm.org/docs/CommandGuide/llc.html - return system_exec_command_line_app("llc", false, + return system_exec_command_line_app("llc", "llc \"%.*s.bc\" -filetype=obj -relocation-model=pic -O%d " "%.*s " "%s" @@ -1041,6 +1073,11 @@ int main(int arg_count, char **arg_ptr) { } else { link_settings = gb_string_append_fmt(link_settings, "/ENTRY:mainCRTStartup"); } + + if (build_context.pdb_filepath != "") { + link_settings = gb_string_append_fmt(link_settings, " /PDB:%.*s", LIT(build_context.pdb_filepath)); + } + if (build_context.no_crt) { link_settings = gb_string_append_fmt(link_settings, " /nodefaultlib"); } else { @@ -1052,7 +1089,7 @@ int main(int arg_count, char **arg_ptr) { } if (!build_context.use_lld) { // msvc if (build_context.has_resource) { - exit_code = system_exec_command_line_app("msvc-link", true, + exit_code = system_exec_command_line_app("msvc-link", "rc /nologo /fo \"%.*s.res\" \"%.*s.rc\"", LIT(output_base), LIT(build_context.resource_filepath) @@ -1062,7 +1099,7 @@ int main(int arg_count, char **arg_ptr) { return exit_code; } - exit_code = system_exec_command_line_app("msvc-link", true, + exit_code = system_exec_command_line_app("msvc-link", "link \"%.*s.obj\" \"%.*s.res\" -OUT:\"%.*s.%s\" %s " "/nologo /incremental:no /opt:ref /subsystem:CONSOLE " " %.*s " @@ -1073,7 +1110,7 @@ int main(int arg_count, char **arg_ptr) { link_settings ); } else { - exit_code = system_exec_command_line_app("msvc-link", true, + exit_code = system_exec_command_line_app("msvc-link", "link \"%.*s.obj\" -OUT:\"%.*s.%s\" %s " "/nologo /incremental:no /opt:ref /subsystem:CONSOLE " " %.*s " @@ -1085,7 +1122,7 @@ int main(int arg_count, char **arg_ptr) { ); } } else { // lld - exit_code = system_exec_command_line_app("msvc-link", true, + exit_code = system_exec_command_line_app("msvc-link", "\"%.*s\\bin\\lld-link\" \"%.*s.obj\" -OUT:\"%.*s.%s\" %s " "/nologo /incremental:no /opt:ref /subsystem:CONSOLE " " %.*s " @@ -1109,7 +1146,7 @@ int main(int arg_count, char **arg_ptr) { remove_temp_files(output_base); if (run_output) { - system_exec_command_line_app("odin run", false, "%.*s.exe %.*s", LIT(output_base), LIT(run_args_string)); + system_exec_command_line_app("odin run", "%.*s.exe %.*s", LIT(output_base), LIT(run_args_string)); } #else timings_start_section(&timings, str_lit("ld-link")); @@ -1206,7 +1243,7 @@ int main(int arg_count, char **arg_ptr) { } #endif - exit_code = system_exec_command_line_app("ld-link", true, + exit_code = system_exec_command_line_app("ld-link", "%s \"%.*s.o\" -o \"%.*s%.*s\" %s " " %s " " %.*s " @@ -1235,7 +1272,7 @@ int main(int arg_count, char **arg_ptr) { 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 - exit_code = system_exec_command_line_app("dsymutil", true, + exit_code = system_exec_command_line_app("dsymutil", "dsymutil %.*s%.*s", LIT(output_base), LIT(output_ext) ); @@ -1256,7 +1293,7 @@ int main(int arg_count, char **arg_ptr) { //NOTE(thebirk): This whole thing is a little leaky String complete_path = concatenate_strings(heap_allocator(), output_base, output_ext); complete_path = path_to_full_path(heap_allocator(), complete_path); - system_exec_command_line_app("odin run", false, "\"%.*s\" %.*s", LIT(complete_path), LIT(run_args_string)); + system_exec_command_line_app("odin run", "\"%.*s\" %.*s", LIT(complete_path), LIT(run_args_string)); } #endif #endif |