Converted winebuild option parsing to use getopt_long. Added a number

of long aliases for the existing short options.
oldstable
Alexandre Julliard 2003-03-23 01:12:30 +00:00
parent bdbde0f814
commit 9e4fc4c9b6
15 changed files with 293 additions and 374 deletions

View File

@ -127,7 +127,7 @@ LINTS = $(C_SRCS:.c=.ln)
$(WINDRES) -i $< -o $@
.spec.spec.c:
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ -M $(MODULE) --spec $<
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --main-module $(MODULE) --spec $<
.spec.spec.def:
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --def $<

View File

@ -26,7 +26,7 @@ all: $(MODULE)$(DLLEXT) $(SUBDIRS)
# Rules for .so files
$(MAINSPEC).c: $(MAINSPEC) $(RC_SRCS:.rc=.res) $(SYMBOLFILE) $(IMPORTLIBS) $(WINEBUILD)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --spec $(SRCDIR)/$(MAINSPEC) $(RC_SRCS:.rc=.res) $(SYMBOLFILE) $(DLLMAIN:%=-e %) -L$(DLLDIR) $(DELAYIMPORTS:%=-d%) $(IMPORTS:%=-l%)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --spec $(SRCDIR)/$(MAINSPEC) $(RC_SRCS:.rc=.res) $(SYMBOLFILE) $(DLLMAIN:%=--entry %) -L$(DLLDIR) $(DELAYIMPORTS:%=-d%) $(IMPORTS:%=-l%)
$(MODULE).so: $(MAINSPEC).o $(ALL_OBJS) Makefile.in
$(LDSHARED) $(LDDLLFLAGS) $(MAINSPEC).o $(ALL_OBJS) -o $@ -L$(DLLDIR) $(LDIMPORTS:%=-l%) $(ALL_LIBS) -lc

View File

@ -34,7 +34,7 @@ all: $(TESTPROGRAM)
# Rule for main module spec file
$(MODULE).spec.c: $(RC_SRCS:.rc=.res) $(OBJS) $(IMPORTLIBS) $(WINEBUILD)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ -exe $(MODULE) -mcui $(RC_SRCS:.rc=.res) $(OBJS) -L$(DLLDIR) -L.. $(DELAYIMPORTS:%=-d%) $(IMPORTS:%=-l%)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe $(MODULE) --exe-mode cui $(RC_SRCS:.rc=.res) $(OBJS) -L$(DLLDIR) -L.. $(DELAYIMPORTS:%=-d%) $(IMPORTS:%=-l%)
# Rules for .so main module

View File

@ -75,7 +75,7 @@ EXTRASUBDIRS = \
# Special rules for 16-bit resource and spec files
gdi.exe.spec.c: gdi.exe.spec version16.res
$(LDPATH) $(WINEBUILD) $(DEFS) -H 65520 -o $@ -M $(MODULE) -r version16.res --spec $(SRCDIR)/gdi.exe.spec
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --heap 65520 --main-module $(MODULE) --res version16.res --spec $(SRCDIR)/gdi.exe.spec
version16.res: version16.rc
$(LDPATH) $(WRC) $(WRCFLAGS) $(DIVINCL) -o $@ -w16 $(SRCDIR)/version16.rc

View File

@ -52,7 +52,7 @@ kernel.res: $(MC_SRCS:.mc=.mc.rc)
# Special rules for 16-bit resource and spec files
krnl386.exe.spec.c: krnl386.exe.spec version16.res
$(LDPATH) $(WINEBUILD) $(DEFS) -N kernel -o $@ -M $(MODULE) -r version16.res --spec $(SRCDIR)/krnl386.exe.spec
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --dll-name kernel --main-module $(MODULE) --res version16.res --spec $(SRCDIR)/krnl386.exe.spec
version16.res: version16.rc
$(LDPATH) $(WRC) $(WRCFLAGS) $(DIVINCL) -o $@ -w16 $(SRCDIR)/version16.rc

View File

@ -69,6 +69,6 @@ version16.res: version16.rc
$(LDPATH) $(WRC) $(WRCFLAGS) $(DIVINCL) -o $@ -w16 $(SRCDIR)/version16.rc
shell.spec.c: shell.spec version16.res
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ -M $(MODULE) -r version16.res --spec $(SRCDIR)/shell.spec
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --main-module $(MODULE) --res version16.res --spec $(SRCDIR)/shell.spec
### Dependencies:

View File

@ -103,13 +103,13 @@ EXTRASUBDIRS = \
# Special rules for 16-bit resource and spec files
user.exe.spec.c: user.exe.spec resources/version16.res
$(LDPATH) $(WINEBUILD) $(DEFS) -H 65520 -o $@ -M $(MODULE) -r resources/version16.res --spec $(SRCDIR)/user.exe.spec
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --heap 65520 --main-module $(MODULE) --res resources/version16.res --spec $(SRCDIR)/user.exe.spec
display.spec.c: display.spec resources/display.res
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ -M $(MODULE) -r resources/display.res --spec $(SRCDIR)/display.spec
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --main-module $(MODULE) --res resources/display.res --spec $(SRCDIR)/display.spec
mouse.spec.c: mouse.spec resources/mouse.res
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ -M $(MODULE) -r resources/mouse.res --spec $(SRCDIR)/mouse.spec
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --main-module $(MODULE) --res resources/mouse.res --spec $(SRCDIR)/mouse.spec
resources/display.res: resources/display.rc
$(LDPATH) $(WRC) $(WRCFLAGS) $(DIVINCL) -o $@ -w16 $(SRCDIR)/resources/display.rc

