Jacek Caban : winegcc: Lookup PATH in find_binary and don't try to run binaries that can't be found.
Module: wine Branch: master Commit: 945c61c32d86fa7b3bac0641840f26897e55f1ee URL: https://source.winehq.org/git/wine.git/?a=commit;h=945c61c32d86fa7b3bac06418... Author: Jacek Caban <jacek(a)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(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)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" );
participants (1)
-
Alexandre Julliard