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.
*
* Copyright 2000 Manuel Novoa III
* Copyright 2002 Dimitrie O. Paun
*
* This library is free software; you can redistribute it and/or
......@@ -23,6 +24,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
......@@ -36,34 +38,124 @@
#define INCLUDEDIR "/usr/local/include/wine"
#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)
{
char **gcc_argv;
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));
i = 0;
gcc_argv[i++] = GCC_BIN;
gcc_argv[i++] = "-fshort-wchar";
gcc_argv[i++] = "-fPIC";
gcc_argv[i++] = "-I" INCLUDEDIR "/msvcrt";
gcc_argv[i++] = "-I" INCLUDEDIR "/windows";
gcc_argv[i++] = "-DWINE_DEFINE_WCHAR_T";
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 (linking)
{
gcc_argv[i++] = BINDIR "/winewrap";
}
else
{
gcc_argv[i++] = GCC_BIN;
gcc_argv[i++] = "-fshort-wchar";
gcc_argv[i++] = "-fPIC";
if (use_stdinc)
{
if (use_msvcrt) gcc_argv[i++] = "-I" INCLUDEDIR "/msvcrt";
gcc_argv[i++] = "-I" INCLUDEDIR "/windows";
gcc_argv[i++] = "-DWINE_DEFINE_WCHAR_T";
}
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];
}
}
if (linking)
{
if (use_stdlib) gcc_argv[i++] = use_msvcrt ? "-lmsvcrt" : "-lc";
}
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