wrc: Add support for target options, and define _WIN64 for 64-bit builds.

This commit is contained in:
Alexandre Julliard 2010-09-29 20:13:28 +02:00
parent c6e1a0c81e
commit e6340f1652
2 changed files with 74 additions and 55 deletions

View File

@ -52,39 +52,30 @@
static const char usage[] = static const char usage[] =
"Usage: wrc [options...] [infile[.rc|.res]]\n" "Usage: wrc [options...] [infile[.rc|.res]]\n"
" -D id[=val] Define preprocessor identifier id=val\n" " -b, --target=TARGET Specify target CPU and platform when cross-compiling\n"
" -E Preprocess only\n" " -D, --define id[=val] Define preprocessor identifier id=val\n"
" -F target Ignored for compatibility with windres\n"
" -h Prints this summary\n"
" -i file The name of the input file\n"
" -I path Set include search dir to path (multiple -I allowed)\n"
" -J format The input format (either `rc' or `rc16')\n"
" -l lan Set default language to lan (default is neutral {0, 0})\n"
" -o file Output to file (default is infile.res)\n"
" -O format The output format (either `res' or `res16`)\n"
" -r Ignored for compatibility with rc\n"
" -U id Undefine preprocessor identifier id\n"
" -v Enable verbose mode\n"
"The following long options are supported:\n"
" --debug=nn Set debug level to 'nn'\n" " --debug=nn Set debug level to 'nn'\n"
" --define Synonym for -D\n" " -E Preprocess only\n"
" --endianess=e Set output byte-order e={n[ative], l[ittle], b[ig]}\n" " --endianess=e Set output byte-order e={n[ative], l[ittle], b[ig]}\n"
" (win32 only; default is " ENDIAN "-endian)\n" " (win32 only; default is " ENDIAN "-endian)\n"
" --help Synonym for -h\n" " -F TARGET Synonym for -b for compatibility with windres\n"
" --include-dir Synonym for -I\n" " -fo FILE Synonym for -o for compatibility with windres\n"
" --input Synonym for -i\n" " -h, --help Prints this summary\n"
" --input-format Synonym for -J\n" " -i, --input=FILE The name of the input file\n"
" --language Synonym for -l\n" " -I, --include-dir=PATH Set include search dir to path (multiple -I allowed)\n"
" -J, --input-format=FORMAT The input format (either `rc' or `rc16')\n"
" -l, --language=LANG Set default language to LANG (default is neutral {0, 0})\n"
" -m16, -m32, -m64 Build for 16-bit, 32-bit resp. 64-bit platforms\n"
" --no-use-temp-file Ignored for compatibility with windres\n" " --no-use-temp-file Ignored for compatibility with windres\n"
" --nostdinc Disables searching the standard include path\n" " --nostdinc Disables searching the standard include path\n"
" --output -fo Synonym for -o\n" " -o, --output=FILE Output to file (default is infile.res)\n"
" --output-format Synonym for -O\n" " -O, --output-format=FORMAT The output format (either `res' or `res16`)\n"
" --pedantic Enable pedantic warnings\n" " --pedantic Enable pedantic warnings\n"
" --preprocessor Specifies the preprocessor to use, including arguments\n" " --preprocessor Specifies the preprocessor to use, including arguments\n"
" --target Synonym for -F\n" " -r Ignored for compatibility with rc\n"
" --undefine Synonym for -U\n" " -U, --undefine id Undefine preprocessor identifier id\n"
" --use-temp-file Ignored for compatibility with windres\n" " --use-temp-file Ignored for compatibility with windres\n"
" --verbose Synonym for -v\n" " -v, --verbose Enable verbose mode\n"
" --verify-translations Check the status of the various translations\n" " --verify-translations Check the status of the various translations\n"
" --version Print version and exit\n" " --version Print version and exit\n"
"Input is taken from stdin if no sourcefile specified.\n" "Input is taken from stdin if no sourcefile specified.\n"
@ -153,6 +144,8 @@ int no_preprocess = 0;
int check_utf8 = 1; /* whether to check for valid utf8 */ int check_utf8 = 1; /* whether to check for valid utf8 */
static int pointer_size = sizeof(void *);
static int verify_translations_mode; static int verify_translations_mode;
char *output_name = NULL; /* The name given by the -o option */ char *output_name = NULL; /* The name given by the -o option */
@ -187,7 +180,7 @@ enum long_options_values
}; };
static const char short_options[] = static const char short_options[] =
"D:Ef:F:hi:I:J:l:o:O:rU:v"; "b:D:Ef:F:hi:I:J:l:m:o:O:rU:v";
static const struct option long_options[] = { static const struct option long_options[] = {
{ "debug", 1, NULL, LONG_OPT_DEBUG }, { "debug", 1, NULL, LONG_OPT_DEBUG },
{ "define", 1, NULL, 'D' }, { "define", 1, NULL, 'D' },
@ -320,6 +313,19 @@ static int load_file( const char *input_name, const char *output_name )
return ret; return ret;
} }
static void set_target( const char *target )
{
char *p, *cpu = xstrdup( target );
/* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */
if (!(p = strchr( cpu, '-' ))) error( "Invalid target specification '%s'\n", target );
*p = 0;
if (!strcmp( cpu, "amd64" ) || !strcmp( cpu, "x86_64" ) || !strcmp( cpu, "ia64" ))
pointer_size = 8;
else
pointer_size = 4;
free( cpu );
}
int main(int argc,char *argv[]) int main(int argc,char *argv[])
{ {
@ -346,8 +352,6 @@ int main(int argc,char *argv[])
/* Set the default defined stuff */ /* Set the default defined stuff */
set_version_defines(); set_version_defines();
wpp_add_cmdline_define("RC_INVOKED=1"); wpp_add_cmdline_define("RC_INVOKED=1");
wpp_add_cmdline_define("__WIN32__=1");
wpp_add_cmdline_define("__FLAT__=1");
/* Microsoft RC always searches current directory */ /* Microsoft RC always searches current directory */
wpp_add_include_path("."); wpp_add_include_path(".");
@ -422,8 +426,9 @@ int main(int argc,char *argv[])
case 'E': case 'E':
preprocess_only = 1; preprocess_only = 1;
break; break;
case 'b':
case 'F': case 'F':
/* ignored for compatibility with windres */ set_target( optarg );
break; break;
case 'h': case 'h':
printf(usage); printf(usage);
@ -447,6 +452,12 @@ int main(int argc,char *argv[])
defaultlanguage = new_language(PRIMARYLANGID(lan), SUBLANGID(lan)); defaultlanguage = new_language(PRIMARYLANGID(lan), SUBLANGID(lan));
} }
break; break;
case 'm':
if (!strcmp( optarg, "16" )) win32 = 0;
else if (!strcmp( optarg, "32" )) { win32 = 1; pointer_size = 4; }
else if (!strcmp( optarg, "64" )) { win32 = 1; pointer_size = 8; }
else error( "Invalid option: -m%s\n", optarg );
break;
case 'f': case 'f':
if (*optarg != 'o') error("Unknown option: -f%s\n", optarg); if (*optarg != 'o') error("Unknown option: -f%s\n", optarg);
optarg++; optarg++;
@ -456,12 +467,7 @@ int main(int argc,char *argv[])
else error("Too many output files.\n"); else error("Too many output files.\n");
break; break;
case 'O': case 'O':
if (strcmp(optarg, "res16") == 0) if (strcmp(optarg, "res16") == 0) win32 = 0;
{
win32 = 0;
wpp_del_define("__WIN32__");
wpp_del_define("__FLAT__");
}
else if (strcmp(optarg, "res")) warning("Output format %s not supported.\n", optarg); else if (strcmp(optarg, "res")) warning("Output format %s not supported.\n", optarg);
break; break;
case 'r': case 'r':
@ -485,6 +491,12 @@ int main(int argc,char *argv[])
return 1; return 1;
} }
if (win32)
{
wpp_add_cmdline_define("_WIN32=1");
if (pointer_size == 8) wpp_add_cmdline_define("_WIN64=1");
}
/* If we do need to search standard includes, add them to the path */ /* If we do need to search standard includes, add them to the path */
if (stdinc) if (stdinc)
{ {

View File

@ -21,6 +21,17 @@ specified with \fI-o\fR, then \fBwrc\fR will write the output to
no inputfile was given. no inputfile was given.
.SH OPTIONS .SH OPTIONS
.TP .TP
.BI \-b,\ --target= cpu-manufacturer[-kernel]-os
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
.I \fB\-D\fR, \fB\-\-define\fR=\fIid[=val]\fR
Define preprocessor identifier \fIid\fR to (optionally) value \fIval\fR.
See also
.B PREPROCESSOR
below.
.TP
.I \fB\-\-debug\fR=\fInn\fR .I \fB\-\-debug\fR=\fInn\fR
Set debug level to \fInn\fR. The value is a bitmask consisting of Set debug level to \fInn\fR. The value is a bitmask consisting of
1=verbose, 2=dump internals, 4=resource parser trace, 8=preprocessor 1=verbose, 2=dump internals, 4=resource parser trace, 8=preprocessor
@ -32,20 +43,11 @@ l[ittle] or b[ig]. Only resources in source-form can be reorderd. Native
ordering depends on the system on which \fBwrc\fR was built. You can see ordering depends on the system on which \fBwrc\fR was built. You can see
the native ordering by typing \fIwrc \-h\fR. the native ordering by typing \fIwrc \-h\fR.
.TP .TP
.I \fB\-D\fR, \fB\-\-define\fR=\fIid[=val]\fR
Define preprocessor identifier \fIid\fR to (optionally) value \fIval\fR.
See also
.B PREPROCESSOR
below.
.TP
.I \fB\-E\fR .I \fB\-E\fR
Preprocess only. The output is written to standard output if no Preprocess only. The output is written to standard output if no
outputfile was selected. The output is compatible with what gcc would outputfile was selected. The output is compatible with what gcc would
generate. generate.
.TP .TP
.I \fB\-F\fR, \fB\-\-target\fR
Ignored for compatibility with \fIwindres\fR.
.TP
.I \fB\-h\fR, \fB\-\-help\fR .I \fB\-h\fR, \fB\-\-help\fR
Prints a summary message and exits. Prints a summary message and exits.
.TP .TP
@ -73,6 +75,11 @@ input to 'rc16' disables the recognition of win32 keywords.
Set default language to \fIlan\fR. Default is the neutral language 0 Set default language to \fIlan\fR. Default is the neutral language 0
(i.e. "LANGUAGE 0, 0"). (i.e. "LANGUAGE 0, 0").
.TP .TP
.B \-m16, -m32, -m64
Generate resources for 16-bit, 32-bit, respectively 64-bit
platforms. The only difference between 32-bit and 64-bit is whether
the _WIN64 preprocessor symbol is defined.
.TP
.I \fB\-\-nostdinc\fR .I \fB\-\-nostdinc\fR
Do not search the standard include path, look for include files only Do not search the standard include path, look for include files only
in the directories explicitly specified with the \fI\-I\fR option. in the directories explicitly specified with the \fI\-I\fR option.
@ -136,7 +143,7 @@ __WRC_MINOR__ Minor version of wrc
.br .br
__WRC_PATCHLEVEL__ Patch level __WRC_PATCHLEVEL__ Patch level
.PP .PP
Win32 compilation mode also sets __WIN32__ to 1 and __FLAT__ to 1. Win32 compilation mode also sets _WIN32 to 1.
.PP .PP
Special macros __FILE__, __LINE__, __TIME__ and __DATE__ are also Special macros __FILE__, __LINE__, __TIME__ and __DATE__ are also
recognized and expand to their respective equivalent. recognized and expand to their respective equivalent.