Alexandre Julliard : winegcc: Add a helper function to build the .spec.o file.
Alexandre Julliard
julliard at winehq.org
Wed Aug 11 16:42:16 CDT 2021
Module: wine
Branch: master
Commit: c697ee728b60e259723730384ecf784f5f9375ec
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c697ee728b60e259723730384ecf784f5f9375ec
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Aug 11 11:58:17 2021 +0200
winegcc: Add a helper function to build the .spec.o file.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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 = 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");
+ spec_o_name = build_spec_obj( opts, spec_file, output_file, files, lib_dirs, entry_point );
- 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 */
More information about the wine-cvs
mailing list