winegcc: Add --wine-objdir and --winebuild options for the Wine build.

This avoids overloading the meaning of the -B and --sysroot options.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2019-09-23 13:43:18 +02:00
parent cb010cd6ec
commit 08956bc9bb
3 changed files with 60 additions and 45 deletions

View File

@ -2321,8 +2321,13 @@ static struct strarray get_source_defines( struct makefile *make, struct incl_fi
static void output_winegcc_command( struct makefile *make ) static void output_winegcc_command( struct makefile *make )
{ {
output( "\t%s -o $@", tools_path( make, "winegcc" )); output( "\t%s -o $@", tools_path( make, "winegcc" ));
output_filename( strmake( "-B%s", tools_dir_path( make, "winebuild" ))); output_filename( "--wine-objdir" );
if (tools_dir) output_filename( strmake( "--sysroot=%s", top_obj_dir_path( make, "" ))); output_filename( top_obj_dir_path( make, "" ));
if (tools_dir)
{
output_filename( "--winebuild" );
output_filename( tools_path( make, "winebuild" ));
}
if (make->is_cross) if (make->is_cross)
{ {
output_filename( "-b" ); output_filename( "-b" );

View File

@ -210,6 +210,7 @@ struct options
int strip; int strip;
int pic; int pic;
const char* wine_objdir; const char* wine_objdir;
const char* winebuild;
const char* output_name; const char* output_name;
const char* image_base; const char* image_base;
const char* section_align; const char* section_align;
@ -845,11 +846,17 @@ static const char* compile_to_object(struct options* opts, const char* file, con
static strarray *get_winebuild_args(struct options *opts) static strarray *get_winebuild_args(struct options *opts)
{ {
const char* winebuild = getenv("WINEBUILD"); const char* winebuild = getenv("WINEBUILD");
const char *binary = NULL;
strarray *spec_args = strarray_alloc(); strarray *spec_args = strarray_alloc();
unsigned int i; unsigned int i;
if (!winebuild) winebuild = "winebuild"; if (opts->winebuild)
strarray_add( spec_args, find_binary( opts->prefix, winebuild )); binary = opts->winebuild;
else if (opts->wine_objdir)
binary = strmake( "%s/tools/winebuild/winebuild%s", opts->wine_objdir, EXEEXT );
else
binary = find_binary( opts->prefix, winebuild ? winebuild : "winebuild" );
strarray_add( spec_args, binary );
if (verbose) strarray_add( spec_args, "-v" ); if (verbose) strarray_add( spec_args, "-v" );
if (keep_generated) strarray_add( spec_args, "--save-temps" ); if (keep_generated) strarray_add( spec_args, "--save-temps" );
if (opts->target) if (opts->target)
@ -860,11 +867,8 @@ static strarray *get_winebuild_args(struct options *opts)
if (opts->prefix) if (opts->prefix)
{ {
for (i = 0; i < opts->prefix->size; i++) for (i = 0; i < opts->prefix->size; i++)
{
if (strendswith( opts->prefix->base[i], "/tools/winebuild" )) continue;
strarray_add( spec_args, strmake( "-B%s", opts->prefix->base[i] )); strarray_add( spec_args, strmake( "-B%s", opts->prefix->base[i] ));
} }
}
if (!opts->use_msvcrt) strarray_add( spec_args, "-munix" ); if (!opts->use_msvcrt) strarray_add( spec_args, "-munix" );
if (opts->unwind_tables) strarray_add( spec_args, "-fasynchronous-unwind-tables" ); if (opts->unwind_tables) strarray_add( spec_args, "-fasynchronous-unwind-tables" );
else strarray_add( spec_args, "-fno-asynchronous-unwind-tables" ); else strarray_add( spec_args, "-fno-asynchronous-unwind-tables" );
@ -1352,6 +1356,22 @@ static void parse_target_option( struct options *opts, const char *target )
opts->target = xstrdup( target ); opts->target = xstrdup( target );
} }
static int is_option( char **argv, int i, const char *option, const char **option_arg )
{
if (!strcmp( argv[i], option ))
{
if (!argv[i + 1]) error( "option %s requires an argument\n", argv[i] );
*option_arg = argv[i + 1];
return 1;
}
if (!strncmp( argv[i], option, strlen(option) ) && argv[i][strlen(option)] == '=')
{
*option_arg = argv[i] + strlen(option) + 1;
return 1;
}
return 0;
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int i, c, next_is_arg = 0, linking = 1; int i, c, next_is_arg = 0, linking = 1;
@ -1438,6 +1458,8 @@ int main(int argc, char **argv)
next_is_arg = (strcmp("--param", argv[i]) == 0 || next_is_arg = (strcmp("--param", argv[i]) == 0 ||
strcmp("--sysroot", argv[i]) == 0 || strcmp("--sysroot", argv[i]) == 0 ||
strcmp("--target", argv[i]) == 0 || strcmp("--target", argv[i]) == 0 ||
strcmp("--wine-objdir", argv[i]) == 0 ||
strcmp("--winebuild", argv[i]) == 0 ||
strcmp("--lib-suffix", argv[i]) == 0); strcmp("--lib-suffix", argv[i]) == 0);
break; break;
} }
@ -1474,19 +1496,6 @@ int main(int argc, char **argv)
case 'B': case 'B':
str = strdup(option_arg); str = strdup(option_arg);
if (strendswith(str, "/")) str[strlen(str) - 1] = 0; if (strendswith(str, "/")) str[strlen(str) - 1] = 0;
if (strendswith(str, "/tools/winebuild"))
{
char *objdir = strdup(str);
objdir[strlen(objdir) - sizeof("/tools/winebuild") + 1] = 0;
opts.wine_objdir = objdir;
/* don't pass it to the compiler, this generates warnings */
raw_compiler_arg = raw_linker_arg = 0;
}
else if (!strcmp(str, "tools/winebuild"))
{
opts.wine_objdir = ".";
raw_compiler_arg = raw_linker_arg = 0;
}
if (!opts.prefix) opts.prefix = strarray_alloc(); if (!opts.prefix) opts.prefix = strarray_alloc();
strarray_add(opts.prefix, str); strarray_add(opts.prefix, str);
break; break;
@ -1659,22 +1668,26 @@ int main(int argc, char **argv)
case '-': case '-':
if (strcmp("-static", argv[i]+1) == 0) if (strcmp("-static", argv[i]+1) == 0)
linking = -1; linking = -1;
else if (!strncmp("--sysroot", argv[i], 9)) else if (is_option( argv, i, "--sysroot", &option_arg ))
opts.sysroot = option_arg;
else if (is_option( argv, i, "--target", &option_arg ))
{ {
if (argv[i][9] == '=') opts.sysroot = argv[i] + 10; parse_target_option( &opts, option_arg );
else opts.sysroot = argv[i + 1];
if (opts.wine_objdir) raw_compiler_arg = raw_linker_arg = 0;
}
else if (!strncmp("--target", argv[i], 8))
{
if (argv[i][8] == '=') parse_target_option( &opts, argv[i] + 9 );
else parse_target_option( &opts, argv[i + 1] );
raw_compiler_arg = raw_linker_arg = 0; raw_compiler_arg = raw_linker_arg = 0;
} }
else if (!strncmp("--lib-suffix", argv[i], 12) && opts.wine_objdir) else if (is_option( argv, i, "--wine-objdir", &option_arg ))
{ {
if (argv[i][12] == '=') opts.lib_suffix = argv[i] + 13; opts.wine_objdir = option_arg;
else opts.lib_suffix = argv[i + 1]; raw_compiler_arg = raw_linker_arg = 0;
}
else if (is_option( argv, i, "--winebuild", &option_arg ))
{
opts.winebuild = option_arg;
raw_compiler_arg = raw_linker_arg = 0;
}
else if (is_option( argv, i, "--lib-suffix", &option_arg ))
{
opts.lib_suffix = option_arg;
raw_compiler_arg = raw_linker_arg = 0; raw_compiler_arg = raw_linker_arg = 0;
} }
break; break;
@ -1703,7 +1716,6 @@ int main(int argc, char **argv)
} }
} }
if (opts.wine_objdir && opts.sysroot) opts.wine_objdir = opts.sysroot;
if (opts.processor == proc_cpp) linking = 0; if (opts.processor == proc_cpp) linking = 0;
if (linking == -1) error("Static linking is not supported\n"); if (linking == -1) error("Static linking is not supported\n");

View File

@ -26,18 +26,17 @@ the gcc manual for more information on those options.
.B gcc options: .B gcc options:
All gcc options are supported, and are passed along to the backend All gcc options are supported, and are passed along to the backend
compiler. compiler.
.IP "\fB-B\fIprefix\fR"
This option specifies where to find the executables, libraries,
include files, and data files of the compiler itself. This is a
standard gcc option that has been extended to recognize a
\fIprefix\fR ending with '/tools/winebuild', in which case winegcc
enters a special mode for building Wine itself. Developers should
avoid prefixes ending with the magic suffix, or if that is not
possible, simply express it differently, such as '/tools/winebuild/',
to avoid the special behaviour.
.IP "\fB-b,--target \fItarget\fR" .IP "\fB-b,--target \fItarget\fR"
Specify the target architecture triplet for cross-compiling. winegcc Specify the target architecture triplet for cross-compiling. winegcc
will then invoke \fItarget\fR-gcc instead of gcc. will then invoke \fItarget\fR-gcc instead of gcc.
.IP "\fB--wine-objdir \fIdir\fR"
Specify the Wine object directory. This is used when building Wine
itself, to use the includes and libraries from inside the build tree.
.IP "\fB--winebuild \fIname\fR"
Specifies the path and name of the \fBwinebuild\fR binary that will be
launched automatically by \fBwinegcc\fR. If not set, \fBwinegcc\fR
will look for a file named \fIwinebuild\fR in the path. This takes
precedence over the \fBWINEBUILD\fR environment variable.
.IP \fB-fno-short-wchar\fR .IP \fB-fno-short-wchar\fR
Override the underlying type for wchar_t to be the default for the Override the underlying type for wchar_t to be the default for the
target, instead of using short unsigned int, which is the default target, instead of using short unsigned int, which is the default
@ -74,9 +73,8 @@ commas, it is split into multiple options at the commas.
.TP .TP
.B WINEBUILD .B WINEBUILD
Specifies the path and name of the \fBwinebuild\fR binary that will be Specifies the path and name of the \fBwinebuild\fR binary that will be
launched automatically by \fBwinegcc\fR. launched automatically by \fBwinegcc\fR. If not set, \fBwinegcc\fR
If not set, \fBwinegcc\fR will look for a file named \fIwinebuild\fR will look for a file named \fIwinebuild\fR in the path.
in the path.
.SH DEFINES .SH DEFINES
winegcc defines __WINE__, for code that needs to know when it is winegcc defines __WINE__, for code that needs to know when it is
being compiled under Wine. It also defines WIN32, _WIN32, __WIN32, being compiled under Wine. It also defines WIN32, _WIN32, __WIN32,