View File

@ -21,7 +21,7 @@ $(MODULE): $(ALL_OBJS)
$(CC) -o $@ $(ALL_OBJS) -L$(DLLDIR) $(LDIMPORTS:%=-l%) $(LIBWINE) $(LIBUNICODE) $(LIBPORT) $(LIBS) $(LDFLAGS)
wine.spec.c: $(WINEBUILD)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe wine -mgui -e wine_initial_task -L$(DLLDIR) $(IMPORTS:%=-l%)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe wine --exe-mode gui --entry wine_initial_task -L$(DLLDIR) $(IMPORTS:%=-l%)
install:: $(MODULE)
$(MKINSTALLDIRS) $(bindir)

View File

@ -24,7 +24,7 @@ all: $(MODULE)$(DLLEXT) $(BASEMODULE)$(EXEEXT)
# Rule for main module spec file
$(MODULE).spec.c: $(RC_SRCS:.rc=.res) $(ALL_OBJS) $(WINEBUILD)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe $(MODULE) $(APPMODE:%=-m%) $(RC_SRCS:.rc=.res) $(ALL_OBJS) -L$(DLLDIR) $(DELAYIMPORTS:%=-d%) $(IMPORTS:%=-l%)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe $(MODULE) $(APPMODE:%=--exe-mode %) $(RC_SRCS:.rc=.res) $(ALL_OBJS) -L$(DLLDIR) $(DELAYIMPORTS:%=-d%) $(IMPORTS:%=-l%)
# Rules for .so main module

View File

@ -18,13 +18,13 @@ C_SRCS = \
all: $(PROGRAMS:%=%$(DLLEXT)) $(PROGRAMS:.exe=$(EXEEXT))
aviinfo.exe.spec.c: aviinfo.o $(WINEBUILD)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe aviinfo.exe -mgui aviinfo.o -L$(DLLDIR) -lkernel32
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe aviinfo.exe --exe-mode gui aviinfo.o -L$(DLLDIR) -lkernel32
aviplay.exe.spec.c: aviplay.o $(WINEBUILD)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe aviplay.exe -mgui aviplay.o -L$(DLLDIR) -lddraw -lkernel32
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe aviplay.exe --exe-mode gui aviplay.o -L$(DLLDIR) -lddraw -lkernel32
icinfo.exe.spec.c: icinfo.o $(WINEBUILD)
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe icinfo.exe -mgui icinfo.o -L$(DLLDIR) -lmsvfw32 -lkernel32
$(LDPATH) $(WINEBUILD) $(DEFS) -o $@ --exe icinfo.exe --exe-mode gui icinfo.o -L$(DLLDIR) -lmsvfw32 -lkernel32
aviinfo.exe.so: aviinfo.o aviinfo.exe.spec.o
$(LDSHARED) $(LDDLLFLAGS) -o $@ aviinfo.o aviinfo.exe.spec.o $(ALL_LIBS) -lc

View File

