Alexandre Julliard : winegcc: Detect the appropriate lib directory for 32/ 64 cross-builds.
Alexandre Julliard
julliard at winehq.org
Thu Dec 2 16:30:52 CST 2010
Module: wine
Branch: stable
Commit: 955d9a24c58a4cb8b94402e0dd4da6452601f976
URL: http://source.winehq.org/git/wine.git/?a=commit;h=955d9a24c58a4cb8b94402e0dd4da6452601f976
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Oct 25 20:42:00 2010 +0200
winegcc: Detect the appropriate lib directory for 32/64 cross-builds.
(cherry picked from commit 81b1c3ed60855d317ed3828b7e2378f63e5c73bf)
---
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 5fed4a3..c5b8537 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -311,6 +311,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();
@@ -577,7 +631,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;
@@ -627,9 +680,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
{
More information about the wine-cvs
mailing list