Commit ea239f6b authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

winebuild: Use clang -print-prog-name to find LLVM tools.

parent ab017a7c
...@@ -360,9 +360,50 @@ void spawn( struct strarray args ) ...@@ -360,9 +360,50 @@ void spawn( struct strarray args )
} }
} }
static const char *find_clang_tool( const struct strarray clang, const char *tool )
{
const char *out = get_temp_file_name( "print_tool", ".out" );
struct strarray args;
int sout = -1;
char *path, *p;
struct stat st;
size_t cnt;
args = strarray_copy( clang );
strarray_add_one( &args, strmake( "-print-prog-name=%s", tool ) );
if (verbose) strarray_add_one( &args, "-v" );
sout = dup( fileno(stdout) );
freopen( out, "w", stdout );
spawn( args );
if (sout >= 0)
{
dup2( sout, fileno(stdout) );
close( sout );
}
if (stat(out, &st) || !st.st_size) return NULL;
path = xmalloc(st.st_size + 1);
sout = open(out, O_RDONLY);
if (sout == -1) return NULL;
cnt = read(sout, path, st.st_size);
close(sout);
path[cnt] = 0;
if ((p = strchr(path, '\n'))) *p = 0;
/* clang returns passed command instead of full path if the tool could not be found */
if (!strcmp(path, tool))
{
free( path );
return NULL;
}
return path;
}
/* find a build tool in the path, trying the various names */ /* find a build tool in the path, trying the various names */
struct strarray find_tool( const char *name, const char * const *names ) struct strarray find_tool( const char *name, const char * const *names )
{ {
struct strarray ret = empty_strarray;
const char *file; const char *file;
const char *alt_names[2]; const char *alt_names[2];
...@@ -375,25 +416,42 @@ struct strarray find_tool( const char *name, const char * const *names ) ...@@ -375,25 +416,42 @@ struct strarray find_tool( const char *name, const char * const *names )
while (*names) while (*names)
{ {
if ((file = find_binary( target_alias, *names )) if ((file = find_binary( target_alias, *names ))) break;
|| (names == alt_names && (file = find_binary( "llvm", *names )))) names++;
}
if (!file && names == alt_names + 1)
{ {
struct strarray ret = empty_strarray; if (cc_command.count) file = find_clang_tool( cc_command, "lld-link" );
strarray_add_one( &ret, file ); if (!file && !(file = find_binary( "llvm", name )))
return ret; {
struct strarray clang = empty_strarray;
strarray_add_one( &clang, "clang" );
file = find_clang_tool( clang, strmake( "llvm-%s", name ));
} }
names++;
} }
fatal_error( "cannot find the '%s' tool\n", name ); if (!file) fatal_error( "cannot find the '%s' tool\n", name );
strarray_add_one( &ret, file );
return ret;
} }
/* find a link tool in the path */ /* find a link tool in the path */
struct strarray find_link_tool(void) struct strarray find_link_tool(void)
{ {
struct strarray ret = empty_strarray; struct strarray ret = empty_strarray;
const char *file; const char *file = NULL;
if (!(file = find_binary( NULL, "lld-link" )))
fatal_error( "cannot find the 'lld-link tool\n" ); if (cc_command.count) file = find_clang_tool( cc_command, "lld-link" );
if (!file) file = find_binary( NULL, "lld-link" );
if (!file)
{
struct strarray clang = empty_strarray;
strarray_add_one( &clang, "clang" );
file = find_clang_tool( clang, "lld-link" );
}
if (!file) fatal_error( "cannot find the 'lld-link' tool\n" );
strarray_add_one( &ret, file ); strarray_add_one( &ret, file );
return ret; return ret;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment