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

This commit is contained in:
Alexandre Julliard 2013-06-10 13:17:21 +02:00
parent 2daa5367f8
commit f7272176d9
5 changed files with 53 additions and 25 deletions

View File

@ -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 */

View File

@ -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 );

View File

@ -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')

View File

@ -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 );

View File

@ -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 */