@ -31,12 +31,6 @@
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_ASM_STRING
# define STRING ".string"
#else
# define STRING ".ascii"
#endif
typedef enum
{
TYPE_VARIABLE, /* variable */
@ -185,9 +179,9 @@ extern int nb_errors;
extern int display_warnings;
extern int kill_at;
extern char DLLName[80];
extern char DLLFileName[80];
extern char owner_name[80];
extern char *owner_name;
extern char *dll_name;
extern char *dll_file_name;
extern char *init_func;
extern char *input_file_name;
extern const char *output_file_name;

View File

@ -30,6 +30,9 @@
#include <errno.h>
#include <string.h>
#include <ctype.h>
#ifdef HAVE_GETOPT_H
# include <getopt.h>
#endif
#include "build.h"
@ -60,9 +63,9 @@ int debugging = 1;
int debugging = 0;
#endif
char DLLName[80];
char DLLFileName[80];
char owner_name[80];
char *owner_name = NULL;
char *dll_name = NULL;
char *dll_file_name = NULL;
char *init_func = NULL;
char **debug_channels = NULL;
char **lib_path = NULL;
@ -77,7 +80,7 @@ static int nb_res_files;
static char **res_files;
/* execution mode */
static enum
enum exec_mode_values
{
MODE_NONE,
MODE_SPEC,
@ -87,20 +90,23 @@ static enum
MODE_DEBUG,
MODE_RELAY16,
MODE_RELAY32
} exec_mode = MODE_NONE;
};
static enum exec_mode_values exec_mode = MODE_NONE;
/* set the dll file name from the input file name */
static void set_dll_file_name( const char *name )
{
char *p;
if (*DLLFileName) return;
if (dll_file_name) return;
if ((p = strrchr( name, '\\' ))) name = p + 1;
if ((p = strrchr( name, '/' ))) name = p + 1;
strcpy( DLLFileName, name );
if ((p = strrchr( DLLFileName, '.' )) && !strcmp( p, ".spec" )) *p = 0;
if (!strchr( DLLFileName, '.' )) strcat( DLLFileName, ".dll" );
dll_file_name = xmalloc( strlen(name) + 5 );
strcpy( dll_file_name, name );
if ((p = strrchr( dll_file_name, '.' )) && !strcmp( p, ".spec" )) *p = 0;
if (!strchr( dll_file_name, '.' )) strcat( dll_file_name, ".dll" );
}
/* cleanup on program exit */
@ -113,316 +119,232 @@ static void cleanup(void)
/*******************************************************************
* command-line option handling
*/
static const char usage_str[] =
"Usage: winebuild [OPTIONS] [FILES]\n\n"
"Options:\n"
" -C --source-dir=DIR Look for source files in DIR\n"
" -d --delay-lib=LIB Import the specified library in delayed mode\n"
" -D SYM Ignored for C flags compatibility\n"
" -e --entry=FUNC Set the DLL entry point function (default: DllMain)\n"
" -f FLAGS Compiler flags (only -fPIC is supported)\n"
" -F --filename=DLLFILE Set the DLL filename (default: from input file name)\n"
" -h --help Display this help message\n"
" -H --heap=SIZE Set the heap size for a Win16 dll\n"
" -i --ignore=SYM[,SYM] Ignore specified symbols when resolving imports\n"
" -I DIR Ignored for C flags compatibility\n"
" -k --kill-at Kill stdcall decorations in generated .def files\n"
" -K FLAGS Compiler flags (only -KPIC is supported)\n"
" -l --library=LIB Import the specified library\n"
" -L --library-path=DIR Look for imports libraries in DIR\n"
" -m --exe-mode=MODE Set the executable mode (cui|gui|cuiw|guiw)\n"
" -M --main-module=MODULE Set the name of the main module for a Win16 dll\n"
" -N --dll-name=DLLNAME Set the DLL name (default: from input file name)\n"
" -o --output=NAME Set the output file name (default: stdout)\n"
" -r --res=RSRC.RES Load resources from RSRC.RES\n"
" --version Print the version and exit\n"
" -w --warnings Turn on warnings\n"
"\nMode options:\n"
" --spec=FILE.SPEC Build a .c file from a spec file\n"
" --def=FILE.SPEC Build a .def file from a spec file\n"
" --exe=NAME Build a .c file for the named executable\n"
" --debug [FILES] Build a .c file with the debug channels declarations\n"
" --glue [FILES] Build the 16-bit glue for the source files\n"
" --relay16 Build the 16-bit relay assembly routines\n"
" --relay32 Build the 32-bit relay assembly routines\n\n"
"The mode options are mutually exclusive; you must specify one and only one.\n\n";
struct option_descr
enum long_options_values
{
const char *name;
int has_arg;
void (*func)();
const char *usage;
LONG_OPT_SPEC = 1,
LONG_OPT_DEF,
LONG_OPT_EXE,
LONG_OPT_DEBUG,
LONG_OPT_GLUE,
LONG_OPT_RELAY16,
LONG_OPT_RELAY32,
LONG_OPT_VERSION
};
static void do_output( const char *arg );
static void do_usage(void);
static void do_warnings(void);
static void do_f_flags( const char *arg );
static void do_define( const char *arg );
static void do_include( const char *arg );
static void do_k_flags( const char *arg );
static void do_ignore( const char *arg );
static void do_kill_at(void);
static void do_exe_mode( const char *arg );
static void do_module( const char *arg );
static void do_heap( const char *arg );
static void do_name( const char *arg );
static void do_file( const char *arg );
static void do_entry( const char *arg );
static void do_spec( const char *arg );
static void do_def( const char *arg );
static void do_exe( const char *arg );
static void do_glue(void);
static void do_relay16(void);
static void do_relay32(void);
static void do_debug(void);
static void do_chdir( const char *arg );
static void do_lib( const char *arg );
static void do_import( const char *arg );
static void do_dimport( const char *arg );
static void do_rsrc( const char *arg );
static const char short_options[] = "C:D:F:H:I:K:L:M:N:d:e:f:hi:kl:m:o:r:w";
static const struct option_descr option_table[] =
static const struct option long_options[] =
{
{ "-h", 0, do_usage, "-h Display this help message" },
{ "-w", 0, do_warnings,"-w Turn on warnings" },
{ "-C", 1, do_chdir, "-C dir Change directory to <dir> before opening source files" },
{ "-f", 1, do_f_flags, "-f flags Compiler flags (only -fPIC is supported)" },
{ "-D", 1, do_define, "-D sym Ignored for C flags compatibility" },
{ "-I", 1, do_include, "-I dir Ignored for C flags compatibility" },
{ "-K", 1, do_k_flags, "-K flags Compiler flags (only -KPIC is supported)" },
{ "-i", 1, do_ignore, "-i sym[,sym] Ignore specified symbols when resolving imports" },
{ "-k", 0, do_kill_at, "-k Kill stdcall decorations in generated .def files" },
{ "-m", 1, do_exe_mode,"-m mode Set the executable mode (cui|gui|cuiw|guiw)" },
{ "-M", 1, do_module, "-M module Set the name of the main (Win32) module for a Win16 dll" },
{ "-L", 1, do_lib, "-L directory Look for imports libraries in 'directory'" },
{ "-l", 1, do_import, "-l lib.dll Import the specified library" },
{ "-d", 1, do_dimport, "-d lib.dll Delay-import the specified library" },
{ "-H", 1, do_heap, "-H size Set the heap size for a Win16 dll" },
{ "-N", 1, do_name, "-N dllname Set the DLL name (default: set from input file name)" },
{ "-F", 1, do_file, "-F dllfile Set the DLL filename (default: set from input file name)" },
{ "-e", 1, do_entry, "-e function Set the DLL entry point function (default: DllMain)" },
{ "-r", 1, do_rsrc, "-r rsrc.res Load resources from rsrc.res" },
{ "-res", 1, do_rsrc, NULL }, /* for backwards compatibility, will disappear */
{ "-o", 1, do_output, "-o name Set the output file name (default: stdout)\n" },
{ "--spec", 1, do_spec, "--spec file.spec Build a .c file from a spec file" },
{ "--def", 1, do_def, "--def file.spec Build a .def file from a spec file" },
{ "--exe", 1, do_exe, "--exe name Build a .c file for the named executable" },
{ "--debug", 0, do_debug, "--debug [files] Build a .c file containing debug channels declarations" },
{ "--glue", 0, do_glue, "--glue [files] Build the 16-bit glue for the source files" },
{ "--relay16", 0, do_relay16, "--relay16 Build the 16-bit relay assembly routines" },
{ "--relay32", 0, do_relay32, "--relay32 Build the 32-bit relay assembly routines" },
{ NULL, 0, NULL, NULL }
{ "spec", 1, 0, LONG_OPT_SPEC },
{ "def", 1, 0, LONG_OPT_DEF },
{ "exe", 1, 0, LONG_OPT_EXE },
{ "debug", 0, 0, LONG_OPT_DEBUG },
{ "glue", 0, 0, LONG_OPT_GLUE },
{ "relay16", 0, 0, LONG_OPT_RELAY16 },
{ "relay32", 0, 0, LONG_OPT_RELAY32 },
{ "version", 0, 0, LONG_OPT_VERSION },
/* aliases for short options */
{ "source-dir", 1, 0, 'C' },
{ "delay-lib", 1, 0, 'd' },
{ "entry", 1, 0, 'e' },
{ "filename", 1, 0, 'F' },
{ "help", 0, 0, 'h' },
{ "heap", 1, 0, 'H' },
{ "ignore", 1, 0, 'i' },
{ "kill-at", 0, 0, 'k' },
{ "library", 1, 0, 'l' },
{ "library-path", 1, 0, 'L' },
{ "exe-mode", 1, 0, 'm' },
{ "main-module", 1, 0, 'M' },
{ "dll-name", 1, 0, 'N' },
{ "output", 1, 0, 'o' },
{ "res", 1, 0, 'r' },
{ "warnings", 0, 0, 'w' },
{ NULL, 0, 0, 0 }
};
static void do_output( const char *arg )
static void usage( int exit_code )
{
if ( ( unlink ( arg ) ) == -1 && ( errno != ENOENT ) )
{
fprintf ( stderr, "Unable to create output file '%s'\n", arg );
exit (1);
}
if (!(output_file = fopen( arg, "w" )))
{
fprintf( stderr, "Unable to create output file '%s'\n", arg );
exit(1);
}
output_file_name = arg;
atexit( cleanup ); /* make sure we remove the output file on exit */
fprintf( stderr, "%s", usage_str );
exit( exit_code );
}
static void do_usage(void)
static void set_exec_mode( enum exec_mode_values mode )
{
const struct option_descr *opt;
fprintf( stderr, "Usage: winebuild [options]\n\n" );
fprintf( stderr, "Options:\n" );
for (opt = option_table; opt->name; opt++)
if (opt->usage) fprintf( stderr, " %s\n", opt->usage );
fprintf( stderr, "\nExactly one of --spec, --def, --exe, --debug, --glue, --relay16 or --relay32 must be specified.\n\n" );
exit(1);
}
static void do_warnings(void)
{
display_warnings = 1;
}
static void do_f_flags( const char *arg )
{
if (!strcmp( arg, "PIC" )) UsePIC = 1;
/* ignore all other flags */
}
static void do_define( const char *arg )
{
/* nothing */
}
static void do_include( const char *arg )
{
/* nothing */
}
static void do_k_flags( const char *arg )
{
/* Ignored, because cc generates correct code. */
/* if (!strcmp( arg, "PIC" )) UsePIC = 1; */
/* ignore all other flags */
}
static void do_ignore( const char *arg )
{
char *str = xstrdup( arg );
char *token = strtok( str, "," );
while (token)
{
add_ignore_symbol( token );
token = strtok( NULL, "," );
}
free( str );
}
static void do_kill_at(void)
{
kill_at = 1;
}
static void do_heap( const char *arg )
{
if (!isdigit(arg[0]))
fatal_error( "Expected number argument with -H option instead of '%s'\n", arg );
DLLHeapSize = atoi(arg);
if (DLLHeapSize > 65535) fatal_error( "Invalid heap size %d, maximum is 65535\n", DLLHeapSize );
}
static void do_name( const char *arg )
{
strncpy( DLLName, arg, sizeof(DLLName) );
DLLName[sizeof(DLLName) - 1] = 0;
}
static void do_file( const char *arg )
{
strncpy( DLLFileName, arg, sizeof(DLLFileName) );
DLLFileName[sizeof(DLLFileName) - 1] = 0;
}
static void do_entry( const char *arg )
{
init_func = xstrdup( arg );
}
static void do_spec( const char *arg )
{
if (exec_mode != MODE_NONE || !arg[0]) do_usage();
exec_mode = MODE_SPEC;
input_file = open_input_file( NULL, arg );
set_dll_file_name( arg );
}
static void do_def( const char *arg )
{
if (exec_mode != MODE_NONE || !arg[0]) do_usage();
exec_mode = MODE_DEF;
input_file = open_input_file( NULL, arg );
set_dll_file_name( arg );
}
static void do_exe( const char *arg )
{
const char *p;
if (exec_mode != MODE_NONE || !arg[0]) do_usage();
exec_mode = MODE_EXE;
if ((p = strrchr( arg, '/' ))) p++;
else p = arg;
strcpy( DLLFileName, p );
if (!strchr( DLLFileName, '.' )) strcat( DLLFileName, ".exe" );
if (SpecMode == SPEC_MODE_DLL) SpecMode = SPEC_MODE_GUIEXE;
}
static void do_exe_mode( const char *arg )
{
if (!strcmp( arg, "gui" )) SpecMode = SPEC_MODE_GUIEXE;
else if (!strcmp( arg, "cui" )) SpecMode = SPEC_MODE_CUIEXE;
else if (!strcmp( arg, "guiw" )) SpecMode = SPEC_MODE_GUIEXE_UNICODE;
else if (!strcmp( arg, "cuiw" )) SpecMode = SPEC_MODE_CUIEXE_UNICODE;
else do_usage();
}
static void do_module( const char *arg )
{
strcpy( owner_name, arg );
SpecType = SPEC_WIN16;
}
static void do_glue(void)
{
if (exec_mode != MODE_NONE) do_usage();
exec_mode = MODE_GLUE;
}
static void do_debug(void)
{
if (exec_mode != MODE_NONE) do_usage();
exec_mode = MODE_DEBUG;
}
static void do_chdir( const char *arg )
{
current_src_dir = arg;
}
static void do_relay16(void)
{
if (exec_mode != MODE_NONE) do_usage();
exec_mode = MODE_RELAY16;
}
static void do_relay32(void)
{
if (exec_mode != MODE_NONE) do_usage();
exec_mode = MODE_RELAY32;
}
static void do_lib( const char *arg )
{
lib_path = xrealloc( lib_path, (nb_lib_paths+1) * sizeof(*lib_path) );
lib_path[nb_lib_paths++] = xstrdup( arg );
}
static void do_import( const char *arg )
{
add_import_dll( arg, 0 );
}
static void do_dimport( const char *arg )
{
add_import_dll( arg, 1 );
}
static void do_rsrc( const char *arg )
{
res_files = xrealloc( res_files, (nb_res_files+1) * sizeof(*res_files) );
res_files[nb_res_files++] = xstrdup( arg );
if (exec_mode != MODE_NONE) usage(1);
exec_mode = mode;
}
/* parse options from the argv array and remove all the recognized ones */
static void parse_options( char *argv[] )
static char **parse_options( int argc, char **argv )
{
const struct option_descr *opt;
char **ptr, **last;
const char* arg=NULL;
const char *p;
int optc;
for (ptr = last = argv; *ptr; ptr++)
while ((optc = getopt_long( argc, argv, short_options, long_options, NULL )) != -1)
{
/* first check the exact option name */
for (opt = option_table; opt->name; opt++)
switch(optc)
{
if (!strcmp( *ptr, opt->name ) ||
/* for long option check without the first dash too */
(opt->name[1] == '-' && !strcmp( *ptr, opt->name+1 )))
case 'C':
current_src_dir = optarg;
break;
case 'D':
/* ignored */
break;
case 'F':
dll_file_name = xstrdup( optarg );
break;
case 'H':
if (!isdigit(optarg[0]))
fatal_error( "Expected number argument with -H option instead of '%s'\n", optarg );
DLLHeapSize = atoi(optarg);
if (DLLHeapSize > 65535)
fatal_error( "Invalid heap size %d, maximum is 65535\n", DLLHeapSize );
break;
case 'I':
/* ignored */
break;
case 'K':
/* ignored, because cc generates correct code. */
break;
case 'L':
lib_path = xrealloc( lib_path, (nb_lib_paths+1) * sizeof(*lib_path) );
lib_path[nb_lib_paths++] = xstrdup( optarg );
break;
case 'M':
owner_name = xstrdup( optarg );
SpecType = SPEC_WIN16;
break;
case 'N':
dll_name = xstrdup( optarg );
break;
case 'd':
add_import_dll( optarg, 1 );
break;
case 'e':
init_func = xstrdup( optarg );
break;
case 'f':
if (!strcmp( optarg, "PIC") || !strcmp( optarg, "pic")) UsePIC = 1;
/* ignore all other flags */
break;
case 'h':
usage(0);
break;
case 'i':
{
if (opt->has_arg) arg = *(++ptr);
else arg = NULL;
break;
}
}
/* now check for option name concatenated with argument */
if (!opt->name)
{
for (opt = option_table; opt->name; opt++)
{
if (opt->has_arg && !strncmp( *ptr, opt->name, strlen(opt->name) ))
char *str = xstrdup( optarg );
char *token = strtok( str, "," );
while (token)
{
arg = *ptr + strlen(opt->name);
break;
add_ignore_symbol( token );
token = strtok( NULL, "," );
}
free( str );
}
}
if (opt->name)
{
if (opt->has_arg && arg != NULL) opt->func( arg );
else opt->func( "" );
}
else /* keep this argument */
{
if (last != ptr) *last = *ptr;
last++;
break;
case 'k':
kill_at = 1;
break;
case 'l':
add_import_dll( optarg, 0 );
break;
case 'm':
if (!strcmp( optarg, "gui" )) SpecMode = SPEC_MODE_GUIEXE;
else if (!strcmp( optarg, "cui" )) SpecMode = SPEC_MODE_CUIEXE;
else if (!strcmp( optarg, "guiw" )) SpecMode = SPEC_MODE_GUIEXE_UNICODE;
else if (!strcmp( optarg, "cuiw" )) SpecMode = SPEC_MODE_CUIEXE_UNICODE;
else usage(1);
break;
case 'o':
if (unlink( optarg ) == -1 && errno != ENOENT)
fatal_error( "Unable to create output file '%s'\n", optarg );
if (!(output_file = fopen( optarg, "w" )))
fatal_error( "Unable to create output file '%s'\n", optarg );
output_file_name = xstrdup(optarg);
atexit( cleanup ); /* make sure we remove the output file on exit */
break;
case 'r':
res_files = xrealloc( res_files, (nb_res_files+1) * sizeof(*res_files) );
res_files[nb_res_files++] = xstrdup( optarg );
break;
case 'w':
display_warnings = 1;
break;
case LONG_OPT_SPEC:
set_exec_mode( MODE_SPEC );
input_file = open_input_file( NULL, optarg );
set_dll_file_name( optarg );
break;
case LONG_OPT_DEF:
set_exec_mode( MODE_DEF );
input_file = open_input_file( NULL, optarg );
set_dll_file_name( optarg );
break;
case LONG_OPT_EXE:
set_exec_mode( MODE_EXE );
if ((p = strrchr( optarg, '/' ))) p++;
else p = optarg;
dll_file_name = xmalloc( strlen(p) + 5 );
strcpy( dll_file_name, p );
if (!strchr( dll_file_name, '.' )) strcat( dll_file_name, ".exe" );
if (SpecMode == SPEC_MODE_DLL) SpecMode = SPEC_MODE_GUIEXE;
break;
case LONG_OPT_DEBUG:
set_exec_mode( MODE_DEBUG );
break;
case LONG_OPT_GLUE:
set_exec_mode( MODE_GLUE );
break;
case LONG_OPT_RELAY16:
set_exec_mode( MODE_RELAY16 );
break;
case LONG_OPT_RELAY32:
set_exec_mode( MODE_RELAY32 );
break;
case LONG_OPT_VERSION:
printf( "winebuild version " PACKAGE_VERSION "\n" );
exit(0);
case '?':
usage(1);
break;
}
}
*last = NULL;
return &argv[optind];
}
@ -462,22 +384,22 @@ static void load_resources( char *argv[] )
int main(int argc, char **argv)
{
output_file = stdout;
parse_options( argv + 1 );
argv = parse_options( argc, argv );
switch(exec_mode)
{
case MODE_SPEC:
load_resources( argv + 1 );
load_resources( argv );
if (!ParseTopLevel( input_file )) break;
switch (SpecType)
{
case SPEC_WIN16:
if (argv[1])
fatal_error( "file argument '%s' not allowed in this mode\n", argv[1] );
if (argv[0])
fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] );
BuildSpec16File( output_file );
break;
case SPEC_WIN32:
read_undef_symbols( argv + 1 );
read_undef_symbols( argv );
BuildSpec32File( output_file );
break;
default: assert(0);
@ -485,32 +407,32 @@ int main(int argc, char **argv)
break;
case MODE_EXE:
if (SpecType == SPEC_WIN16) fatal_error( "Cannot build 16-bit exe files\n" );
load_resources( argv + 1 );
read_undef_symbols( argv + 1 );
load_resources( argv );
read_undef_symbols( argv );
BuildSpec32File( output_file );
break;
case MODE_DEF:
if (argv[1]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[1] );
if (argv[0]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] );
if (SpecType == SPEC_WIN16) fatal_error( "Cannot yet build .def file for 16-bit dlls\n" );
if (!ParseTopLevel( input_file )) break;
BuildDef32File( output_file );
break;
case MODE_DEBUG:
BuildDebugFile( output_file, current_src_dir, argv + 1 );
BuildDebugFile( output_file, current_src_dir, argv );
break;
case MODE_GLUE:
BuildGlue( output_file, current_src_dir, argv + 1 );
BuildGlue( output_file, current_src_dir, argv );
break;
case MODE_RELAY16:
if (argv[1]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[1] );
if (argv[0]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] );
BuildRelays16( output_file );
break;
case MODE_RELAY32:
if (argv[1]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[1] );
if (argv[0]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] );
BuildRelays32( output_file );
break;
default:
do_usage();
usage(1);
break;
}
if (nb_errors) exit(1);

