Alexandre Julliard : winegcc: Use a .spec.o files when building for Windows.

Alexandre Julliard julliard at winehq.org
Tue Mar 12 16:56:14 CDT 2019


Module: wine
Branch: master
Commit: 4c0ea277cbbd575a362ad96f632e2a9390be65ea
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=4c0ea277cbbd575a362ad96f632e2a9390be65ea

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Mar 12 10:02:50 2019 +0100

winegcc: Use a .spec.o files when building for Windows.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/winegcc/winegcc.c | 170 ++++++++++++------------------------------------
 1 file changed, 41 insertions(+), 129 deletions(-)

diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index 94d2906..79a4cbe 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -818,21 +818,6 @@ static strarray *get_winebuild_args(struct options *opts)
     return spec_args;
 }
 
-static const char* compile_resources_to_object(struct options* opts, const strarray *resources,
-                                               const char *res_o_name)
-{
-    strarray *winebuild_args = get_winebuild_args( opts );
-
-    strarray_add( winebuild_args, "--resources" );
-    strarray_add( winebuild_args, "-o" );
-    strarray_add( winebuild_args, res_o_name );
-    strarray_addall( winebuild_args, resources );
-
-    spawn( opts->prefix, winebuild_args, 0 );
-    strarray_free( winebuild_args );
-    return res_o_name;
-}
-
 /* check if there is a static lib associated to a given dll */
 static char *find_static_lib( const char *dll )
 {
@@ -873,11 +858,12 @@ static void build(struct options* opts)
 {
     strarray *lib_dirs, *files;
     strarray *spec_args, *link_args;
-    char *output_file;
+    char *output_file, *output_path;
     const char *spec_o_name;
     const char *output_name, *spec_file, *lang;
     int generate_app_loader = 1;
     int fake_module = 0;
+    int is_pe = (opts->target_platform == PLATFORM_WINDOWS || opts->target_platform == PLATFORM_CYGWIN);
     unsigned int j;
 
     /* NOTE: for the files array we'll use the following convention:
@@ -900,7 +886,7 @@ static void build(struct options* opts)
     }
 
     /* generate app loader only for .exe */
-    if (opts->shared || strendswith(output_file, ".so"))
+    if (opts->shared || is_pe || strendswith(output_file, ".so"))
 	generate_app_loader = 0;
 
     if (strendswith(output_file, ".fake")) fake_module = 1;
@@ -912,6 +898,7 @@ static void build(struct options* opts)
     else output_name = output_file;
     if (!strchr(output_name, '.'))
         output_file = strmake("%s.%s", output_file, opts->shared ? "dll" : "exe");
+    output_path = is_pe ? output_file : strmake( "%s.so", output_file );
 
     /* get the filename from the path */
     if ((output_name = strrchr(output_file, '/'))) output_name++;
@@ -980,118 +967,19 @@ static void build(struct options* opts)
 	    lang = file;
     }
 
-    /* building for Windows is completely different */
-
-    if (opts->target_platform == PLATFORM_WINDOWS || opts->target_platform == PLATFORM_CYGWIN)
-    {
-        strarray *resources = strarray_alloc();
-        char *res_o_name = NULL;
-
-        if (opts->win16_app)
-            error( "Building 16-bit code is not supported for Windows\n" );
-
-        link_args = get_link_args( opts, output_name );
-
-        if (opts->shared)
-        {
-            /* run winebuild to generate the .def file */
-            char *spec_def_name = get_temp_file(output_name, ".spec.def");
-            spec_args = get_winebuild_args( opts );
-            strarray_add(spec_args, "--def");
-            strarray_add(spec_args, "-o");
-            strarray_add(spec_args, spec_def_name);
-            if (spec_file)
-            {
-                strarray_add(spec_args, "--export");
-                strarray_add(spec_args, spec_file);
-            }
-            spawn(opts->prefix, spec_args, 0);
-            strarray_free(spec_args);
-
-            strarray_add(link_args, spec_def_name);
-        }
-
-        strarray_add(link_args, "-o");
-        strarray_add(link_args, output_file);
-
-        for ( j = 0; j < lib_dirs->size; j++ )
-            strarray_add(link_args, strmake("-L%s", lib_dirs->base[j]));
-
-        if (!opts->nodefaultlibs)
-        {
-            add_library(opts, lib_dirs, files, "winecrt0");
-            add_library(opts, lib_dirs, files, "kernel32");
-            add_library(opts, lib_dirs, files, "ntdll");
-        }
-        if (!opts->shared && opts->use_msvcrt && opts->target_platform == PLATFORM_CYGWIN)
-            add_library(opts, lib_dirs, files, "msvcrt");
-
-        for ( j = 0; j < files->size; j++ )
-        {
-            const char* name = files->base[j] + 2;
-
-            switch(files->base[j][1])
-            {
-            case 'l':
-            case 'd':
-                strarray_add(link_args, strmake("-l%s", name));
-                break;
-            case 's':
-            case 'o':
-                strarray_add(link_args, name);
-                break;
-            case 'a':
-                if (!opts->lib_suffix && strchr(name, '/'))
-                {
-                    /* turn the path back into -Ldir -lfoo options
-                     * this makes sure that we use the specified libs even
-                     * when mingw adds its own import libs to the link */
-                    char *lib = xstrdup( name );
-                    char *p = strrchr( lib, '/' );
-
-                    *p++ = 0;
-                    if (!strncmp( p, "lib", 3 ))
-                    {
-                        char *ext = strrchr( p, '.' );
-
-                        if (ext) *ext = 0;
-                        p += 3;
-                        strarray_add(link_args, strmake("-L%s", lib ));
-                        strarray_add(link_args, strmake("-l%s", p ));
-                        free( lib );
-                        break;
-                    }
-                    free( lib );
-                }
-                strarray_add(link_args, name);
-                break;
-            case 'r':
-                if (!res_o_name)
-                {
-                    res_o_name = get_temp_file( output_name, ".res.o" );
-                    strarray_add( link_args, res_o_name );
-                }
-                strarray_add( resources, name );
-                break;
-            }
-        }
+    if (opts->win16_app && is_pe)
+        error( "Building 16-bit code is not supported for Windows\n" );
 
-        if (res_o_name) compile_resources_to_object( opts, resources, res_o_name );
+    /* add the default libraries, if needed */
 
-        spawn(opts->prefix, link_args, 0);
-        strarray_free (resources);
-        strarray_free (link_args);
-        strarray_free (lib_dirs);
-        strarray_free (files);
-        return;
+    if (!opts->nostdlib && opts->use_msvcrt && opts->target_platform != PLATFORM_WINDOWS)
+    {
+        if (!is_pe || !opts->shared) add_library(opts, lib_dirs, files, "msvcrt");
     }
 
-    /* add the default libraries, if needed */
-    if (!opts->nostdlib && opts->use_msvcrt) add_library(opts, lib_dirs, files, "msvcrt");
-
-    if (!opts->wine_objdir && !opts->nodefaultlibs) 
+    if (!opts->wine_objdir && !opts->nodefaultlibs)
     {
-        if (opts->gui_app) 
+        if (opts->gui_app)
 	{
 	    add_library(opts, lib_dirs, files, "shell32");
 	    add_library(opts, lib_dirs, files, "comdlg32");
@@ -1108,7 +996,7 @@ static void build(struct options* opts)
         add_library(opts, lib_dirs, files, "kernel32");
         add_library(opts, lib_dirs, files, "ntdll");
     }
-    if (!opts->nostdlib) add_library(opts, lib_dirs, files, "wine");
+    if (!opts->nostdlib && !is_pe) add_library(opts, lib_dirs, files, "wine");
 
     /* run winebuild to generate the .spec.o file */
     spec_args = get_winebuild_args( opts );
@@ -1191,7 +1079,7 @@ static void build(struct options* opts)
     link_args = get_link_args( opts, output_name );
 
     strarray_add(link_args, "-o");
-    strarray_add(link_args, strmake("%s.so", output_file));
+    strarray_add(link_args, output_path);
 
     for ( j = 0; j < lib_dirs->size; j++ )
 	strarray_add(link_args, strmake("-L%s", lib_dirs->base[j]));
@@ -1207,14 +1095,38 @@ static void build(struct options* opts)
 		strarray_add(link_args, strmake("-l%s", name));
 		break;
 	    case 's':
-	    case 'a':
 	    case 'o':
 		strarray_add(link_args, name);
 		break;
+	    case 'a':
+                if (is_pe && !opts->lib_suffix && strchr(name, '/'))
+                {
+                    /* turn the path back into -Ldir -lfoo options
+                     * this makes sure that we use the specified libs even
+                     * when mingw adds its own import libs to the link */
+                    char *lib = xstrdup( name );
+                    char *p = strrchr( lib, '/' );
+
+                    *p++ = 0;
+                    if (!strncmp( p, "lib", 3 ))
+                    {
+                        char *ext = strrchr( p, '.' );
+
+                        if (ext) *ext = 0;
+                        p += 3;
+                        strarray_add(link_args, strmake("-L%s", lib ));
+                        strarray_add(link_args, strmake("-l%s", p ));
+                        free( lib );
+                        break;
+                    }
+                    free( lib );
+                }
+		strarray_add(link_args, name);
+		break;
 	}
     }
 
-    if (!opts->nostdlib) 
+    if (!opts->nostdlib && !is_pe)
     {
 	strarray_add(link_args, "-lm");
 	strarray_add(link_args, "-lc");
@@ -1232,7 +1144,7 @@ static void build(struct options* opts)
             strarray_add(prelink_args, opts->prelink);
             strarray_add(prelink_args, "--reloc-only");
             strarray_add(prelink_args, opts->image_base);
-            strarray_add(prelink_args, strmake("%s.so", output_file));
+            strarray_add(prelink_args, output_path);
             spawn(opts->prefix, prelink_args, 1);
             strarray_free(prelink_args);
         }




More information about the wine-cvs mailing list