Alexandre Julliard : winebuild: Split the names of the as and ld commands to allow arguments.

Alexandre Julliard julliard at winehq.org
Mon Jun 10 15:12:44 CDT 2013


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jun 10 13:17:21 2013 +0200

winebuild: Split the names of the as and ld commands to allow arguments.

---

 tools/winebuild/build.h  |   10 +++++-----
 tools/winebuild/import.c |    9 +++++----
 tools/winebuild/main.c   |   12 ++++++------
 tools/winebuild/res32.c  |    4 ++--
 tools/winebuild/utils.c  |   43 +++++++++++++++++++++++++++++++++++--------
 5 files changed, 53 insertions(+), 25 deletions(-)

diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h
index 08b0004..e943762 100644
--- a/tools/winebuild/build.h
+++ b/tools/winebuild/build.h
@@ -229,7 +229,7 @@ extern char *xstrdup( const char *str );
 extern char *strupper(char *s);
 extern int strendswith(const char* str, const char* end);
 extern char *strmake(const char* fmt, ...) __attribute__((__format__ (__printf__, 1, 2 )));
-extern struct strarray *strarray_init(void);
+extern struct strarray *strarray_fromstring( const char *str, const char *delim );
 extern void strarray_add( struct strarray *array, ... );
 extern void strarray_addv( struct strarray *array, char * const *argv );
 extern void strarray_free( struct strarray *array );
@@ -246,7 +246,7 @@ extern int output( const char *format, ... )
 extern void output_cfi( const char *format, ... )
    __attribute__ ((__format__ (__printf__, 1, 2)));
 extern void spawn( struct strarray *array );
-extern char *find_tool( const char *name, const char * const *names );
+extern struct strarray *find_tool( const char *name, const char * const *names );
 extern struct strarray *get_as_command(void);
 extern struct strarray *get_ld_command(void);
 extern const char *get_nm_command(void);
@@ -357,9 +357,9 @@ extern FILE *output_file;
 extern const char *output_file_name;
 extern char **lib_path;
 
-extern char *as_command;
-extern char *ld_command;
-extern char *nm_command;
+extern struct strarray *as_command;
+extern struct strarray *ld_command;
+extern struct strarray *nm_command;
 extern char *cpu_option;
 
 #endif  /* __WINE_BUILD_H */
diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c
index f533989..f8de47e 100644
--- a/tools/winebuild/import.c
+++ b/tools/winebuild/import.c
@@ -1322,7 +1322,7 @@ void output_imports( DLLSPEC *spec )
 /* output an import library for a Win32 module and additional object files */
 void output_import_lib( DLLSPEC *spec, char **argv )
 {
-    struct strarray *args = strarray_init();
+    struct strarray *args;
     char *def_file;
 
     if (target_platform != PLATFORM_WINDOWS)
@@ -1336,14 +1336,15 @@ void output_import_lib( DLLSPEC *spec, char **argv )
     fclose( output_file );
     output_file = NULL;
 
-    strarray_add( args, find_tool( "dlltool", NULL ), "-k", "-l", output_file_name, "-d", def_file, NULL );
+    args = find_tool( "dlltool", NULL );
+    strarray_add( args, "-k", "-l", output_file_name, "-d", def_file, NULL );
     spawn( args );
     strarray_free( args );
 
     if (argv[0])
     {
-        args = strarray_init();
-        strarray_add( args, find_tool( "ar", NULL ), "rs", output_file_name, NULL );
+        args = find_tool( "ar", NULL );
+        strarray_add( args, "rs", output_file_name, NULL );
         strarray_addv( args, argv );
         spawn( args );
         strarray_free( args );
diff --git a/tools/winebuild/main.c b/tools/winebuild/main.c
index 16b4165..de526a9 100644
--- a/tools/winebuild/main.c
+++ b/tools/winebuild/main.c
@@ -84,9 +84,9 @@ const char *output_file_name = NULL;
 static const char *output_file_source_name;
 static int fake_module;
 
-char *as_command = NULL;
-char *ld_command = NULL;
-char *nm_command = NULL;
+struct strarray *as_command = NULL;
+struct strarray *ld_command = NULL;
+struct strarray *nm_command = NULL;
 char *cpu_option = NULL;
 
 static int nb_res_files;
@@ -474,7 +474,7 @@ static char **parse_options( int argc, char **argv, DLLSPEC *spec )
             set_exec_mode( MODE_IMPLIB );
             break;
         case LONG_OPT_ASCMD:
-            as_command = xstrdup( optarg );
+            as_command = strarray_fromstring( optarg, " " );
             break;
         case LONG_OPT_FAKE_MODULE:
             fake_module = 1;
@@ -486,10 +486,10 @@ static char **parse_options( int argc, char **argv, DLLSPEC *spec )
             spec->characteristics |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
             break;
         case LONG_OPT_LDCMD:
-            ld_command = xstrdup( optarg );
+            ld_command = strarray_fromstring( optarg, " " );
             break;
         case LONG_OPT_NMCMD:
-            nm_command = xstrdup( optarg );
+            nm_command = strarray_fromstring( optarg, " " );
             break;
         case LONG_OPT_NXCOMPAT:
             if (optarg[0] == 'n' || optarg[0] == 'N')
diff --git a/tools/winebuild/res32.c b/tools/winebuild/res32.c
index bd3f6fa..0c39ec1 100644
--- a/tools/winebuild/res32.c
+++ b/tools/winebuild/res32.c
@@ -680,8 +680,8 @@ void output_res_o_file( DLLSPEC *spec )
     close( fd );
     free( output_buffer );
 
-    args = strarray_init();
-    strarray_add( args, find_tool( "windres", NULL ), "-i", res_file, "-o", output_file_name, NULL );
+    args = find_tool( "windres", NULL );
+    strarray_add( args, "-i", res_file, "-o", output_file_name, NULL );
     spawn( args );
     strarray_free( args );
 
diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c
index 1c77e41..d064572 100644
--- a/tools/winebuild/utils.c
+++ b/tools/winebuild/utils.c
@@ -138,12 +138,23 @@ char *strmake( const char* fmt, ... )
     }
 }
 
