winewrap: updates

Dimitrie O. Paun dpaun at rogers.com
Tue Sep 16 08:03:37 CDT 2003


For displaying the silly error of not being able
to find the app DLL (which should never happen),
we were requiring GUI support which is not always
available. Not to mention that we were transforming
console apps into GUI apps :)

Because we were linking the wrapper against msvcrt,
we got some nasty initialization exceptions.

For debugging purposes, we need to control the name
of the app when employ a wrapper. Thus the new -a option.

ChangeLog
    Do not require GUI support for displaying errors in wrapper.
    Link the wrapper only against kernel (no dl, msvcrt, etc).
    Allow the setting of the app DLL when a wrapper is created.

Index: tools/winegcc/winewrap.c
===================================================================
RCS file: /var/cvs/wine/tools/winegcc/winewrap.c,v
retrieving revision 1.4
diff -u -r1.4 winewrap.c
--- tools/winegcc/winewrap.c	12 Sep 2003 00:25:14 -0000	1.4
+++ tools/winegcc/winewrap.c	15 Sep 2003 03:06:23 -0000
@@ -100,7 +100,7 @@
     " * Copyright 2002 Dimitrie O. Paun <dpaun at rogers.com>\n"
     " */\n"
     "\n"
-    "#include <dlfcn.h>\n"
+    "#include <stdio.h>\n"
     "#include <windows.h>\n"
     "\n"
     "\n"
@@ -120,7 +120,7 @@
     " * This is the name of the library containing the application,\n"
     " * e.g. 'hello-wrap.dll' if the application is called 'hello.exe'.\n"
     " */\n"
-    "static char* appName     = APPNAME \"-wrap.dll\";\n"
+    "static char* appName     = \"%s\";\n"
     "\n"
     "/**\n"
     " * This is the name of the application's Windows module. If left NULL\n"
@@ -153,7 +153,7 @@
     "\n"
     "    va_start(ap, format);\n"
     "    vsnprintf(msg, sizeof(msg), format, ap);\n"
-    "    MessageBox(NULL, msg, \"Error\", MB_OK);\n"
+    "    fprintf(stderr, \"Error: %%s\\n\", msg);\n"
     "    va_end(ap);\n"
     "    exit(1);\n"
     "}\n"
@@ -337,12 +337,11 @@
     }
 }
 
