Alexandre Julliard : makefiles: Generate dependencies for import libraries.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Feb 16 09:55:00 CST 2016


Module: wine
Branch: master
Commit: 364165a671c2a782d06b437e8b965cb905da1517
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=364165a671c2a782d06b437e8b965cb905da1517

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Feb 16 16:53:59 2016 +0900

makefiles: Generate dependencies for import libraries.

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

---

 tools/makedep.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 62 insertions(+), 8 deletions(-)

diff --git a/tools/makedep.c b/tools/makedep.c
index e514cb3..9fd704b 100644
--- a/tools/makedep.c
+++ b/tools/makedep.c
@@ -173,6 +173,7 @@ struct makefile
     const char     *testdll;
     const char     *sharedlib;
     const char     *staticlib;
+    const char     *staticimplib;
     const char     *importlib;
     int             use_msvcrt;
     int             is_win16;
@@ -1800,6 +1801,11 @@ static void add_generated_sources( struct makefile *make )
             source->files_count = source->files_size = 0;
             source->files = NULL;
         }
+        if (source->file->flags & FLAG_C_IMPLIB)
+        {
+            if (!make->staticimplib && make->importlib && *dll_ext)
+                make->staticimplib = strmake( "lib%s.def.a", make->importlib );
+        }
     }
     if (make->testdll)
     {
@@ -1886,6 +1892,51 @@ static struct strarray get_local_dependencies( const struct makefile *make, cons
 
 
 /*******************************************************************
+ *         add_import_libs
+ */
+static struct strarray add_import_libs( const struct makefile *make, struct strarray *deps,
+                                        struct strarray imports, int cross )
+{
+    struct strarray ret = empty_strarray;
+    unsigned int i, j;
+
+    for (i = 0; i < imports.count; i++)
+    {
+        const char *name = imports.str[i];
+
+        for (j = 0; j < top_makefile->subdirs.count; j++)
+        {
+            const struct makefile *submake = top_makefile->submakes[j];
+
+            if (submake->importlib && !strcmp( submake->importlib, name ))
+            {
+                const char *dir = top_obj_dir_path( make, submake->base_dir );
+                const char *ext = cross ? "cross.a" : *dll_ext ? "def" : "a";
+
+                strarray_add( deps, strmake( "%s/lib%s.%s", dir, name, ext ));
+                if (!cross && submake->staticimplib)
+                    strarray_add( deps, strmake( "%s/%s", dir, submake->staticimplib ));
+                break;
+            }
+
+            if (submake->staticlib &&
+                !strncmp( submake->staticlib, "lib", 3 ) &&
+                !strncmp( submake->staticlib + 3, name, strlen(name) ) &&
+                !strcmp( submake->staticlib + 3 + strlen(name), ".a" ))
+            {
+                const char *dir = top_obj_dir_path( make, submake->base_dir );
+
+                strarray_add( deps, strmake( "%s/lib%s.a", dir, name ));
+                break;
+            }
+        }
+        strarray_add( &ret, strmake( "-l%s", name ));
+    }
+    return ret;
+}
+
+
+/*******************************************************************
  *         add_install_rule
  */
 static void add_install_rule( const struct makefile *make, struct strarray *install_rules,
@@ -2417,15 +2468,14 @@ static struct strarray output_sources( const struct makefile *make )
     if (make->module && !make->staticlib)
     {
         struct strarray all_libs = empty_strarray;
+        struct strarray dep_libs = empty_strarray;
         char *module_path = obj_dir_path( make, make->module );
         char *spec_file = NULL;
 
         if (!make->appmode.count)
             spec_file = src_dir_path( make, replace_extension( make->module, ".dll", ".spec" ));
-        for (i = 0; i < make->delayimports.count; i++)
-            strarray_add( &all_libs, strmake( "-l%s", make->delayimports.str[i] ));
-        for (i = 0; i < make->imports.count; i++)
-            strarray_add( &all_libs, strmake( "-l%s", make->imports.str[i] ));
+        strarray_addall( &all_libs, add_import_libs( make, &dep_libs, make->delayimports, 0 ));
+        strarray_addall( &all_libs, add_import_libs( make, &dep_libs, make->imports, 0 ));
         for (i = 0; i < make->delayimports.count; i++)
             strarray_add( &all_libs, strmake( "-Wb,-d%s", make->delayimports.str[i] ));
         strarray_add( &all_libs, "-lwine" );
@@ -2453,6 +2503,7 @@ static struct strarray output_sources( const struct makefile *make )
         if (spec_file) output_filename( spec_file );
         output_filenames_obj_dir( make, object_files );
         output_filenames_obj_dir( make, res_files );
+        output_filenames( dep_libs );
         output( "\n" );
         output( "\t%s -o $@", tools_path( make, "winegcc" ));
         output_filename( strmake( "-B%s", tools_dir_path( make, "winebuild" )));
@@ -2655,12 +2706,10 @@ static struct strarray output_sources( const struct makefile *make )
         char *testmodule = replace_extension( make->testdll, ".dll", "_test.exe" );
         char *stripped = replace_extension( make->testdll, ".dll", "_test-stripped.exe" );
         char *testres = replace_extension( make->testdll, ".dll", "_test.res" );
-        struct strarray all_libs = empty_strarray;
+        struct strarray dep_libs = empty_strarray;
+        struct strarray all_libs = add_import_libs( make, &dep_libs, make->imports, 0 );
 
-        for (i = 0; i < make->imports.count; i++)
-            strarray_add( &all_libs, strmake( "-l%s", make->imports.str[i] ));
         strarray_addall( &all_libs, libs );
-
         strarray_add( &all_targets, strmake( "%s%s", testmodule, dll_ext ));
         strarray_add( &clean_files, strmake( "%s%s", stripped, dll_ext ));
         output( "%s%s:\n", obj_dir_path( make, testmodule ), dll_ext );
@@ -2692,6 +2741,7 @@ static struct strarray output_sources( const struct makefile *make )
                 obj_dir_path( make, stripped ), dll_ext );
         output_filenames_obj_dir( make, object_files );
         output_filenames_obj_dir( make, res_files );
+        output_filenames( dep_libs );
         output( "\n" );
 
         output( "all: %s/%s\n", top_obj_dir_path( make, "programs/winetest" ), testres );
@@ -2704,11 +2754,15 @@ static struct strarray output_sources( const struct makefile *make )
         {
             char *crosstest = replace_extension( make->testdll, ".dll", "_crosstest.exe" );
 
+            dep_libs = empty_strarray;
+            all_libs = add_import_libs( make, &dep_libs, make->imports, 1 );
+            strarray_addall( &all_libs, libs );
             strarray_add( &clean_files, crosstest );
             output( "%s: %s\n", obj_dir_path( make, "crosstest" ), obj_dir_path( make, crosstest ));
             output( "%s:", obj_dir_path( make, crosstest ));
             output_filenames_obj_dir( make, crossobj_files );
             output_filenames_obj_dir( make, res_files );
+            output_filenames( dep_libs );
             output( "\n" );
             output( "\t%s -o $@ -b %s", tools_path( make, "winegcc" ), crosstarget );
             output_filename( strmake( "-B%s", tools_dir_path( make, "winebuild" )));




More information about the wine-cvs mailing list