widl: Add support for standard target options to allow building the right typelib kind when cross-compiling.

This commit is contained in:
Alexandre Julliard 2009-05-21 11:37:34 +02:00
parent b3a0833972
commit f914b57277
4 changed files with 82 additions and 29 deletions

View File

@ -183,7 +183,7 @@ filter: dummy
$(WIDL) $(IDLFLAGS) -s -S $@ $<
.idl.tlb:
$(WIDL) $(IDLFLAGS) -t -T $@ $<
$(WIDL) $(TARGETFLAGS) $(IDLFLAGS) -t -T $@ $<
.c.ln:
$(LINT) -c $(ALLLINTFLAGS) $< || ( $(RM) $@ && exit 1 )

View File

@ -53,33 +53,35 @@
static const char usage[] =
"Usage: widl [options...] infile.idl\n"
" or: widl [options...] --dlldata-only name1 [name2...]\n"
" -c Generate client stub\n"
" -C file Name of client stub file (default is infile_c.c)\n"
" -d n Set debug level to 'n'\n"
" -D id[=val] Define preprocessor identifier id=val\n"
" --dlldata=file Name of the dlldata file (default is dlldata.c)\n"
" -E Preprocess only\n"
" -h Generate headers\n"
" -H file Name of header file (default is infile.h)\n"
" -I path Set include search dir to path (multiple -I allowed)\n"
" --local-stubs=file Write empty stubs for call_as/local methods to file\n"
" -N Do not preprocess input\n"
" --oldnames Use old naming conventions\n"
" -p Generate proxy\n"
" -P file Name of proxy file (default is infile_p.c)\n"
" --prefix-all=p Prefix names of client stubs / server functions with 'p'\n"
" -b arch Set the target architecture\n"
" -c Generate client stub\n"
" -C file Name of client stub file (default is infile_c.c)\n"
" -d n Set debug level to 'n'\n"
" -D id[=val] Define preprocessor identifier id=val\n"
" --dlldata=file Name of the dlldata file (default is dlldata.c)\n"
" -E Preprocess only\n"
" -h Generate headers\n"
" -H file Name of header file (default is infile.h)\n"
" -I path Set include search dir to path (multiple -I allowed)\n"
" --local-stubs=file Write empty stubs for call_as/local methods to file\n"
" -m32, -m64 Set the kind of typelib to build (Win32 or Win64)\n"
" -N Do not preprocess input\n"
" --oldnames Use old naming conventions\n"
" -p Generate proxy\n"
" -P file Name of proxy file (default is infile_p.c)\n"
" --prefix-all=p Prefix names of client stubs / server functions with 'p'\n"
" --prefix-client=p Prefix names of client stubs with 'p'\n"
" --prefix-server=p Prefix names of server functions with 'p'\n"
" -s Generate server stub\n"
" -S file Name of server stub file (default is infile_s.c)\n"
" -t Generate typelib\n"
" -T file Name of typelib file (default is infile.tlb)\n"
" -u Generate interface identifiers file\n"
" -U file Name of interface identifiers file (default is infile_i.c)\n"
" -V Print version and exit\n"
" -W Enable pedantic warnings\n"
" --win32 Only generate 32-bit code\n"
" --win64 Only generate 64-bit code\n"
" -s Generate server stub\n"
" -S file Name of server stub file (default is infile_s.c)\n"
" -t Generate typelib\n"
" -T file Name of typelib file (default is infile.tlb)\n"
" -u Generate interface identifiers file\n"
" -U file Name of interface identifiers file (default is infile_i.c)\n"
" -V Print version and exit\n"
" -W Enable pedantic warnings\n"
" --win32 Only generate 32-bit code\n"
" --win64 Only generate 64-bit code\n"
"Debug level 'n' is a bitmask with following meaning:\n"
" * 0x01 Tell which resource is parsed (verbose mode)\n"
" * 0x02 Dump internal structures\n"
@ -92,7 +94,6 @@ static const char usage[] =
static const char version_string[] = "Wine IDL Compiler version " PACKAGE_VERSION "\n"
"Copyright 2002 Ove Kaaven\n";
int win32 = 1;
int debuglevel = DEBUGLEVEL_NONE;
int parser_debug, yy_flex_debug;
@ -152,7 +153,7 @@ enum {
};
static const char short_options[] =
"cC:d:D:EhH:I:NpP:sS:tT:uU:VW";
"b:cC:d:D:EhH:I:m:NpP:sS:tT:uU:VW";
static const struct option long_options[] = {
{ "dlldata", 1, 0, DLLDATA_OPTION },
{ "dlldata-only", 0, 0, DLLDATA_ONLY_OPTION },
@ -227,6 +228,45 @@ static void add_widl_version_define(void)
wpp_add_define("__WIDL__", NULL);
}
/* set the target platform */
static void set_target( const char *target )
{
static const struct
{
const char *name;
syskind_t kind;
} cpu_names[] =
{
{ "i386", SYS_WIN32 },
{ "i486", SYS_WIN32 },
{ "i586", SYS_WIN32 },
{ "i686", SYS_WIN32 },
{ "i786", SYS_WIN32 },
{ "x86_64", SYS_WIN64 },
{ "sparc", SYS_WIN32 },
{ "alpha", SYS_WIN32 },
{ "powerpc", SYS_WIN32 }
};
unsigned int i;
char *p, *spec = xstrdup( target );
/* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */
if (!(p = strchr( spec, '-' ))) error( "Invalid target specification '%s'\n", target );
*p++ = 0;
for (i = 0; i < sizeof(cpu_names)/sizeof(cpu_names[0]); i++)
{
if (!strcmp( cpu_names[i].name, spec ))
{
typelib_kind = cpu_names[i].kind;
free( spec );
return;
}
}
error( "Unrecognized CPU '%s'\n", spec );
}
/* clean things up when aborting on a signal */
static void exit_on_signal( int sig )
{
@ -481,6 +521,9 @@ int main(int argc,char *argv[])
do_win32 = 0;
do_win64 = 1;
break;
case 'b':
set_target( optarg );
break;
case 'c':
do_everything = 0;
do_client = 1;
@ -508,6 +551,11 @@ int main(int argc,char *argv[])
case 'I':
wpp_add_include_path(optarg);
break;
case 'm':
if (!strcmp( optarg, "32" )) typelib_kind = SYS_WIN32;
else if (!strcmp( optarg, "64" )) typelib_kind = SYS_WIN64;
else error( "Invalid -m argument '%s'\n", optarg );
break;
case 'N':
no_preprocess = 1;
break;

View File

@ -34,7 +34,6 @@ extern int debuglevel;
#define DEBUGLEVEL_PPLEX 0x0010
#define DEBUGLEVEL_PPTRACE 0x0020
extern int win32;
extern int pedantic;
extern int do_everything;
extern int do_header;

View File

@ -31,6 +31,10 @@ will print a help message.
.B General options:
.IP "\fB-V\fR"
Print version number and exit.
.IP "\fB-b \fIcpu-manufacturer[-kernel]-os\fR"
Set the target architecture when cross-compiling. The target
specification is in the standard autoconf format as returned by
config.sub.
.PP
.B Header options:
.IP "\fB-h\fR"
@ -47,6 +51,8 @@ Generate a type library.
.IP "\fB-T \fIfile\fR"
Define the name of the type library to be generated.
The default filename is \fIinfile\fR.tlb.
.IP "\fB-m32, -m64\fR"
Generate a Win32, respectively Win64, type library.
.PP
.B UUID file options:
.IP "\fB-u\fR"