View File

@ -154,8 +154,8 @@ static int BuildModule16( FILE *outfile, int max_code_offset,
pModule->fileinfo = (int)pFileInfo - (int)pModule;
memset( pFileInfo, 0, sizeof(*pFileInfo) - sizeof(pFileInfo->szPathName) );
pFileInfo->cBytes = sizeof(*pFileInfo) - sizeof(pFileInfo->szPathName)
+ strlen(DLLFileName);
strcpy( pFileInfo->szPathName, DLLFileName );
+ strlen(dll_file_name);
strcpy( pFileInfo->szPathName, dll_file_name );
pstr = (char *)pFileInfo + pFileInfo->cBytes + 1;
/* Segment table */
@ -197,8 +197,8 @@ static int BuildModule16( FILE *outfile, int max_code_offset,
pstr = (char *)(((long)pstr + 3) & ~3);
pModule->name_table = (int)pstr - (int)pModule;
/* First entry is module name */
*pstr = strlen( DLLName );
strcpy( pstr + 1, DLLName );
*pstr = strlen( dll_name );
strcpy( pstr + 1, dll_name );
strupper( pstr + 1 );
pstr += *pstr + 1;
*pstr++ = 0;
@ -592,7 +592,7 @@ static void output_stub_funcs( FILE *outfile )
fprintf( outfile, " rec.flags = %d;\n", EH_NONCONTINUABLE );
fprintf( outfile, " rec.rec = 0;\n" );
fprintf( outfile, " rec.params = 2;\n" );
fprintf( outfile, " rec.info[0] = \"%s\";\n", DLLFileName );
fprintf( outfile, " rec.info[0] = \"%s\";\n", dll_file_name );
fprintf( outfile, " rec.info[1] = func;\n" );
fprintf( outfile, "#ifdef __GNUC__\n" );
fprintf( outfile, " rec.addr = __builtin_return_address(1);\n" );
@ -644,11 +644,11 @@ void BuildSpec16File( FILE *outfile )
memset( data, 0, 16 );
data_offset = 16;
if (!DLLName[0]) /* set default name from file name */
if (!dll_name) /* set default name from file name */
{
char *p;
strcpy( DLLName, DLLFileName );
if ((p = strrchr( DLLName, '.' ))) *p = 0;
dll_name = xstrdup( dll_file_name );
if ((p = strrchr( dll_name, '.' ))) *p = 0;
}
output_stub_funcs( outfile );
@ -691,7 +691,7 @@ void BuildSpec16File( FILE *outfile )
char profile[101];
strcpy( profile, get_function_name( typelist[i] ));
BuildCallFrom16Func( outfile, profile, DLLFileName );
BuildCallFrom16Func( outfile, profile, dll_file_name );
}
#endif
@ -788,7 +788,7 @@ void BuildSpec16File( FILE *outfile )
#ifdef __i386__
fprintf( outfile, " { 0x68, __wine_%s_CallFrom16_%s, 0x9a, __wine_call_from_16_%s,\n",
make_c_identifier(DLLFileName), profile,
make_c_identifier(dll_file_name), profile,
(typelist[i]->flags & (FLAG_REGISTER|FLAG_INTERRUPT)) ? "regs":
typelist[i]->type == TYPE_PASCAL_16? "word" : "long" );
if (argsize)
@ -831,7 +831,7 @@ void BuildSpec16File( FILE *outfile )
type = bsearch( &odp, typelist, nTypes, sizeof(ORDDEF *), Spec16TypeCompare );
assert( type );
fprintf( outfile, " /* %s.%d */ ", DLLName, i );
fprintf( outfile, " /* %s.%d */ ", dll_name, i );
#ifdef __i386__
fprintf( outfile, "{ 0x5566, 0x68, %s, 0xe866, %d /* %s */ },\n",
#else
@ -886,8 +886,8 @@ void BuildSpec16File( FILE *outfile )
/* Output the DLL constructor */
sprintf( constructor, "__wine_spec_%s_init", make_c_identifier(DLLFileName) );
sprintf( destructor, "__wine_spec_%s_fini", make_c_identifier(DLLFileName) );
sprintf( constructor, "__wine_spec_%s_init", make_c_identifier(dll_file_name) );
sprintf( destructor, "__wine_spec_%s_fini", make_c_identifier(dll_file_name) );
output_dll_init( outfile, constructor, destructor );
fprintf( outfile,

View File

@ -53,13 +53,13 @@ static const char *make_internal_name( const ORDDEF *odp, const char *prefix )
if (odp->name || odp->export_name)
{
char *p;
sprintf( buffer, "__wine_%s_%s_%s", prefix, DLLFileName,
sprintf( buffer, "__wine_%s_%s_%s", prefix, dll_file_name,
odp->name ? odp->name : odp->export_name );
/* make sure name is a legal C identifier */
for (p = buffer; *p; p++) if (!isalnum(*p) && *p != '_') break;
if (!*p) return buffer;
}
sprintf( buffer, "__wine_%s_%s_%d", prefix, make_c_identifier(DLLFileName), odp->ordinal );
sprintf( buffer, "__wine_%s_%s_%d", prefix, make_c_identifier(dll_file_name), odp->ordinal );
return buffer;
}
@ -495,7 +495,7 @@ void BuildSpec32File( FILE *outfile )
fprintf( outfile, "}\n" );
fprintf( outfile, "#endif\n" );
fprintf( outfile, "static const char dllname[] = \"%s\";\n\n", DLLFileName );
fprintf( outfile, "static const char dllname[] = \"%s\";\n\n", dll_file_name );
fprintf( outfile, "extern int __wine_spec_exports[];\n\n" );
#ifdef __i386__
@ -773,7 +773,7 @@ void BuildSpec32File( FILE *outfile )
/* Output the DLL constructor */
sprintf( constructor, "__wine_spec_%s_init", make_c_identifier(DLLFileName) );
sprintf( constructor, "__wine_spec_%s_init", make_c_identifier(dll_file_name) );
output_dll_init( outfile, constructor, NULL );
fprintf( outfile,
@ -783,7 +783,7 @@ void BuildSpec32File( FILE *outfile )
" extern void *__wine_dbg_register( char * const *, int );\n"
" __wine_dll_register( &nt_header, \"%s\" );\n"
"}\n",
constructor, DLLFileName );
constructor, dll_file_name );
}
@ -802,7 +802,7 @@ void BuildDef32File(FILE *outfile)
fprintf(outfile, "; File generated automatically from %s; do not edit!\n\n",
input_file_name );
fprintf(outfile, "LIBRARY %s\n\n", DLLFileName);
fprintf(outfile, "LIBRARY %s\n\n", dll_file_name);
fprintf(outfile, "EXPORTS\n");

View File

@ -1,5 +1,5 @@
.\" -*- nroff -*-
.TH WINEBUILD 1 "December 2002" "@PACKAGE_STRING@" "Wine dll builder"
.TH WINEBUILD 1 "March 2003" "@PACKAGE_STRING@" "Wine dll builder"
.SH NAME
winebuild \- Wine dll builder
.SH SYNOPSIS
@ -19,7 +19,7 @@ option can be specified, as described in the \fBOPTIONS\fR section.
You have to specify exactly one of the following options, depending on
what you want winebuild to generate.
.TP
.BI \--spec\ file.spec
.BI \--spec=\ file.spec
Build a C file from a spec file (see \fBSPEC FILE SYNTAX\fR for
details). The resulting C file must be compiled and linked to the
other object files to build a working Wine dll.
@ -32,7 +32,7 @@ final dll, to allow
to get the list of all undefined symbols that need to be imported from
other dlls.
.TP
.BI \--exe\ name
.BI \--exe=\ name
Build a C file for the named executable. This is basically the same as
the --spec mode except that it doesn't require a .spec file as input,
since an executable doesn't export functions. The resulting C file
@ -41,7 +41,7 @@ working Wine executable, and all the other object files must be listed
as
.I input files.
.TP
.BI \--def\ file.spec
.BI \--def=\ file.spec
Build a .def file from a spec file. This is used when building dlls
with a PE (Win32) compiler.
.TP
@ -69,7 +69,7 @@ Generate the assembly code for the 32-bit relay routines. This is for
Wine internal usage only, you should never need to use this option.
.SH OPTIONS
.TP
.BI \-C\ directory
.BI \-C,\ --source-dir= directory
Change to the specified directory before reading source files. Only
meaningful in
.BR \--debug\ and\ --glue\ modes.
@ -77,7 +77,7 @@ meaningful in
.BI \-D\ symbol
Ignored for compatibility with the C compiler.
.TP
.BI \-e\ function
.BI \-e,\ --entry= function
Specify the module entry point function; if not specified, the default
is
.B DllMain
@ -91,21 +91,18 @@ modules.
.BI \-f\ flags
Ignored for compatibility with the C compiler.
.TP
.BI \-F\ filename
.BI \-F,\ --filename= filename
Set the file name of the module. The default is to use the base name
of the spec file (without any extension).
.TP
.B \-h
.B \-h, --help
Display a usage message and exit.
.TP
.BI \-H\ size
.BI \-H,\ --heap= size
Specify the size of the module local heap in bytes (only valid for
Win16 modules); default is no local heap.
.TP
.BI \-I\ directory
Ignored for compatibility with the C compiler.
.TP
.BI \-i\ [-]symbol[,[-]symbol]
.BI \-i,\ --ignore= [-]symbol[,[-]symbol]
Specify a list of symbols that should be ignored when resolving
undefined symbols against the imported libraries. This forces these
symbols to be resolved from the Unix C library (or from another Unix
@ -113,33 +110,36 @@ library linked with the application). If a symbol is prefixed by '-'
it is removed from the list instead of being added; a stand-alone '-'
clears the whole list.
.TP
.BI \-K\ flags
.BI \-I\ directory
Ignored for compatibility with the C compiler.
.TP
.BI \-k
.B \-k, --kill-at
Remove the stdcall decorations from the symbol names in the
generated .def file. Only meaningful in \fB--def\fR mode.
.TP
.BI \-L\ directory
.BI \-K\ flags
Ignored for compatibility with the C compiler.
.TP
.BI \-L,\ --library-path= directory
Append the specified directory to the list of directories that are
searched for import libraries.
.TP
.BI \-l\ lib.dll
.BI \-l,\ --library= name
Import the specified library, looking for a corresponding
\fIlib.dll.so\fR file in the directories specified with the \fB-L\fR
\fIlibname.def\fR file in the directories specified with the \fB-L\fR
option.
.TP
.BI \-dl\ lib.dll
.BI \-d,\ --delay-lib= name
Same as the \fB-l\fR option, but import the specified library in
delayed mode (i.e. the library won't be loaded until a function
imported from it is actually called).
.TP
.BI \-M\ module
.BI \-M,\ --main-module= module
Specify that we are building a 16-bit dll, that will ultimately be
linked together with the 32-bit dll specified in \fImodule\fR. Only
meaningful in \fB--spec\fR mode.
.TP
.BI \-m\ mode
.BI \-m,\ --exe-mode= mode
Set the executable mode, which can be one of the following:
.br
.B cui
@ -161,16 +161,16 @@ passed to the entry point.
.br
This option is only meaningful in \fB--exe\fR mode.
.TP
.BI \-N\ dllname
.BI \-N,\ --dll-name= dllname
Set the internal name of the module. It is only used in Win16
modules. The default is to use the base name of the spec file (without
any extension). This is used for KERNEL, since it lives in
KRNL386.EXE. It shouldn't be needed otherwise.
.TP
.BI \-o\ file
.BI \-o,\ --output= file
Set the name of the output file (default is standard output).
.TP
.BI \-r\ rsrc.res
.BI \-r,\ --res= rsrc.res
Load resources from the specified binary resource file. The
\fIrsrc.res\fR can be produced from a source resource file with
.BR wrc(1)
@ -183,7 +183,10 @@ and will automatically be handled correctly (though the
.B \-r
option will also work for Win32 files).
.TP
.B \-w
.B \--version
Display the program version and exit.
.TP
.B \-w, --warnings
Turn on warnings.
.SH "SPEC FILE SYNTAX"
.SS "General syntax"