winebuild: Determine the appropriate as/ld/nm commands at the time they are needed.
This commit is contained in:
parent
63abc12461
commit
d07f67acbc
|
@ -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 );
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue