Alexandre Julliard : winegcc: Support -b option for cross-compiling.
Alexandre Julliard
julliard at winehq.org
Mon Feb 2 09:01:13 CST 2009
Module: wine
Branch: master
Commit: 34729392551a19d21ea4f0801d2d4c4cf10910fb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=34729392551a19d21ea4f0801d2d4c4cf10910fb
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Feb 2 12:25:37 2009 +0100
winegcc: Support -b option for cross-compiling.
---
tools/winegcc/utils.c | 7 +++
tools/winegcc/utils.h | 1 +
tools/winegcc/winegcc.c | 120 +++++++++++++++++++++++++++++++++++++---------
3 files changed, 104 insertions(+), 24 deletions(-)
diff --git a/tools/winegcc/utils.c b/tools/winegcc/utils.c
index f30a8c3..743f2e0 100644
--- a/tools/winegcc/utils.c
+++ b/tools/winegcc/utils.c
@@ -66,6 +66,13 @@ void *xrealloc(void* p, size_t size)
return p2;
}
+char *xstrdup( const char *str )
+{
+ char *res = strdup( str );
+ if (!res) error("Virtual memory exhausted.\n");
+ return res;
+}
+
int strendswith(const char* str, const char* end)
{
int l = strlen(str);
diff --git a/tools/winegcc/utils.h b/tools/winegcc/utils.h
index 4c8fec3..a48bbf0 100644
--- a/tools/winegcc/utils.h
+++ b/tools/winegcc/utils.h
@@ -35,6 +35,7 @@ void error(const char* s, ...) DECLSPEC_NORETURN;
void* xmalloc(size_t size);
void* xrealloc(void* p, size_t size);
+char *xstrdup( const char *str );
char* strmake(const char* fmt, ...);
int strendswith(const char* str, const char* end);
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index 5434760..e0b03b1 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -88,6 +88,7 @@
#include "config.h"
#include "wine/port.h"
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
@@ -154,11 +155,43 @@ enum target_platform
PLATFORM_UNSPECIFIED, PLATFORM_APPLE, PLATFORM_SOLARIS, PLATFORM_WINDOWS
};
-struct options
+static const struct
+{
+ const char *name;
+ enum target_cpu cpu;
+} cpu_names[] =
+{
+ { "i386", CPU_x86 },
+ { "i486", CPU_x86 },
+ { "i586", CPU_x86 },
+ { "i686", CPU_x86 },
+ { "i786", CPU_x86 },
+ { "x86_64", CPU_x86_64 },
+ { "sparc", CPU_SPARC },
+ { "alpha", CPU_ALPHA },
+ { "powerpc", CPU_POWERPC }
+};
+
+static const struct
+{
+ const char *name;
+ enum target_platform platform;
+} platform_names[] =
+{
+ { "macos", PLATFORM_APPLE },
+ { "darwin", PLATFORM_APPLE },
+ { "solaris", PLATFORM_SOLARIS },
+ { "mingw32", PLATFORM_WINDOWS },
+ { "windows", PLATFORM_WINDOWS },
+ { "winnt", PLATFORM_WINDOWS }
+};
+
+struct options
{
enum processor processor;
enum target_cpu target_cpu;
enum target_platform target_platform;
+ const char *target;
int shared;
int use_msvcrt;
int nostdinc;
@@ -248,29 +281,20 @@ static char* get_temp_file(const char* prefix, const char* suffix)
return tmp;
}
-static const strarray* get_translator(enum processor processor)
+static const strarray* get_translator(struct options *opts)
{
- static strarray* cpp = 0;
- static strarray* as = 0;
- static strarray* cc = 0;
- static strarray* cxx = 0;
+ const char *str;
- switch(processor)
+ switch(opts->processor)
{
- case proc_cpp:
- if (!cpp) cpp = strarray_fromstring(CPP, " ");
- return cpp;
- case proc_cc:
- if (!cc) cc = strarray_fromstring(CC, " ");
- return cc;
- case proc_cxx:
- if (!cxx) cxx = strarray_fromstring(CXX, " ");
- return cxx;
- case proc_as:
- if (!as) as = strarray_fromstring(AS, " ");
- return as;
+ case proc_cpp: str = CPP; break;
+ case proc_cc: str = CC; break;
+ case proc_cxx: str = CXX; break;
+ case proc_as: str = AS; break;
+ default: assert(0);
}
- error("Unknown processor\n");
+ if (opts->target) str = strmake( "%s-%s", opts->target, str );
+ return strarray_fromstring( str, " " );
}
static void compile(struct options* opts, const char* lang)
@@ -279,7 +303,7 @@ static void compile(struct options* opts, const char* lang)
unsigned int j;
int gcc_defs = 0;
- strarray_addall(comp_args, get_translator(opts->processor));
+ strarray_addall(comp_args, get_translator(opts));
switch(opts->processor)
{
case proc_cpp: gcc_defs = 1; break;
@@ -614,6 +638,11 @@ static void build(struct options* opts)
strarray_add(spec_args, winebuild);
if (verbose) strarray_add(spec_args, "-v");
if (keep_generated) strarray_add(spec_args, "--save-temps");
+ if (opts->target)
+ {
+ strarray_add(spec_args, "--target");
+ strarray_add(spec_args, opts->target);
+ }
strarray_add(spec_args, "--as-cmd");
strarray_add(spec_args, AS);
strarray_add(spec_args, "--ld-cmd");
@@ -669,7 +698,7 @@ static void build(struct options* opts)
/* link everything together now */
link_args = strarray_alloc();
- strarray_addall(link_args, get_translator(opts->processor));
+ strarray_addall(link_args, get_translator(opts));
strarray_addall(link_args, strarray_fromstring(LDDLLFLAGS, " "));
strarray_add(link_args, "-o");
@@ -760,7 +789,7 @@ static void forward(int argc, char **argv, struct options* opts)
strarray* args = strarray_alloc();
int j;
- strarray_addall(args, get_translator(opts->processor));
+ strarray_addall(args, get_translator(opts));
for( j = 1; j < argc; j++ )
strarray_add(args, argv[j]);
@@ -843,6 +872,46 @@ static int is_mingw_arg(const char* arg)
return 0;
}
+static void parse_target_option( struct options *opts, const char *target )
+{
+ char *p, *platform, *spec = xstrdup( target );
+ unsigned int i;
+
+ /* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */
+
+ /* get the CPU part */
+
+ if (!(p = strchr( spec, '-' ))) error( "Invalid target specification '%s'\n", target );
+ *p++ = 0;
+ for (i = 0; i < sizeof(cpu_names)/sizeof(cpu_names[0]); i++)
+ {
+ if (!strcmp( cpu_names[i].name, spec ))
+ {
+ opts->target_cpu = cpu_names[i].cpu;
+ break;
+ }
+ }
+ if (i == sizeof(cpu_names)/sizeof(cpu_names[0]))
+ error( "Unrecognized CPU '%s'\n", spec );
+ platform = p;
+ if ((p = strrchr( p, '-' ))) platform = p + 1;
+
+ /* get the OS part */
+
+ opts->target_platform = PLATFORM_UNSPECIFIED; /* default value */
+ for (i = 0; i < sizeof(platform_names)/sizeof(platform_names[0]); i++)
+ {
+ if (!strncmp( platform_names[i].name, platform, strlen(platform_names[i].name) ))
+ {
+ opts->target_platform = platform_names[i].platform;
+ break;
+ }
+ }
+
+ free( spec );
+ opts->target = xstrdup( target );
+}
+
int main(int argc, char **argv)
{
int i, c, next_is_arg = 0, linking = 1;
@@ -943,7 +1012,7 @@ int main(int argc, char **argv)
raw_linker_arg = 0;
if (argv[i][1] == 'c' || argv[i][1] == 'L')
raw_compiler_arg = 0;
- if (argv[i][1] == 'o')
+ if (argv[i][1] == 'o' || argv[i][1] == 'b')
raw_compiler_arg = raw_linker_arg = 0;
/* do a bit of semantic analysis */
@@ -963,6 +1032,9 @@ int main(int argc, char **argv)
if (!opts.prefix) opts.prefix = strarray_alloc();
strarray_add(opts.prefix, str);
break;
+ case 'b':
+ parse_target_option( &opts, option_arg );
+ break;
case 'c': /* compile or assemble */
if (argv[i][2] == 0) opts.compile_only = 1;
/* fall through */
More information about the wine-cvs
mailing list