Jacek Caban : winegcc: Lookup PATH in find_binary and don't try to run binaries that can't be found.
Alexandre Julliard
julliard at winehq.org
Tue Mar 3 16:24:54 CST 2020
Module: wine
Branch: master
Commit: 945c61c32d86fa7b3bac0641840f26897e55f1ee
URL: https://source.winehq.org/git/wine.git/?a=commit;h=945c61c32d86fa7b3bac0641840f26897e55f1ee
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Mar 3 14:01:59 2020 +0100
winegcc: Lookup PATH in find_binary and don't try to run binaries that can't be found.
Based on winebuild.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
tools/winegcc/utils.c | 44 ++++++++++++++++++++++++++++++++++++++------
tools/winegcc/winegcc.c | 7 ++++++-
2 files changed, 44 insertions(+), 7 deletions(-)
diff --git a/tools/winegcc/utils.c b/tools/winegcc/utils.c
index 52f46c491b..1a9bc0a63c 100644
--- a/tools/winegcc/utils.c
+++ b/tools/winegcc/utils.c
@@ -34,6 +34,12 @@
# define min(x,y) (((x) < (y)) ? (x) : (y))
#endif
+#if defined(_WIN32) && !defined(__CYGWIN__)
+# define PATH_SEPARATOR ';'
+#else
+# define PATH_SEPARATOR ':'
+#endif
+
int verbose = 0;
void error(const char* s, ...)
@@ -305,18 +311,44 @@ file_type get_lib_type(enum target_platform platform, strarray* path, const char
const char *find_binary( const strarray* prefix, const char *name )
{
+ char *file_name, *args;
+ static strarray *path;
unsigned int i;
- if (!prefix) return name;
if (strchr( name, '/' )) return name;
- for (i = 0; i < prefix->size; i++)
+ file_name = xstrdup( name );
+ if ((args = strchr( file_name, ' ' ))) *args++ = 0;
+
+ if (prefix)
+ {
+ for (i = 0; i < prefix->size; i++)
+ {
+ struct stat st;
+ char *prog = strmake( "%s/%s%s", prefix->base[i], file_name, EXEEXT );
+ if (stat( prog, &st ) == 0 && S_ISREG( st.st_mode ) && (st.st_mode & 0111))
+ return args ? strmake( "%s %s", prog, args ) : prog;
+ free( prog );
+ }
+ }
+ if (!path)
{
- struct stat st;
- char *prog = strmake( "%s/%s%s", prefix->base[i], name, EXEEXT );
- if (stat( prog, &st ) == 0 && S_ISREG( st.st_mode ) && (st.st_mode & 0111)) return prog;
+ path = strarray_alloc();
+
+ /* then append the PATH directories */
+ if (getenv( "PATH" ))
+ {
+ char *p = xstrdup( getenv( "PATH" ));
+ while (*p)
+ {
+ strarray_add( path, p );
+ while (*p && *p != PATH_SEPARATOR) p++;
+ if (!*p) break;
+ *p++ = 0;
+ }
+ }
}
- return name;
+ return prefix == path ? NULL : find_binary( path, name );
}
int spawn(const strarray* prefix, const strarray* args, int ignore_errors)
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index 20c72ec3c5..f2802e2460 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -316,6 +316,7 @@ static char* get_temp_file(const char* prefix, const char* suffix)
static const char* build_tool_name(struct options *opts, const char* base, const char* deflt)
{
+ const char *path;
char* str;
if (opts->target && opts->version)
@@ -332,7 +333,10 @@ static const char* build_tool_name(struct options *opts, const char* base, const
}
else
str = xstrdup(deflt);
- return find_binary( opts->prefix, str );
+
+ if ((path = find_binary( opts->prefix, str ))) return path;
+ error( "Could not find %s\n", base );
+ return NULL;
}
static strarray* get_translator(struct options *opts)
@@ -877,6 +881,7 @@ static strarray *get_winebuild_args(struct options *opts)
binary = strmake( "%s/winebuild%s", bindir, EXEEXT );
else
binary = find_binary( opts->prefix, "winebuild" );
+ if (!binary) error( "Could not find winebuild\n" );
strarray_add( spec_args, binary );
if (verbose) strarray_add( spec_args, "-v" );
if (keep_generated) strarray_add( spec_args, "--save-temps" );
More information about the wine-cvs
mailing list