-static void create_the_wrapper(char* base_file, char* base_name, int gui_mode, int cpp)
+static void create_the_wrapper(char* base_file, char* base_name, char* app_name, int gui_mode)
 {
     char *wrp_temp_name, *wspec_name, *wspec_c_name, *wspec_o_name;
     char *wrap_c_name, *wrap_o_name;
     strarray *wwrap_args, *wspec_args, *wcomp_args, *wlink_args;
-    int i;
 
     wrp_temp_name = tempnam(0, "wwrp");
     wspec_name = strmake("%s.spec", wrp_temp_name);
@@ -363,7 +362,7 @@
     strarray_add(wwrap_args, wrap_c_name);
     strarray_add(wwrap_args, NULL);
 
-    create_file(wrap_c_name, wrapper_code, base_name, gui_mode);
+    create_file(wrap_c_name, wrapper_code, base_name, gui_mode, app_name);
     spawn(wwrap_args);
     strarray_free(wwrap_args);
     rm_temp_file(wrap_c_name);
@@ -377,12 +376,8 @@
     strarray_add(wspec_args, strmake("%s.exe", base_name));
     strarray_add(wspec_args, gui_mode ? "-mgui" : "-mcui");
     strarray_add(wspec_args, wrap_o_name);
-    for (i = 0; i < llib_paths->size; i++)
-	strarray_add(wspec_args, llib_paths->base[i]);
-    for (i = 0; i < lib_files->size; i++)
-	strarray_add(wspec_args, lib_files->base[i]);
-    for (i = 0; i < dll_files->size; i++)
-	strarray_add(wspec_args, dll_files->base[i]);
+    strarray_add(wspec_args, "-L" DLLDIR);
+    strarray_add(wspec_args, "-lkernel32");
     strarray_add(wspec_args, NULL);
 
     spawn(wspec_args);
@@ -404,11 +399,10 @@
 
     /* build wrapper ld's argument list */
     wlink_args = strarray_alloc();
-    strarray_add(wlink_args, cpp ? "g++" : "gcc");
+    strarray_add(wlink_args, "gcc");
     strarray_add(wlink_args, "-shared");
     strarray_add(wlink_args, "-Wl,-Bsymbolic,-z,defs");
     strarray_add(wlink_args, "-lwine");
-    strarray_add(wlink_args, "-ldl");
     strarray_add(wlink_args, "-o");
     strarray_add(wlink_args, strmake("%s.exe.so", base_file));
     strarray_add(wlink_args, wspec_o_name);
@@ -425,7 +419,7 @@
 {
     char *library = 0, *path = 0;
     int i, len, cpp = 0, no_opt = 0, gui_mode = 0, create_wrapper = -1;
-    char *base_name, *base_file, *app_temp_name;
+    char *base_name, *base_file, *base_path, *app_temp_name, *app_name = 0;
     char *spec_name, *spec_c_name, *spec_o_name;
     strarray *spec_args, *comp_args, *link_args;
 
@@ -445,6 +439,11 @@
 	{
 	    switch (argv[i][1])
 	    {
+	    case 'a':
+		if (argv[i][2]) app_name = strdup(argv[i]+ 2);
+		else if (i + 1 < argc) app_name = strdup(argv[++i]);
+		else error("The -a switch takes an argument.");
+		break;
 	    case 'k':
 		keep_generated = 1;
 		break;
@@ -515,9 +514,21 @@
 	base_file[len - 4 ] = 0; /* remove the .exe extension */
 
     /* we need to get rid of the directory part to get the base name */
-    if ( (base_name = strrchr(base_file, '/')) ) base_name++;
-    else base_name = base_file;
+    if ( (base_name = strrchr(base_file, '/')) ) 
+    {
+	base_path = strdup(base_file);
+	*strrchr(base_path, '/') = 0;
+	base_name++;
+    }
+    else 
+    {
+	base_path = strdup(".");
+	base_name = base_file;
+    }
     
+    /* create default name for the wrapper */
+    if (!app_name) app_name =  strmake("%s-wrap.dll", base_name);
+
     spec_name = strmake("%s.spec", app_temp_name);
     spec_c_name = strmake("%s.c", spec_name);
     spec_o_name = strmake("%s.o", spec_name);
@@ -531,7 +542,7 @@
     {
 	create_file(spec_name, gui_mode ? app_gui_spec : app_cui_spec);
 	strarray_add(spec_args, "-F");
-	strarray_add(spec_args, strmake("%s-wrap.dll", base_name));
+	strarray_add(spec_args, app_name);
 	strarray_add(spec_args, "--spec");
 	strarray_add(spec_args, spec_name);
     }
@@ -583,7 +594,7 @@
 	strarray_add(link_args, llib_paths->base[i]);
     strarray_add(link_args, "-o");
     if (create_wrapper)
-	strarray_add(link_args, strmake("%s-wrap.dll.so", base_file));
+	strarray_add(link_args, strmake("%s/%s.so", base_path, app_name));
     else
 	strarray_add(link_args, strmake("%s.exe.so", base_file));
     strarray_add(link_args, spec_o_name);
@@ -600,7 +611,7 @@
     rm_temp_file(spec_o_name);
 
     if (create_wrapper)
-	create_the_wrapper(base_file, base_name, gui_mode, cpp);
+	create_the_wrapper(base_file, base_name, app_name, gui_mode);
 
     /* create the loader script */
     create_file(base_file, app_loader_script, base_name);


-- 
Dimi.




More information about the wine-patches mailing list