Module: wine Branch: master Commit: d07f67acbcb45a85d6d221333a60bdac5783a32e URL: http://source.winehq.org/git/wine.git/?a=commit;h=d07f67acbcb45a85d6d221333a...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Feb 4 19:31:54 2009 +0100
winebuild: Determine the appropriate as/ld/nm commands at the time they are needed.
---
tools/winebuild/build.h | 4 +++ tools/winebuild/import.c | 14 +++++----- tools/winebuild/main.c | 22 ++-------------- tools/winebuild/utils.c | 62 +++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 72 insertions(+), 30 deletions(-)
diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h index 0ee7bde..d9df1ce 100644 --- a/tools/winebuild/build.h +++ b/tools/winebuild/build.h @@ -119,6 +119,7 @@ enum target_platform PLATFORM_UNSPECIFIED, PLATFORM_APPLE, PLATFORM_SOLARIS, PLATFORM_WINDOWS };
+extern char *target_alias; extern enum target_cpu target_cpu; extern enum target_platform target_platform;
@@ -168,6 +169,9 @@ extern void warning( const char *msg, ... ) __attribute__ ((__format__ (__printf__, 1, 2))); extern int output( const char *format, ... ) __attribute__ ((__format__ (__printf__, 1, 2))); +extern const char *get_as_command(void); +extern const char *get_ld_command(void); +extern const char *get_nm_command(void); extern char *get_temp_file_name( const char *prefix, const char *suffix ); extern void output_standard_file_header(void); extern FILE *open_input_file( const char *srcdir, const char *name ); diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index dca18ab..bd56a00 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -527,21 +527,21 @@ static char *create_undef_symbols_file( DLLSPEC *spec ) static const char *ldcombine_files( DLLSPEC *spec, char **argv ) { unsigned int i, len = 0; + const char *prog = get_ld_command(); char *cmd, *p, *ld_tmp_file, *undef_file; int err;
undef_file = create_undef_symbols_file( spec ); len += strlen(undef_file) + 1; ld_tmp_file = get_temp_file_name( output_file_name, ".o" ); - if (!ld_command) ld_command = xstrdup("ld"); for (i = 0; argv[i]; i++) len += strlen(argv[i]) + 1; - cmd = p = xmalloc( len + strlen(ld_tmp_file) + 8 + strlen(ld_command) ); - p += sprintf( cmd, "%s -r -o %s %s", ld_command, ld_tmp_file, undef_file ); + cmd = p = xmalloc( len + strlen(ld_tmp_file) + 8 + strlen(prog) ); + p += sprintf( cmd, "%s -r -o %s %s", prog, ld_tmp_file, undef_file ); for (i = 0; argv[i]; i++) p += sprintf( p, " %s", argv[i] ); if (verbose) fprintf( stderr, "%s\n", cmd ); err = system( cmd ); - if (err) fatal_error( "%s -r failed with status %d\n", ld_command, err ); + if (err) fatal_error( "%s -r failed with status %d\n", prog, err ); free( cmd ); return ld_tmp_file; } @@ -551,6 +551,7 @@ void read_undef_symbols( DLLSPEC *spec, char **argv ) { size_t prefix_len; FILE *f; + const char *prog = get_nm_command(); char *cmd, buffer[1024], name_prefix[16]; int err; const char *name; @@ -564,9 +565,8 @@ void read_undef_symbols( DLLSPEC *spec, char **argv )
name = ldcombine_files( spec, argv );
- if (!nm_command) nm_command = xstrdup("nm"); - cmd = xmalloc( strlen(nm_command) + strlen(name) + 5 ); - sprintf( cmd, "%s -u %s", nm_command, name ); + cmd = xmalloc( strlen(prog) + strlen(name) + 5 ); + sprintf( cmd, "%s -u %s", prog, name ); if (!(f = popen( cmd, "r" ))) fatal_error( "Cannot execute '%s'\n", cmd );
diff --git a/tools/winebuild/main.c b/tools/winebuild/main.c index 126b999..47cb266 100644 --- a/tools/winebuild/main.c +++ b/tools/winebuild/main.c @@ -74,6 +74,7 @@ enum target_platform target_platform = PLATFORM_WINDOWS; enum target_platform target_platform = PLATFORM_UNSPECIFIED; #endif
+char *target_alias = NULL; char **lib_path = NULL;
char *input_file_name = NULL; @@ -162,6 +163,8 @@ static void set_target( const char *target )
/* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */
+ target_alias = xstrdup( target ); + /* get the CPU part */
if (!(p = strchr( spec, '-' ))) fatal_error( "Invalid target specification '%s'\n", target ); @@ -184,25 +187,6 @@ static void set_target( const char *target ) }
free( spec ); - - if (!as_command) - { - as_command = xmalloc( strlen(target) + sizeof("-as") ); - strcpy( as_command, target ); - strcat( as_command, "-as" ); - } - if (!ld_command) - { - ld_command = xmalloc( strlen(target) + sizeof("-ld") ); - strcpy( ld_command, target ); - strcat( ld_command, "-ld" ); - } - if (!nm_command) - { - nm_command = xmalloc( strlen(target) + sizeof("-nm") ); - strcpy( nm_command, target ); - strcat( nm_command, "-nm" ); - } }
/* cleanup on program exit */ diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c index 39162fa..d9126d8 100644 --- a/tools/winebuild/utils.c +++ b/tools/winebuild/utils.c @@ -193,6 +193,60 @@ int output( const char *format, ... ) return ret; }
+const char *get_as_command(void) +{ + if (!as_command) + { + if (target_alias) + { + as_command = xmalloc( strlen(target_alias) + sizeof("-as") ); + strcpy( as_command, target_alias ); + strcat( as_command, "-as" ); + } + else + { + as_command = xstrdup( "as" ); + } + } + return as_command; +} + +const char *get_ld_command(void) +{ + if (!ld_command) + { + if (target_alias) + { + ld_command = xmalloc( strlen(target_alias) + sizeof("-ld") ); + strcpy( ld_command, target_alias ); + strcat( ld_command, "-ld" ); + } + else + { + ld_command = xstrdup( "ld" ); + } + } + return ld_command; +} + +const char *get_nm_command(void) +{ + if (!nm_command) + { + if (target_alias) + { + nm_command = xmalloc( strlen(target_alias) + sizeof("-nm") ); + strcpy( nm_command, target_alias ); + strcat( nm_command, "-nm" ); + } + else + { + nm_command = xstrdup( "nm" ); + } + } + return nm_command; +} + /* get a name for a temp file, automatically cleaned up on exit */ char *get_temp_file_name( const char *prefix, const char *suffix ) { @@ -315,15 +369,15 @@ int remove_stdcall_decoration( char *name ) */ void assemble_file( const char *src_file, const char *obj_file ) { + const char *prog = get_as_command(); char *cmd; int err;
- if (!as_command) as_command = xstrdup("as"); - cmd = xmalloc( strlen(as_command) + strlen(obj_file) + strlen(src_file) + 6 ); - sprintf( cmd, "%s -o %s %s", as_command, obj_file, src_file ); + cmd = xmalloc( strlen(prog) + strlen(obj_file) + strlen(src_file) + 6 ); + sprintf( cmd, "%s -o %s %s", prog, obj_file, src_file ); if (verbose) fprintf( stderr, "%s\n", cmd ); err = system( cmd ); - if (err) fatal_error( "%s failed with status %d\n", as_command, err ); + if (err) fatal_error( "%s failed with status %d\n", prog, err ); free( cmd ); }