From cbabc80d92e025a79689931a2ef838ad5c502bd1 Mon Sep 17 00:00:00 2001 From: Mikkel Hjortshoej Date: Mon, 5 Mar 2018 11:46:50 +0100 Subject: [PATCH] Calls rc.exe if -resource specified --- src/build_settings.cpp | 2 ++ src/main.cpp | 72 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 11f52d258..f01b6a3ad 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -16,6 +16,8 @@ struct BuildContext { String command; String out_filepath; + String resource_filepath; + bool has_resource; String opt_flags; String llc_flags; String link_flags; diff --git a/src/main.cpp b/src/main.cpp index f2fde5dc8..53190fbfd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -46,7 +46,6 @@ i32 system_exec_command_line_app(char *name, bool is_silent, char *fmt, ...) { defer (gb_temp_arena_memory_end(tmp)); cmd = string_to_string16(string_buffer_allocator, make_string(cast(u8 *)cmd_line, cmd_len-1)); - if (CreateProcessW(nullptr, cmd.text, nullptr, nullptr, true, 0, nullptr, nullptr, &start_info, &pi)) { @@ -202,6 +201,7 @@ enum BuildFlagKind { BuildFlag_Invalid, BuildFlag_OutFile, + BuildFlag_ResourceFile, BuildFlag_OptimizationLevel, BuildFlag_ShowTimings, BuildFlag_ThreadCount, @@ -241,6 +241,7 @@ void add_flag(Array *build_flags, BuildFlagKind kind, String name, Bu bool parse_build_flags(Array args) { auto build_flags = array_make(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); @@ -388,6 +389,24 @@ bool parse_build_flags(Array 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, got %.*s\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)value.value_integer; @@ -602,6 +621,7 @@ void remove_temp_files(String output_base) { EXT_REMOVE(".bc"); #if defined(GB_SYSTEM_WINDOWS) EXT_REMOVE(".obj"); + EXT_REMOVE(".res"); #else EXT_REMOVE(".o"); #endif @@ -839,18 +859,44 @@ int main(int arg_count, char **arg_ptr) { link_settings = gb_string_append_fmt(link_settings, " /DEBUG"); } - exit_code = system_exec_command_line_app("msvc-link", true, - "link \"%.*s.obj\" -OUT:\"%.*s.%s\" %s " - "/defaultlib:libcmt " - // "/nodefaultlib " - "/nologo /incremental:no /opt:ref /subsystem:CONSOLE " - " %.*s " - " %s " - "", - LIT(output_base), LIT(output_base), output_ext, - lib_str, LIT(build_context.link_flags), - link_settings - ); + if(build_context.has_resource) { + exit_code = system_exec_command_line_app("msvc-link", true, + "rc /nologo /fo \"%.*s.res\" \"%.*s.rc\"", + LIT(output_base), + LIT(build_context.resource_filepath) + ); + + if (exit_code != 0) { + return exit_code; + } + + exit_code = system_exec_command_line_app("msvc-link", true, + "link \"%.*s.obj\" \"%.*s.res\" -OUT:\"%.*s.%s\" %s " + "/defaultlib:libcmt " + // "/nodefaultlib " + "/nologo /incremental:no /opt:ref /subsystem:CONSOLE " + " %.*s " + " %s " + "", + LIT(output_base), LIT(output_base), LIT(output_base), output_ext, + lib_str, LIT(build_context.link_flags), + link_settings + ); + } else { + exit_code = system_exec_command_line_app("msvc-link", true, + "link \"%.*s.obj\" -OUT:\"%.*s.%s\" %s " + "/defaultlib:libcmt " + // "/nodefaultlib " + "/nologo /incremental:no /opt:ref /subsystem:CONSOLE " + " %.*s " + " %s " + "", + LIT(output_base), LIT(output_base), output_ext, + lib_str, LIT(build_context.link_flags), + link_settings + ); + } + if (exit_code != 0) { return exit_code; }