diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 3f157cfb..60dbe25a 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -310,8 +310,8 @@ lnk_make_linker_manifest(Arena *arena, return srl; } -internal String8 -lnk_merge_manifest_files(Arena *arena, String8 mt_path, String8 manifest_name, String8List manifest_path_list) +internal void +lnk_merge_manifest_files(Arena *arena, String8 mt_path, String8 manifest_name, String8 output_name, String8List manifest_path_list) { ProfBeginFunction(); @@ -328,7 +328,7 @@ lnk_merge_manifest_files(Arena *arena, String8 mt_path, String8 manifest_name, S str8_list_pushf(arena, &invoke_cmd_line, "-manifest"); str8_list_push(arena, &invoke_cmd_line, full_path); } - str8_list_pushf(arena, &invoke_cmd_line, "-out:%S", manifest_name); + str8_list_pushf(arena, &invoke_cmd_line, "-out:%S", output_name); str8_list_pushf(arena, &invoke_cmd_line, "-nologo"); OS_ProcessLaunchParams launch_opts = {0}; @@ -351,7 +351,6 @@ lnk_merge_manifest_files(Arena *arena, String8 mt_path, String8 manifest_name, S scratch_end(scratch); ProfEnd(); - return manifest_name; } internal String8 lnk_res_from_data(Arena *arena, String8 data) @@ -3824,25 +3823,26 @@ lnk_run(int argc, char **argv) lnk_write_data_list_to_file_path(linker_manifest_path, linker_manifest_data_list); str8_list_push(tp_arena->v[0], &input_manifest_path_list, linker_manifest_path); - String8 manifest_path = lnk_merge_manifest_files(tp_arena->v[0], config->mt_path, config->manifest_name, input_manifest_path_list); + String8 merged_manifest_path = push_str8f(scratch.arena, "%S.manifest.merged", config->manifest_name); + lnk_merge_manifest_files(tp_arena->v[0], config->mt_path, config->manifest_name, merged_manifest_path, input_manifest_path_list); if (config->manifest_opt == LNK_ManifestOpt_Embed) { // TODO: currently we convert manifest to res and parse res again, this unnecessary instead push manifest // resource to the tree directly - String8 manifest_data = os_data_from_file_path(scratch.arena, manifest_path); + String8 manifest_data = os_data_from_file_path(scratch.arena, merged_manifest_path); if (manifest_data.size == 0) { - lnk_error(LNK_Error_Mt, "unable to locate manifest to embed on disk, path \"%S\"", manifest_path); + lnk_error(LNK_Error_Mt, "unable to locate manifest to embed on disk, path \"%S\"", merged_manifest_path); } String8 manifest_res = lnk_res_from_data(tp_arena->v[0], manifest_data); str8_list_push(tp_arena->v[0], &res_data_list, manifest_res); - str8_list_push(tp_arena->v[0], &res_path_list, manifest_path); + str8_list_push(tp_arena->v[0], &res_path_list, merged_manifest_path); } // cleanup disk os_delete_file_at_path(linker_manifest_path); if (config->delete_manifest == LNK_SwitchState_Yes) { - os_delete_file_at_path(manifest_path); + os_delete_file_at_path(merged_manifest_path); } } } diff --git a/src/linker/lnk.h b/src/linker/lnk.h index 77fbef6f..fc30306e 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -253,7 +253,7 @@ internal void lnk_push_loaded_lib(Arena *arena, HashTable *default_lib_ht, Ha // Manifest internal String8List lnk_make_linker_manifest(Arena *arena, B32 manifest_uac, String8 manifest_level, String8 manifest_ui_access, String8List manifest_dependency_list); -internal String8 lnk_merge_manifest_files(Arena *arena, String8 mt_path, String8 manifest_name, String8List manifest_path_list); +internal void lnk_merge_manifest_files(Arena *arena, String8 mt_path, String8 manifest_name, String8 output_name, String8List manifest_path_list); internal String8 lnk_res_from_data(Arena *arena, String8 data); //////////////////////////////// diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index dd50c19b..aef66a52 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -877,6 +877,7 @@ lnk_config_from_cmd_line(Arena *arena, String8List raw_cmd_line) lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapInternal, "0x1000"); lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapWeak, "0x3ffff"); lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SymbolTableCapLib, "0x3ffff"); + lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DeleteManifest, ""); #if !BUILD_DEBUG //lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SuppressError, "37");