Alexandre Julliard : winegcc: Look for libraries in subdirs of the library path too.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 16 14:40:54 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 870d490eecdbfd6cdb945a4f387d92efdda22737
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=870d490eecdbfd6cdb945a4f387d92efdda22737

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Mar 16 16:28:04 2006 +0100

winegcc: Look for libraries in subdirs of the library path too.

This means that -lfoo will match the library 'foo/libfoo.def' in
addition to just 'libfoo.def'. This allows supporting the Wine source
layout without adding a gazillion path entries.

---

 tools/winegcc/utils.c   |    8 ++++
 tools/winegcc/winegcc.c |   88 ++++++++++++++++++++++-------------------------
 2 files changed, 49 insertions(+), 47 deletions(-)

diff --git a/tools/winegcc/utils.c b/tools/winegcc/utils.c
index b61b076..f66d34a 100644
--- a/tools/winegcc/utils.c
+++ b/tools/winegcc/utils.c
@@ -235,6 +235,14 @@ static char* try_lib_path(const char* di
     char *fullname;
     file_type type;
 
+    /* first try a subdir named from the library we are looking for */
+    fullname = strmake("%s/%s/%s%s%s", dir, library, pre, library, ext);
+    if (verbose > 1) fprintf(stderr, "Try %s...", fullname);
+    type = get_file_type(fullname);
+    if (verbose > 1) fprintf(stderr, type == expected_type ? "FOUND!\n" : "no\n");
+    if (type == expected_type) return fullname;
+    free( fullname );
+
     fullname = strmake("%s/%s%s%s", dir, pre, library, ext);
     if (verbose > 1) fprintf(stderr, "Try %s...", fullname);
     type = get_file_type(fullname);
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index e0a810e..43a6b07 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -382,6 +382,35 @@ static char *find_static_lib( const char
     return NULL;
 }
 
+/* add specified library to the list of files */
+static void add_library( strarray *lib_dirs, strarray *files, const char *library )
+{
+    char *static_lib, *fullname = 0;
+
+    switch(get_lib_type(lib_dirs, library, &fullname))
+    {
+    case file_arh:
+        strarray_add(files, strmake("-a%s", fullname));
+        break;
+    case file_dll:
+        strarray_add(files, strmake("-d%s", fullname));
+        if ((static_lib = find_static_lib(fullname)))
+        {
+            strarray_add(files, strmake("-a%s",static_lib));
+            free(static_lib);
+        }
+        break;
+    case file_so:
+        strarray_add(files, strmake("-s%s", fullname));
+        break;
+    default:
+        /* keep it anyway, the linker may know what to do with it */
+        strarray_add(files, strmake("-l%s", library));
+        break;
+    }
+    free(fullname);
+}
+
 static void build(struct options* opts)
 {
     static const char *stdlibpath[] = { DLLDIR, LIBDIR, "/usr/lib", "/usr/local/lib", "/lib" };
@@ -486,31 +515,7 @@ static void build(struct options* opts)
 	    }
 	}
 	else if (file[1] == 'l')
-	{
-	    char *static_lib, *fullname = 0;
-	    switch(get_lib_type(lib_dirs, file + 2, &fullname))
-	    {
-	    	case file_arh:
-		    strarray_add(files, strmake("-a%s", fullname));
-		    break;
-	        case file_dll:
-		    strarray_add(files, strmake("-d%s", file + 2));
-                    if ((static_lib = find_static_lib(fullname)))
-                    {
-                        strarray_add(files, strmake("-a%s",static_lib));
-                        free(static_lib);
-                    }
-		    break;
-	        case file_so:
-		    strarray_add(files, strmake("-s%s", file + 2));
-		    break;
-	        default:
-                    /* keep it anyway, the linker may know what to do with it */
-                    strarray_add(files, file);
-                    break;
-	    }
-	    free(fullname);
-	}
+            add_library( lib_dirs, files, file + 2 );
 	else if (file[1] == 'x')
 	    lang = file;
     }
@@ -518,31 +523,23 @@ static void build(struct options* opts)
 	error("A spec file is currently needed in shared mode");
 
     /* add the default libraries, if needed */
-    if (!opts->nostdlib) 
-    {
-        if (opts->use_msvcrt) strarray_add(files, "-dmsvcrt");
-    }
+    if (!opts->nostdlib && opts->use_msvcrt) add_library(lib_dirs, files, "msvcrt");
 
     if (!opts->wine_mode && !opts->nodefaultlibs) 
     {
         if (opts->gui_app) 
 	{
-            strarray_add(files, "-dshell32");
-	    strarray_add(files, "-dcomdlg32");
-	    strarray_add(files, "-dgdi32");
+	    add_library(lib_dirs, files, "shell32");
+	    add_library(lib_dirs, files, "comdlg32");
+	    add_library(lib_dirs, files, "gdi32");
 	}
-        strarray_add(files, "-dadvapi32");
-        strarray_add(files, "-duser32");
-        strarray_add(files, "-dkernel32");
+        add_library(lib_dirs, files, "advapi32");
+        add_library(lib_dirs, files, "user32");
+        add_library(lib_dirs, files, "kernel32");
     }
 
-    if (!opts->nostartfiles)
-    {
-        char *fullname = NULL;
-        if (get_lib_type(lib_dirs, "winecrt0", &fullname) == file_arh)
-            strarray_add(files, strmake("-a%s", fullname));
-        free( fullname );
-    }
+    if (!opts->nostartfiles) add_library(lib_dirs, files, "winecrt0");
+    if (!opts->nostdlib) add_library(lib_dirs, files, "wine");
 
     /* run winebuild to generate the .spec.o file */
     spec_args = strarray_alloc();
@@ -588,12 +585,10 @@ static void build(struct options* opts)
 	const char* name = files->base[j] + 2;
 	switch(files->base[j][1])
 	{
-	    case 'd':
-		strarray_add(spec_args, strmake("-l%s", name));
-		break;
 	    case 'r':
 		strarray_add(spec_args, files->base[j]);
 		break;
+	    case 'd':
 	    case 'a':
 	    case 'o':
 		strarray_add(spec_args, name);
@@ -633,9 +628,9 @@ static void build(struct options* opts)
 	switch(files->base[j][1])
 	{
 	    case 'l':
-	    case 's':
 		strarray_add(link_args, strmake("-l%s", name));
 		break;
+	    case 's':
 	    case 'a':
 	    case 'o':
 		strarray_add(link_args, name);
@@ -645,7 +640,6 @@ static void build(struct options* opts)
 
     if (!opts->nostdlib) 
     {
-	strarray_add(link_args, "-lwine");
 	strarray_add(link_args, "-lm");
 	strarray_add(link_args, "-lc");
     }




More information about the wine-cvs mailing list