-struct strarray *strarray_init(void)
+static struct strarray *strarray_init( const char *str )
 {
     struct strarray *array = xmalloc( sizeof(*array) );
     array->count = 0;
     array->max = 16;
     array->str = xmalloc( array->max * sizeof(*array->str) );
+    if (str) array->str[array->count++] = str;
+    return array;
+}
+
+static struct strarray *strarray_copy( const struct strarray *src )
+{
+    struct strarray *array = xmalloc( sizeof(*array) );
+    array->count = src->count;
+    array->max = src->max;
+    array->str = xmalloc( array->max * sizeof(*array->str) );
+    memcpy( array->str, src->str, array->count * sizeof(*array->str) );
     return array;
 }
 
@@ -172,6 +183,19 @@ void strarray_addv( struct strarray *array, char * const *argv )
     while (*argv) strarray_add_one( array, *argv++ );
 }
 
+struct strarray *strarray_fromstring( const char *str, const char *delim )
+{
+    const char *tok;
+    struct strarray *array = strarray_init( NULL );
+    char *buf = strdup( str );
+
+    for (tok = strtok( buf, delim ); tok; tok = strtok( NULL, delim ))
+	strarray_add_one( array, strdup( tok ));
+
+    free( buf );
+    return array;
+}
+
 void strarray_free( struct strarray *array )
 {
     free( array->str );
@@ -277,7 +301,7 @@ void spawn( struct strarray *args )
 }
 
 /* find a build tool in the path, trying the various names */
-char *find_tool( const char *name, const char * const *names )
+struct strarray *find_tool( const char *name, const char * const *names )
 {
     static char **dirs;
     static unsigned int count, maxlen;
@@ -338,7 +362,8 @@ char *find_tool( const char *name, const char * const *names )
             strcpy( p, *names );
             strcat( p, EXEEXT );
 
-            if (!stat( file, &st ) && S_ISREG(st.st_mode) && (st.st_mode & 0111)) return file;
+            if (!stat( file, &st ) && S_ISREG(st.st_mode) && (st.st_mode & 0111))
+                return strarray_init( file );
         }
         free( file );
         names++;
@@ -349,7 +374,7 @@ char *find_tool( const char *name, const char * const *names )
 struct strarray *get_as_command(void)
 {
     static int as_is_clang = 0;
-    struct strarray *args = strarray_init();
+    struct strarray *args;
 
     if (!as_command)
     {
@@ -366,7 +391,7 @@ struct strarray *get_as_command(void)
     if (!as_command)
         fatal_error( "cannot find suitable assembler\n" );
 
-    strarray_add_one( args, as_command );
+    args = strarray_copy( as_command );
 
     if (as_is_clang)
     {
@@ -401,7 +426,7 @@ struct strarray *get_as_command(void)
 
 struct strarray *get_ld_command(void)
 {
-    struct strarray *args = strarray_init();
+    struct strarray *args;
 
     if (!ld_command)
     {
@@ -412,7 +437,7 @@ struct strarray *get_ld_command(void)
     if (!ld_command)
         fatal_error( "cannot find suitable linker\n" );
 
-    strarray_add_one( args, ld_command );
+    args = strarray_copy( ld_command );
 
     if (force_pointer_size)
     {
@@ -450,7 +475,9 @@ const char *get_nm_command(void)
 
     if (!nm_command)
         fatal_error( "cannot find suitable name lister\n" );
-    return nm_command;
+    if (nm_command->count > 1)
+        fatal_error( "multiple arguemnts in nm command not supported yet\n" );
+    return nm_command->str[0];
 }
 
 /* get a name for a temp file, automatically cleaned up on exit */




More information about the wine-cvs mailing list