Module: wine Branch: master Commit: 81b1c3ed60855d317ed3828b7e2378f63e5c73bf URL: http://source.winehq.org/git/wine.git/?a=commit;h=81b1c3ed60855d317ed3828b7e...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Oct 25 20:42:00 2010 +0200
winegcc: Detect the appropriate lib directory for 32/64 cross-builds.
---
tools/winegcc/winegcc.c | 60 ++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 57 insertions(+), 3 deletions(-)
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index 51bbead..bec4be3 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -312,6 +312,60 @@ static const strarray* get_translator(struct options *opts) return ret; }
+/* check that file is a library for the correct platform */ +static int check_platform( struct options *opts, const char *file ) +{ + int ret = 0, fd = open( file, O_RDONLY ); + if (fd != -1) + { + unsigned char header[16]; + if (read( fd, header, sizeof(header) ) == sizeof(header)) + { + /* FIXME: only ELF is supported, platform is not checked beyond 32/64 */ + if (!memcmp( header, "\177ELF", 4 )) + { + if (header[4] == 2) /* 64-bit */ + ret = (opts->force_pointer_size == 8 || + (!opts->force_pointer_size && opts->target_cpu == CPU_x86_64)); + else + ret = (opts->force_pointer_size == 4 || + (!opts->force_pointer_size && opts->target_cpu != CPU_x86_64)); + } + } + close( fd ); + } + return ret; +} + +static char *get_lib_dir( struct options *opts ) +{ + static const char *stdlibpath[] = { LIBDIR, "/usr/lib", "/usr/local/lib", "/lib" }; + unsigned int i; + + for (i = 0; i < sizeof(stdlibpath)/sizeof(stdlibpath[0]); i++) + { + char *p, *buffer = xmalloc( strlen(stdlibpath[i]) + sizeof("32/libwine.so") ); + strcpy( buffer, stdlibpath[i] ); + p = buffer + strlen(buffer); + while (p > buffer && p[-1] == '/') p--; + strcpy( p, "/libwine.so" ); + if (check_platform( opts, buffer )) return buffer; + if (p > buffer + 2 && (!memcmp( p - 2, "32", 2 ) || !memcmp( p - 2, "64", 2 ))) p -= 2; + if (opts->force_pointer_size == 4 || (!opts->force_pointer_size && opts->target_cpu != CPU_x86_64)) + { + strcpy( p, "32/libwine.so" ); + if (check_platform( opts, buffer )) return buffer; + } + if (opts->force_pointer_size == 8 || (!opts->force_pointer_size && opts->target_cpu == CPU_x86_64)) + { + strcpy( p, "64/libwine.so" ); + if (check_platform( opts, buffer )) return buffer; + } + free( buffer ); + } + return xstrdup( LIBDIR ); +} + static void compile(struct options* opts, const char* lang) { strarray* comp_args = strarray_alloc(); @@ -578,7 +632,6 @@ static const char *mingw_unicode_hack( struct options *opts )
static void build(struct options* opts) { - static const char *stdlibpath[] = { DLLDIR, LIBDIR, "/usr/lib", "/usr/local/lib", "/lib" }; strarray *lib_dirs, *files; strarray *spec_args, *link_args; char *output_file; @@ -628,9 +681,10 @@ static void build(struct options* opts) /* prepare the linking path */ if (!opts->wine_objdir) { + char *lib_dir = get_lib_dir( opts ); lib_dirs = strarray_dup(opts->lib_dirs); - for ( j = 0; j < sizeof(stdlibpath)/sizeof(stdlibpath[0]); j++ ) - strarray_add(lib_dirs, stdlibpath[j]); + strarray_add( lib_dirs, strmake( "%s/wine", lib_dir )); + strarray_add( lib_dirs, lib_dir ); } else {