From c697ee728b60e259723730384ecf784f5f9375ec Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 11 Aug 2021 11:58:17 +0200 Subject: [PATCH] winegcc: Add a helper function to build the .spec.o file. Signed-off-by: Alexandre Julliard --- tools/winegcc/winegcc.c | 176 ++++++++++++++++++++++------------------ 1 file changed, 97 insertions(+), 79 deletions(-) diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index fd2d2c2a794..b756c5a97f8 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -1120,10 +1120,105 @@ static void add_library( struct options *opts, strarray *lib_dirs, strarray *fil free(fullname); } +/* run winebuild to generate the .spec.o file */ +static const char *build_spec_obj( struct options *opts, const char *spec_file, const char *output_file, + strarray *files, strarray *lib_dirs, const char *entry_point ) +{ + unsigned int i; + int is_pe = is_pe_target( opts ); + strarray *spec_args = get_winebuild_args( opts ); + strarray *tool; + const char *spec_o_name, *output_name; + int fake_module = strendswith(output_file, ".fake"); + + /* get the filename from the path */ + if ((output_name = strrchr(output_file, '/'))) output_name++; + else output_name = output_file; + + if ((tool = build_tool_name( opts, TOOL_CC ))) strarray_add( spec_args, strmake( "--cc-cmd=%s", strarray_tostring( tool, " " ))); + if (!is_pe && (tool = build_tool_name( opts, TOOL_LD ))) strarray_add( spec_args, strmake( "--ld-cmd=%s", strarray_tostring( tool, " " ))); + + spec_o_name = get_temp_file(output_name, ".spec.o"); + if (opts->force_pointer_size) + strarray_add(spec_args, strmake("-m%u", 8 * opts->force_pointer_size )); + if (opts->pic && !is_pe) strarray_add(spec_args, "-fPIC"); + strarray_add(spec_args, opts->shared ? "--dll" : "--exe"); + if (fake_module) + { + strarray_add(spec_args, "--fake-module"); + strarray_add(spec_args, "-o"); + strarray_add(spec_args, output_file); + } + else + { + strarray_add(spec_args, "-o"); + strarray_add(spec_args, spec_o_name); + } + if (spec_file) + { + strarray_add(spec_args, "-E"); + strarray_add(spec_args, spec_file); + } + + if (!opts->shared) + { + strarray_add(spec_args, "-F"); + strarray_add(spec_args, output_name); + strarray_add(spec_args, "--subsystem"); + strarray_add(spec_args, opts->gui_app ? "windows" : "console"); + if (opts->large_address_aware) strarray_add( spec_args, "--large-address-aware" ); + } + + if (opts->target_platform == PLATFORM_WINDOWS) strarray_add(spec_args, "--safeseh"); + + if (entry_point) + { + strarray_add(spec_args, "--entry"); + strarray_add(spec_args, entry_point); + } + + if (opts->subsystem) + { + strarray_add(spec_args, "--subsystem"); + strarray_add(spec_args, opts->subsystem); + } + + for (i = 0; i < lib_dirs->size; i++) + strarray_add(spec_args, strmake("-L%s", lib_dirs->base[i])); + + if (!is_pe) + { + for (i = 0; i < opts->delayimports->size; i++) + strarray_add(spec_args, strmake("-d%s", opts->delayimports->base[i])); + } + + /* add resource files */ + for (i = 0; i < files->size; i++) + if (files->base[i][1] == 'r') strarray_add(spec_args, files->base[i]); + + /* add other files */ + strarray_add(spec_args, "--"); + for (i = 0; i < files->size; i++) + { + switch(files->base[i][1]) + { + case 'd': + case 'a': + case 'o': + strarray_add(spec_args, files->base[i] + 2); + break; + } + } + + spawn(opts->prefix, spec_args, 0); + strarray_free (spec_args); + return spec_o_name; +} + static void build(struct options* opts) { strarray *lib_dirs, *files; - strarray *spec_args, *link_args, *implib_args, *tool; + strarray *link_args, *implib_args, *tool; char *output_file, *output_path; const char *spec_o_name, *libgcc = NULL; const char *output_name, *spec_file, *lang; @@ -1287,85 +1382,8 @@ static void build(struct options* opts) else entry_point = opts->entry_point; /* run winebuild to generate the .spec.o file */ - spec_args = get_winebuild_args( opts ); - if ((tool = build_tool_name( opts, TOOL_CC ))) strarray_add( spec_args, strmake( "--cc-cmd=%s", strarray_tostring( tool, " " ))); - if (!is_pe && (tool = build_tool_name( opts, TOOL_LD ))) strarray_add( spec_args, strmake( "--ld-cmd=%s", strarray_tostring( tool, " " ))); + spec_o_name = build_spec_obj( opts, spec_file, output_file, files, lib_dirs, entry_point ); - spec_o_name = get_temp_file(output_name, ".spec.o"); - if (opts->force_pointer_size) - strarray_add(spec_args, strmake("-m%u", 8 * opts->force_pointer_size )); - strarray_add(spec_args, "-D_REENTRANT"); - if (opts->pic && !is_pe) strarray_add(spec_args, "-fPIC"); - strarray_add(spec_args, opts->shared ? "--dll" : "--exe"); - if (fake_module) - { - strarray_add(spec_args, "--fake-module"); - strarray_add(spec_args, "-o"); - strarray_add(spec_args, output_file); - } - else - { - strarray_add(spec_args, "-o"); - strarray_add(spec_args, spec_o_name); - } - if (spec_file) - { - strarray_add(spec_args, "-E"); - strarray_add(spec_args, spec_file); - } - - if (!opts->shared) - { - strarray_add(spec_args, "-F"); - strarray_add(spec_args, output_name); - strarray_add(spec_args, "--subsystem"); - strarray_add(spec_args, opts->gui_app ? "windows" : "console"); - if (opts->large_address_aware) strarray_add( spec_args, "--large-address-aware" ); - } - - if (opts->target_platform == PLATFORM_WINDOWS) strarray_add(spec_args, "--safeseh"); - - if (entry_point) - { - strarray_add(spec_args, "--entry"); - strarray_add(spec_args, entry_point); - } - - if (opts->subsystem) - { - strarray_add(spec_args, "--subsystem"); - strarray_add(spec_args, opts->subsystem); - } - - for ( j = 0; j < lib_dirs->size; j++ ) - strarray_add(spec_args, strmake("-L%s", lib_dirs->base[j])); - - if (!is_pe) - { - for (j = 0; j < opts->delayimports->size; j++) - strarray_add(spec_args, strmake("-d%s", opts->delayimports->base[j])); - } - - /* add resource files */ - for ( j = 0; j < files->size; j++ ) - if (files->base[j][1] == 'r') strarray_add(spec_args, files->base[j]); - - /* add other files */ - strarray_add(spec_args, "--"); - for ( j = 0; j < files->size; j++ ) - { - switch(files->base[j][1]) - { - case 'd': - case 'a': - case 'o': - strarray_add(spec_args, files->base[j] + 2); - break; - } - } - - spawn(opts->prefix, spec_args, 0); - strarray_free (spec_args); if (fake_module) return; /* nothing else to do */ /* link everything together now */