Alexandre Julliard : winebuild: Determine the appropriate as/ld/ nm commands at the time they are needed.

Alexandre Julliard julliard at winehq.org
Thu Feb 5 09:20:55 CST 2009


Module: wine
Branch: master
Commit: d07f67acbcb45a85d6d221333a60bdac5783a32e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d07f67acbcb45a85d6d221333a60bdac5783a32e

Author: Alexandre Julliard <julliard at 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 );
 }
 




More information about the wine-cvs mailing list