Alexandre Julliard : winebuild: Add support for the -B option.
Alexandre Julliard
julliard at winehq.org
Tue Sep 10 16:49:29 CDT 2019
Module: wine
Branch: master
Commit: 6ba101b22965d9b9ef66d54c0d12c253db0f4569
URL: https://source.winehq.org/git/wine.git/?a=commit;h=6ba101b22965d9b9ef66d54c0d12c253db0f4569
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Sep 10 17:53:19 2019 +0200
winebuild: Add support for the -B option.
Based on a patch by Kevin Puetz.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
tools/winebuild/build.h | 1 +
tools/winebuild/main.c | 7 ++-
tools/winebuild/utils.c | 123 ++++++++++++++++++++++-----------------
tools/winebuild/winebuild.man.in | 4 ++
4 files changed, 80 insertions(+), 55 deletions(-)
diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h
index bde322cef3..2b67d305e8 100644
--- a/tools/winebuild/build.h
+++ b/tools/winebuild/build.h
@@ -369,6 +369,7 @@ extern FILE *output_file;
extern const char *output_file_name;
extern struct strarray lib_path;
+extern struct strarray tools_path;
extern struct strarray as_command;
extern struct strarray cc_command;
extern struct strarray ld_command;
diff --git a/tools/winebuild/main.c b/tools/winebuild/main.c
index 7d54395860..f4abb55081 100644
--- a/tools/winebuild/main.c
+++ b/tools/winebuild/main.c
@@ -83,6 +83,7 @@ const char *output_file_name = NULL;
static int fake_module;
struct strarray lib_path = { 0 };
+struct strarray tools_path = { 0 };
struct strarray as_command = { 0 };
struct strarray cc_command = { 0 };
struct strarray ld_command = { 0 };
@@ -257,6 +258,7 @@ static const char usage_str[] =
"Options:\n"
" --as-cmd=AS Command to use for assembling (default: as)\n"
" -b, --target=TARGET Specify target CPU and platform for cross-compiling\n"
+" -B PREFIX Look for build tools in the PREFIX directory\n"
" --cc-cmd=CC C compiler to use for assembling (default: fall back to --as-cmd)\n"
" -d, --delay-lib=LIB Import the specified library in delayed mode\n"
" -D SYM Ignored for C flags compatibility\n"
@@ -316,7 +318,7 @@ enum long_options_values
LONG_OPT_VERSION
};
-static const char short_options[] = "C:D:E:F:H:I:K:L:M:N:b:d:e:f:hkl:m:o:r:u:vw";
+static const char short_options[] = "B:C:D:E:F:H:I:K:L:M:N:b:d:e:f:hkl:m:o:r:u:vw";
static const struct option long_options[] =
{
@@ -389,6 +391,9 @@ static char **parse_options( int argc, char **argv, DLLSPEC *spec )
{
switch(optc)
{
+ case 'B':
+ strarray_add( &tools_path, xstrdup( optarg ), NULL );
+ break;
case 'D':
/* ignored */
break;
diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c
index fe82ad75e9..a73f520ccc 100644
--- a/tools/winebuild/utils.c
+++ b/tools/winebuild/utils.c
@@ -281,11 +281,72 @@ int output( const char *format, ... )
return ret;
}
+static struct strarray get_tools_path(void)
+{
+ static int done;
+ static struct strarray dirs;
+
+ if (!done)
+ {
+ dirs = strarray_copy( tools_path );
+
+ /* then append the PATH directories */
+ if (getenv( "PATH" ))
+ {
+ char *p = xstrdup( getenv( "PATH" ));
+ while (*p)
+ {
+ strarray_add_one( &dirs, p );
+ while (*p && *p != PATH_SEPARATOR) p++;
+ if (!*p) break;
+ *p++ = 0;
+ }
+ }
+ done = 1;
+ }
+ return dirs;
+}
+
+/* find a binary in the path */
+static const char *find_binary( const char *prefix, const char *name )
+{
+ struct strarray dirs = get_tools_path();
+ unsigned int i, maxlen = 0;
+ struct stat st;
+ char *p, *file;
+
+ if (strchr( name, '/' )) return name;
+ if (!prefix) prefix = "";
+ for (i = 0; i < dirs.count; i++) maxlen = max( maxlen, strlen(dirs.str[i]) + 2 );
+ file = xmalloc( maxlen + strlen(prefix) + strlen(name) + sizeof(EXEEXT) + 1 );
+
+ for (i = 0; i < dirs.count; i++)
+ {
+ strcpy( file, dirs.str[i] );
+ p = file + strlen(file);
+ if (p == file) *p++ = '.';
+ if (p[-1] != '/') *p++ = '/';
+ if (*prefix)
+ {
+ strcpy( p, prefix );
+ p += strlen(p);
+ *p++ = '-';
+ }
+ strcpy( p, name );
+ strcat( p, EXEEXT );
+ if (!stat( file, &st ) && S_ISREG(st.st_mode) && (st.st_mode & 0111)) return file;
+ }
+ free( file );
+ return NULL;
+}
+
void spawn( struct strarray args )
{
unsigned int i;
int status;
+ const char *argv0 = find_binary( NULL, args.str[0] );
+ if (argv0) args.str[0] = argv0;
strarray_add_one( &args, NULL );
if (verbose)
for (i = 0; args.str[i]; i++)
@@ -302,35 +363,8 @@ void spawn( struct strarray args )
/* find a build tool in the path, trying the various names */
struct strarray find_tool( const char *name, const char * const *names )
{
- static char **dirs;
- static unsigned int count, maxlen;
-
- char *p, *file;
+ const char *file;
const char *alt_names[2];
- unsigned int i, len;
- struct stat st;
-
- if (!dirs)
- {
- char *path;
-
- /* split the path in directories */
-
- if (!getenv( "PATH" )) fatal_error( "PATH not set, cannot find required tools\n" );
- path = xstrdup( getenv( "PATH" ));
- for (p = path, count = 2; *p; p++) if (*p == PATH_SEPARATOR) count++;
- dirs = xmalloc( count * sizeof(*dirs) );
- count = 0;
- dirs[count++] = p = path;
- while (*p)
- {
- while (*p && *p != PATH_SEPARATOR) p++;
- if (!*p) break;
- *p++ = 0;
- dirs[count++] = p;
- }
- for (i = 0; i < count; i++) maxlen = max( maxlen, strlen(dirs[i])+2 );
- }
if (!names)
{
@@ -341,34 +375,12 @@ struct strarray find_tool( const char *name, const char * const *names )
while (*names)
{
- len = strlen(*names) + sizeof(EXEEXT) + 1;
- if (target_alias)
- len += strlen(target_alias) + 1;
- file = xmalloc( maxlen + len );
-
- for (i = 0; i < count; i++)
+ if ((file = find_binary( target_alias, *names )))
{
- strcpy( file, dirs[i] );
- p = file + strlen(file);
- if (p == file) *p++ = '.';
- if (p[-1] != '/') *p++ = '/';
- if (target_alias)
- {
- strcpy( p, target_alias );
- p += strlen(p);
- *p++ = '-';
- }
- strcpy( p, *names );
- strcat( p, EXEEXT );
-
- if (!stat( file, &st ) && S_ISREG(st.st_mode) && (st.st_mode & 0111))
- {
- struct strarray ret = empty_strarray;
- strarray_add_one( &ret, file );
- return ret;
- }
+ struct strarray ret = empty_strarray;
+ strarray_add_one( &ret, file );
+ return ret;
}
- free( file );
names++;
}
fatal_error( "cannot find the '%s' tool\n", name );
@@ -377,6 +389,7 @@ struct strarray find_tool( const char *name, const char * const *names )
struct strarray get_as_command(void)
{
struct strarray args;
+ unsigned int i;
if (cc_command.count)
{
@@ -387,6 +400,8 @@ struct strarray get_as_command(void)
if (cpu_option) strarray_add_one( &args, strmake("-mcpu=%s", cpu_option) );
if (fpu_option) strarray_add_one( &args, strmake("-mfpu=%s", fpu_option) );
if (arch_option) strarray_add_one( &args, strmake("-march=%s", arch_option) );
+ for (i = 0; i < tools_path.count; i++)
+ strarray_add_one( &args, strmake("-B%s", tools_path.str[i] ));
return args;
}
diff --git a/tools/winebuild/winebuild.man.in b/tools/winebuild/winebuild.man.in
index 1b9b1b088b..12bafd72d3 100644
--- a/tools/winebuild/winebuild.man.in
+++ b/tools/winebuild/winebuild.man.in
@@ -68,6 +68,10 @@ Specify the target CPU and platform on which the generated code will
be built. The target specification is in the standard autoconf format
as returned by config.sub.
.TP
+.BI \-B\ directory
+Add the directory to the search path for the various binutils tools
+like \fBas\fR, \fBnm\fR and \fBld\fR.
+.TP
.BI \--cc-cmd= cc-command
Specify the C compiler to use to compile assembly files; the default
is to instead use the assembler specified with \fB--as-cmd\fR.
More information about the wine-cvs
mailing list