Commit cc1577cd authored by Dimitrie O. Paun's avatar Dimitrie O. Paun Committed by Alexandre Julliard

Teach mingwrap to use winewrap to do the linking, just like gcc uses

ld to link on Unix. Based loosely on a uClib utility developed by Manuel Novoa III.
parent 3e1c6132
/* /*
* MinGW wrapper: makes gcc behave like MinGW. * MinGW wrapper: makes gcc behave like MinGW.
* *
* Copyright 2000 Manuel Novoa III
* Copyright 2002 Dimitrie O. Paun * Copyright 2002 Dimitrie O. Paun
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
...@@ -23,6 +24,7 @@ ...@@ -23,6 +24,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h>
#include <string.h> #include <string.h>
#ifdef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H
# include <unistd.h> # include <unistd.h>
...@@ -36,34 +38,124 @@ ...@@ -36,34 +38,124 @@
#define INCLUDEDIR "/usr/local/include/wine" #define INCLUDEDIR "/usr/local/include/wine"
#endif #endif
void error(const char *s, ...)
{
va_list ap;
va_start(ap, s);
fprintf(stderr, "Error: ");
vfprintf(stderr, s, ap);
fprintf(stderr, "\n");
va_end(ap);
exit(2);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
char **gcc_argv; char **gcc_argv;
int i, j; int i, j;
int linking = 1, verbose = 0, use_static_linking = 0;
int use_stdinc = 1, use_stdlib = 1, use_msvcrt = 0, gui_app = 0;
for ( i = 1 ; i < argc ; i++ )
{
if (argv[i][0] == '-') /* option */
{
switch (argv[i][1])
{
case 'c': /* compile or assemble */
case 'S': /* generate assembler code */
case 'E': /* preprocess only */
case 'M': /* map file generation */
if (argv[i][2] == 0) linking = 0;
break;
case 'v': /* verbose */
if (argv[i][2] == 0) verbose = 1;
break;
case 'm':
if (strcmp("-mno-cygwin", argv[i]) == 0)
use_msvcrt = 1;
else if (strcmp("-mwindows", argv[i]) == 0)
gui_app = 1;
break;
case 'n':
if (strcmp("-nostdinc", argv[i]) == 0)
use_stdinc = 0;
else if (strcmp("-nodefaultlibs", argv[i]) == 0)
use_stdlib = 0;
else if (strcmp("-nostdlib", argv[i]) == 0)
use_stdlib = 0;
break;
case 's':
if (strcmp("-static", argv[i]) == 0) use_static_linking = 1;
break;
case 'W':
if (strncmp("-Wl,", argv[i], 4) == 0)
{
if (strstr(argv[i], "-static"))
use_static_linking = 1;
}
break;
case '-':
if (strcmp("-static", argv[i]+1) == 0)
use_static_linking = 1;
break;
}
}
}
if (use_static_linking) error("Static linking is not supported.");
gcc_argv = malloc(sizeof(char*) * (argc + 20)); gcc_argv = malloc(sizeof(char*) * (argc + 20));
i = 0; i = 0;
gcc_argv[i++] = GCC_BIN; if (linking)
{
gcc_argv[i++] = "-fshort-wchar"; gcc_argv[i++] = BINDIR "/winewrap";
gcc_argv[i++] = "-fPIC"; }
gcc_argv[i++] = "-I" INCLUDEDIR "/msvcrt"; else
gcc_argv[i++] = "-I" INCLUDEDIR "/windows"; {
gcc_argv[i++] = "-DWINE_DEFINE_WCHAR_T"; gcc_argv[i++] = GCC_BIN;
gcc_argv[i++] = "-D__int8=char";
gcc_argv[i++] = "-D__int16=short"; gcc_argv[i++] = "-fshort-wchar";
gcc_argv[i++] = "-D__int32=int"; gcc_argv[i++] = "-fPIC";
gcc_argv[i++] = "-D__int64=long long"; if (use_stdinc)
{
for ( j = 1 ; j < argc ; j++ ) { if (use_msvcrt) gcc_argv[i++] = "-I" INCLUDEDIR "/msvcrt";
if (strcmp("-mno-cygwin", argv[j]) == 0) { gcc_argv[i++] = "-I" INCLUDEDIR "/windows";
/* ignore this option */ gcc_argv[i++] = "-DWINE_DEFINE_WCHAR_T";
} else { }
gcc_argv[i++] = "-D__int8=char";
gcc_argv[i++] = "-D__int16=short";
gcc_argv[i++] = "-D__int32=int";
gcc_argv[i++] = "-D__int64=long long";
}
for ( j = 1 ; j < argc ; j++ )
{
if (strcmp("-mno-cygwin", argv[j]) == 0)
; /* ignore this option */
else if (strcmp("-mwindows", argv[j]) == 0)
; /* ignore this option */
else if (strcmp("-s", argv[j]) == 0)
; /* ignore this option */
else
gcc_argv[i++] = argv[j]; gcc_argv[i++] = argv[j];
} }
if (linking)
{
if (use_stdlib) gcc_argv[i++] = use_msvcrt ? "-lmsvcrt" : "-lc";
} }
gcc_argv[i] = NULL; gcc_argv[i] = NULL;
return execvp(GCC_BIN, gcc_argv); if (verbose)
{
for (i = 0; gcc_argv[i]; i++) printf("%s ", gcc_argv[i]);
printf("\n");
}
execvp(gcc_argv[0], gcc_argv);
return 1;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment