winewrap: linking improvements
Dimitrie O. Paun
dpaun at rogers.com
Sun Dec 22 01:25:46 CST 2002
ChangeLog
Add support for library path (-L)
Add support for linking against static libs
Ignore -W for gcc compatibility
Index: tools/winewrap.c
===================================================================
RCS file: /var/cvs/wine/tools/winewrap.c,v
retrieving revision 1.3
diff -u -r1.3 winewrap.c
--- tools/winewrap.c 17 Dec 2002 04:15:59 -0000 1.3
+++ tools/winewrap.c 22 Dec 2002 06:08:08 -0000
@@ -74,8 +74,8 @@
;
static char *output_name;
-static char **lib_files, **obj_files;
-static int nb_lib_files, nb_obj_files;
+static char **lib_files, **dll_files, **lib_paths, **obj_files;
+static int nb_lib_files, nb_dll_files, nb_lib_paths, nb_obj_files;
static int verbose = 0;
void error(const char *s, ...)
@@ -90,7 +90,6 @@
exit(2);
}
-
char *strmake(const char *fmt, ...)
{
int n, size = 100;
@@ -147,14 +146,49 @@
return !memcmp(buf, res_sig, sizeof(buf));
}
+/* open the .def library for a given dll in a specified path */
+static char *try_dll_path( const char *path, const char *name )
+{
+ char *fullname;
+ int fd;
+
+ fullname = strmake("%s/lib%s.def", path, name );
+
+ /* check if the file exists */
+ if ((fd = open( fullname, O_RDONLY )) != -1)
+ {
+ close( fd );
+ return fullname;
+ }
+ free( fullname );
+ return NULL;
+}
+
+/* open the .def library for a given dll */
+static char *open_dll( const char *name )
+{
+ char *fullname;
+ int i;
+
+ for (i = 0; i < nb_lib_paths; i++)
+ {
+ if ((fullname = try_dll_path( lib_paths[i], name ))) return fullname;
+ }
+ return try_dll_path( ".", name );
+}
+
int main(int argc, char **argv)
{
- char *library = 0, *p;
+ char *library = 0, *path = 0, *p;
int i, j, no_opt = 0, gui_mode = 0;
char *spec_name, *spec_c_name, *spec_o_name;
char **spec_args, **comp_args, **link_args;
FILE *file;
-
+
+ /* include the standard DLL path first */
+ lib_paths = realloc( lib_paths, (nb_lib_paths+1) * sizeof(*lib_paths) );
+ lib_paths[nb_lib_paths++] = WINEDLLS;
+
for (i = 1; i < argc; i++)
{
if (!no_opt && argv[i][0] == '-')
@@ -168,12 +202,32 @@
if ( !(p = strstr(output_name, ".exe")) || *(p+4) )
output_name = strmake("%s.exe", output_name);
break;
+ case 'L':
+ if (argv[i][2]) path = argv[i] + 2;
+ else if (i + 1 < argc) path = argv[++i];
+ else error("The -L switch takes an argument\n.");
+ lib_paths = realloc( lib_paths, (nb_lib_paths+1) * sizeof(*lib_paths) );
+ lib_paths[nb_lib_paths++] = strdup(path);
+ dll_files = realloc( dll_files, (nb_dll_files+1) * sizeof(*dll_files) );
+
+ dll_files[nb_dll_files++] = strmake("-L%s", path);
+ lib_files = realloc( lib_files, (nb_lib_files+1) * sizeof(*lib_files) );
+ lib_files[nb_lib_files++] = strmake("-L%s", path);
+ break;
case 'l':
- if (argv[i][2]) library = argv[i]+ 2;
+ if (argv[i][2]) library = argv[i] + 2;
else if (i + 1 < argc) library = argv[++i];
else error("The -l switch takes an argument\n.");
- lib_files = realloc( lib_files, (nb_lib_files+1) * sizeof(*lib_files) );
- lib_files[nb_lib_files++] = strdup(library);
+ if (open_dll(library))
+ {
+ dll_files = realloc( dll_files, (nb_dll_files+1) * sizeof(*dll_files) );
+ dll_files[nb_dll_files++] = strmake("-l%s", library);
+ }
+ else
+ {
+ lib_files = realloc( lib_files, (nb_lib_files+1) * sizeof(*lib_files) );
+ lib_files[nb_lib_files++] = strmake("-l%s", library);
+ }
break;
case 'm':
if (strcmp("-mwindows", argv[i]) == 0) gui_mode = 1;
@@ -183,6 +237,9 @@
case 'v': /* verbose */
if (argv[i][2] == 0) verbose = 1;
break;
+ case 'W':
+ /* ignore such options for now for gcc compatibility */
+ break;
case '-':
if (argv[i][2]) error("No long option supported.");
no_opt = 1;
@@ -203,7 +260,7 @@
spec_o_name = strmake("%s.o", spec_name);
/* build winebuild's argument list */
- spec_args = malloc( (nb_lib_files + nb_obj_files + 20) * sizeof (char *) );
+ spec_args = malloc( (nb_lib_files + nb_dll_files + nb_obj_files + 20) * sizeof (char *) );
j = 0;
spec_args[j++] = BINDIR "/winebuild";
spec_args[j++] = "-fPIC";
@@ -215,8 +272,8 @@
for (i = 0; i < nb_obj_files; i++)
spec_args[j++] = obj_files[i];
spec_args[j++] = "-L" WINEDLLS;
- for (i = 0; i < nb_lib_files; i++)
- spec_args[j++] = strmake("-l%s", lib_files[i]);
+ for (i = 0; i < nb_dll_files; i++)
+ spec_args[j++] = dll_files[i];
spec_args[j] = 0;
/* build gcc's argument list */
@@ -235,6 +292,8 @@
link_args[j++] = "gcc";
link_args[j++] = "-shared";
link_args[j++] = "-Wl,-Bsymbolic,-z,defs";
+ for (i = 0; i < nb_lib_files; i++)
+ link_args[j++] = lib_files[i];
link_args[j++] = "-lwine";
link_args[j++] = "-lm";
link_args[j++] = "-o";
--
Dimi.
More information about the wine-patches
mailing list