Sync to Wine-20050310:
Dimitrie O. Paun <dpaun@rogers.com>
- Add support for .exe's with exported functions.
Modified: trunk/reactos/tools/helper.mk
Modified: trunk/reactos/tools/winebuild/main.c
Deleted: trunk/reactos/tools/winebuild/winebuild.man.in

Modified: trunk/reactos/tools/helper.mk
--- trunk/reactos/tools/helper.mk	2005-03-14 10:12:00 UTC (rev 14051)
+++ trunk/reactos/tools/helper.mk	2005-03-14 10:32:28 UTC (rev 14052)
@@ -1134,7 +1134,7 @@
 endif
 %.spec.def: %.spec
 	$(HALFVERBOSEECHO) [DEF]     $<
-	$(WINEBUILD) $(DEFS) -o $@ --def $<
+	$(WINEBUILD) $(DEFS) -o $@ --def -E $<
 %.drv.spec.def: %.spec
 	$(HALFVERBOSEECHO) [DEF]     $<
 	$(WINEBUILD) $(DEFS) -o $@ --def $<

Modified: trunk/reactos/tools/winebuild/main.c
--- trunk/reactos/tools/winebuild/main.c	2005-03-14 10:12:00 UTC (rev 14051)
+++ trunk/reactos/tools/winebuild/main.c	2005-03-14 10:32:28 UTC (rev 14052)
@@ -97,7 +97,6 @@
     {
         if (!strcmp( p, ".spec" ) || !strcmp( p, ".def" )) *p = 0;
     }
-    if (!strchr( spec->file_name, '.' )) strcat( spec->file_name, ".dll" );
 }
 
 /* set the dll subsystem */
@@ -143,6 +142,7 @@
 "    -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 --export=FILE        Export the symbols defined in the .spec or .def file\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"
@@ -164,9 +164,9 @@
 "       --version            Print the version and exit\n"
 "    -w --warnings           Turn on warnings\n"
 "\nMode options:\n"
-"       --dll=FILE           Build a .c file from a .spec or .def 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"
+"       --dll                Build a .c file from a .spec or .def file\n"
+"       --def                Build a .def file from a .spec file\n"
+"       --exe                Build a .c file for an executable\n"
 "       --debug [FILES]      Build a .c file with the debug channels declarations\n"
 "       --relay16            Build the 16-bit relay assembly routines\n"
 "       --relay32            Build the 32-bit relay assembly routines\n"
@@ -188,13 +188,13 @@
     LONG_OPT_PEDLL
 };
 
-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 char short_options[] = "C:D:E:F:H:I:K:L:M:N:d:e:f:hi:kl:m:o:r:w";
 
 static const struct option long_options[] =
 {
-    { "dll",      1, 0, LONG_OPT_DLL },
-    { "def",      1, 0, LONG_OPT_DEF },
-    { "exe",      1, 0, LONG_OPT_EXE },
+    { "dll",      0, 0, LONG_OPT_DLL },
+    { "def",      0, 0, LONG_OPT_DEF },
+    { "exe",      0, 0, LONG_OPT_EXE },
     { "debug",    0, 0, LONG_OPT_DEBUG },
     { "ld-cmd",   1, 0, LONG_OPT_LDCMD },
     { "nm-cmd",   1, 0, LONG_OPT_NMCMD },
@@ -206,6 +206,7 @@
     /* aliases for short options */
     { "source-dir",    1, 0, 'C' },
     { "delay-lib",     1, 0, 'd' },
+    { "export",        1, 0, 'E' },
     { "entry",         1, 0, 'e' },
     { "filename",      1, 0, 'F' },
     { "help",          0, 0, 'h' },
@@ -250,6 +251,10 @@
         case 'D':
             /* ignored */
             break;
+        case 'E':
+            spec_file_name = xstrdup( optarg );
+            set_dll_file_name( optarg, spec );
+            break;
         case 'F':
             spec->file_name = xstrdup( optarg );
             break;
@@ -326,21 +331,12 @@
             break;
         case LONG_OPT_DLL:
             set_exec_mode( MODE_DLL );
-            spec_file_name = xstrdup( optarg );
-            set_dll_file_name( optarg, spec );
             break;
         case LONG_OPT_DEF:
             set_exec_mode( MODE_DEF );
-            spec_file_name = xstrdup( optarg );
-            set_dll_file_name( optarg, spec );
             break;
         case LONG_OPT_EXE:
             set_exec_mode( MODE_EXE );
-            if ((p = strrchr( optarg, '/' ))) p++;
-            else p = optarg;
-            spec->file_name = xmalloc( strlen(p) + 5 );
-            strcpy( spec->file_name, p );
-            if (!strchr( spec->file_name, '.' )) strcat( spec->file_name, ".exe" );
             if (!spec->subsystem) spec->subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI;
             break;
         case LONG_OPT_DEBUG:
@@ -374,6 +370,10 @@
             break;
         }
     }
+
+    if (spec->file_name && !strchr( spec->file_name, '.' ))
+        strcat( spec->file_name, exec_mode == MODE_EXE ? ".exe" : ".dll" );
+
     return &argv[optind];
 }
 
@@ -412,12 +412,14 @@
 {
     FILE *input_file = open_input_file( NULL, spec_file_name );
     char *extension = strrchr( spec_file_name, '.' );
+    int result;
 
     if (extension && !strcmp( extension, ".def" ))
-        return parse_def_file( input_file, spec );
+        result = parse_def_file( input_file, spec );
     else
-        return parse_spec_file( input_file, spec );
+        result = parse_spec_file( input_file, spec );
     close_input_file( input_file );
+    return result;
 }
 
 
@@ -442,6 +444,7 @@
     case MODE_DLL:
         spec->characteristics |= IMAGE_FILE_DLL;
         load_resources( argv, spec );
+        if (!spec_file_name) fatal_error( "missing .spec file\n" );
         if (!parse_input_file( spec )) break;
         switch (spec->type)
         {
@@ -457,13 +460,16 @@
         break;
     case MODE_EXE:
         if (spec->type == SPEC_WIN16) fatal_error( "Cannot build 16-bit exe files\n" );
+	if (!spec->file_name) fatal_error( "executable must be named via the -F option\n" );
         load_resources( argv, spec );
+        if (spec_file_name && !parse_input_file( spec )) break;
         read_undef_symbols( argv );
         BuildSpec32File( output_file, spec );
         break;
     case MODE_DEF:
         if (argv[0]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] );
         if (spec->type == SPEC_WIN16) fatal_error( "Cannot yet build .def file for 16-bit dlls\n" );
+        if (!spec_file_name) fatal_error( "missing .spec file\n" );
         if (!parse_input_file( spec )) break;
         BuildDef32File( output_file, spec );
         break;

Deleted: trunk/reactos/tools/winebuild/winebuild.man.in
--- trunk/reactos/tools/winebuild/winebuild.man.in	2005-03-14 10:12:00 UTC (rev 14051)
+++ trunk/reactos/tools/winebuild/winebuild.man.in	2005-03-14 10:32:28 UTC (rev 14052)
@@ -1,434 +0,0 @@
-.\" -*- nroff -*-
-.TH WINEBUILD 1 "March 2003" "@PACKAGE_STRING@" "Wine dll builder"
-.SH NAME
-winebuild \- Wine dll builder
-.SH SYNOPSIS
-.BI winebuild\  [options]\ [input\ files]
-.SH DESCRIPTION
-.B winebuild
-generates the C and assembly files that are necessary to build a Wine
-dll, which is basically a Win32 dll encapsulated inside a Unix
-library.
-.PP
-.B winebuild
-has different modes, depending on what kind of file it is asked to
-generate. The mode is specified by one of the mode options specified
-below. In addition to the mode option, various other command-line
-option can be specified, as described in the \fBOPTIONS\fR section.
-.SH "MODE OPTIONS"
-You have to specify exactly one of the following options, depending on
-what you want winebuild to generate.
-.TP
-.BI \--dll= filename
-Build a C file from a .spec file (see \fBSPEC FILE SYNTAX\fR for
-details), or from a standard Windows .def file. The resulting C file
-must be compiled and linked to the other object files to build a
-working Wine dll.
-.br
-In that mode, the
-.I input files
-should be the list of all object files that will be linked into the
-final dll, to allow
-.B winebuild
-to get the list of all undefined symbols that need to be imported from
-other dlls.
-.TP
-.BI \--exe= name
-Build a C file for the named executable. This is basically the same as
-the --dll mode except that it doesn't require a .spec file as input,
-since an executable doesn't export functions. The resulting C file
-must be compiled and linked to the other object files to build a
-working Wine executable, and all the other object files must be listed
-as
-.I input files.
-.TP
-.BI \--def= file.spec
-Build a .def file from a spec file. This is used when building dlls
-with a PE (Win32) compiler.
-.TP
-.B \--debug
-Build a C file containing the definitions for debugging channels. In
-that mode the
-.I input files
-should be a list of C files to search for debug channel
-definitions. The resulting C file must be compiled and linked with the
-dll.
-.TP
-.B \--relay16
-Generate the assembly code for the 16-bit relay routines. This is for
-Wine internal usage only, you should never need to use this option.
-.TP
-.B \--relay32
-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,\ --source-dir= directory
-Change to the specified directory before reading source files. Only
-meaningful in
-.BR \--debug\  mode.
-.TP
-.BI \-D\  symbol
-Ignored for compatibility with the C compiler.
-.TP
-.BI \-e,\ --entry= function
-Specify the module entry point function; if not specified, the default
-is
-.B DllMain
-for dlls, and
-.B WinMain
-for executables (if
-.B WinMain
-is not defined, the standard C
-.B main
-is used instead). This is only valid for Win32 modules.
-.TP
-.BI \-f\  flags
-Ignored for compatibility with the C compiler.
-.TP
-.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, --help
-Display a usage message and exit.
-.TP
-.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,\ --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
-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 \-I\  directory
-Ignored for compatibility with the C compiler.
-.TP
-.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 \-K\  flags
-Ignored for compatibility with the C compiler.
-.TP
-.BI \--ld-cmd= ld-command
-Specify the command to use to link the object files; the default is
-\fBld\fR.
-.TP
-.BI \--nm-cmd= nm-command
-Specify the command to use to get the list of undefined symbols; the
-default is \fBnm\fR.
-.TP
-.BI \-L,\ --library-path= directory
-Append the specified directory to the list of directories that are
-searched for import libraries.
-.TP
-.BI \-l,\ --library= name
-Import the specified library, looking for a corresponding
-\fIlibname.def\fR file in the directories specified with the \fB-L\fR
-option.
-.TP
-.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,\ --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--dll\fR mode.
-.TP
-.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,\ --output= file
-Set the name of the output file (default is standard output).
-.TP
-.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)
-(or with a Windows resource compiler).
-.br
-This option is only necessary for Win16 resource files, the Win32 ones
-can simply listed as
-.I input files
-and will automatically be handled correctly (though the
-.B \-r
-option will also work for Win32 files).
-.TP
-.BI --subsystem= subsystem[:major[.minor]]
-Set the subsystem of the executable, which can be one of the following:
-.br
-.B console
-for a command line executable,
-.br
-.B windows
-for a graphical executable,
-.br
-.B native
-for a native-mode dll.
-.br
-The entry point of a command line executable is a normal C \fBmain\fR
-function. A \fBwmain\fR function can be used instead if you need the
-argument array to use Unicode strings. A graphical executable has a
-\fBWinMain\fR entry point.
-.br
-Optionally a major and minor subsystem version can also be specified;
-the default subsystem version is 4.0.
-.TP
-.B \--version
-Display the program version and exit.
-.TP
-.B \-w, --warnings
-Turn on warnings.
-.SH "SPEC FILE SYNTAX"
-.SS "General syntax"
-A spec file should contain a list of ordinal declarations. The general
-syntax is the following:
-.PP
-.I ordinal functype
-.RI [ flags ]\  exportname \ \fB(\fR\ [ args... ] \ \fB) \ [ handler ]
-.br
-.IB ordinal\  variable
-.RI [ flags ]\  exportname \ \fB(\fR\ [ data... ] \ \fB)
-.br
-.IB ordinal\  extern
-.RI [ flags ]\  exportname \ [ symbolname ]
-.br
-.IB ordinal\  stub
-.RI [ flags ]\  exportname
-.br
-.IB ordinal\  equate
-.RI [ flags ]\  exportname\ data
-.br
-.BI #\  comments
-.PP
-Declarations must fit on a single line, except if the end of line is
-escaped using a backslash character. The
-.B #
-character anywhere in a line causes the rest of the line to be ignored
-as a comment.
-.PP
-.I ordinal
-specifies the ordinal number corresponding to the entry point, or '@'
-for automatic ordinal allocation (Win32 only).
-.PP
-.I flags
-is a series of optional flags, preceded by a '-' character. The
-supported flags are:
-.RS
-.TP
-.B -norelay
-The entry point is not displayed in relay debugging traces (Win32
-only).
-.TP
-.B -noname
-The entry point will be imported by ordinal instead of by name.
-.TP
-.B -ret16
-The function returns a 16-bit value (Win16 only).
-.TP
-.B -ret64
-The function returns a 64-bit value (Win32 only).
-.TP
-.B -i386
-The entry point is only available on i386 platforms.
-.TP
-.B -register
-The function uses CPU register to pass arguments.
-.TP
-.B -private
-The function cannot be imported from other dlls, it can only be
-accessed through GetProcAddress.
-.SS "Function ordinals"
-Syntax:
-.br
-.I ordinal functype
-.RI [ flags ]\  exportname \ \fB(\fR\ [ args... ] \ \fB) \ [ handler ]
-.br
-
-This declaration defines a function entry point.  The prototype defined by
-.IR exportname \ \fB(\fR\ [ args... ] \ \fB)
-specifies the name available for dynamic linking and the format of the
-arguments. '@' can be used instead of
-.I exportname
-for ordinal-only exports.
-.PP
-.I functype
-should be one of:
-.RS
-.TP
-.B stdcall
-for a normal Win32 function
-.TP
-.B pascal
-for a normal Win16 function
-.TP
-.B cdecl
-for a Win16 or Win32 function using the C calling convention
-.TP
-.B varargs
-for a Win16 or Win32 function using the C calling convention with a
-variable number of arguments
-.RE
-.PP
-.I args
-should be one or several of:
-.RS
-.TP
-.B word
-(16-bit unsigned value)
-.TP
-.B s_word
-(16-bit signed word)
-.TP
-.B long
-(32-bit value)
-.TP
-.B double
-(64-bit value)
-.TP
-.B ptr
-(linear pointer)
-.TP
-.B str
-(linear pointer to a null-terminated ASCII string)
-.TP
-.B wstr
-(linear pointer to a null-terminated Unicode string)
-.TP
-.B segptr
-(segmented pointer)
-.TP
-.B segstr
-(segmented pointer to a null-terminated ASCII string).
-.HP
-.RB Only\  ptr ,\  str ,\  wstr ,\  long\  and\  double
-are valid for Win32 functions.
-.RE
-.PP
-.I handler
-is the name of the actual C function that will implement that entry
-point in 32-bit mode. The handler can also be specified as
-.IB dllname . function
-to define a forwarded function (one whose implementation is in another
-dll). If
-.I handler
-is not specified, it is assumed to be identical to
-.I exportname.
-.PP
-This first example defines an entry point for the 32-bit GetFocus()
-call:
-.IP
-@ stdcall GetFocus() GetFocus
-.PP
-This second example defines an entry point for the 16-bit
-CreateWindow() call (the ordinal 100 is just an example); it also
-shows how long lines can be split using a backslash:
-.IP
-100 pascal CreateWindow(ptr ptr long s_word s_word s_word \\
-    s_word word word word ptr) WIN_CreateWindow
-.PP
-To declare a function using a variable number of arguments, specify
-the function as
-.B varargs
-and declare it in the C file with a '...' parameter for a Win32
-function, or with an extra VA_LIST16 argument for a Win16 function.
-See the wsprintf* functions in user.exe.spec and user32.spec for an
-example.
-.SS "Variable ordinals"
-Syntax:
-.br
-.IB ordinal\  variable
-.RI [ flags ]\  exportname \ \fB(\fR\ [ data... ] \ \fB)
-.PP
-This declaration defines data storage as 32-bit words at the ordinal
-specified.
-.I exportname
-will be the name available for dynamic
-linking.
-.I data
-can be a decimal number or a hex number preceeded by "0x".  The
-following example defines the variable VariableA at ordinal 2 and
-containing 4 ints:
-.IP
-2 variable VariableA(-1 0xff 0 0)
-.PP
-This declaration only works in Win16 spec files. In Win32 you should
-use
-.B extern
-instead (see below).
-.SS "Extern ordinals"
-Syntax:
-.br
-.IB ordinal\  extern
-.RI [ flags ]\  exportname \ [ symbolname ]
-.PP
-This declaration defines an entry that simply maps to a C symbol
-(variable or function). It only works in Win32 spec files.
-.I exportname
-will point to the symbol
-.I symbolname
-that must be defined in the C code. Alternatively, it can be of the
-form
-.IB dllname . symbolname
-to define a forwarded symbol (one whose implementation is in another
-dll). If
-.I symbolname
-is not specified, it is assumed to be identical to
-.I exportname.
-.SS "Stub ordinals"
-Syntax:
-.br
-.IB ordinal\  stub
-.RI [ flags ]\  exportname
-.PP
-This declaration defines a stub function. It makes the name and
-ordinal available for dynamic linking, but will terminate execution
-with an error message if the function is ever called.
-.SS "Equate ordinals"
-Syntax:
-.br
-.IB ordinal\  equate
-.RI [ flags ]\  exportname\ data
-.PP
-This declaration defines an ordinal as an absolute value.
-.I exportname
-will be the name available for dynamic linking.
-.I data
-can be a decimal number or a hex number preceeded by "0x".
-.SH AUTHORS
-.B winebuild
-has been worked on by many people over the years. The main authors are
-Robert J. Amstadt, Alexandre Julliard, Martin von Loewis, Ulrich
-Weigand and Eric Youngdale. Many other Wine developers have
-contributed, please check the file Changelog in the Wine distribution
-for the complete details.
-.SH BUGS
-It is not yet possible to use a PE-format dll in an import
-specification; only Wine dlls can be imported.
-.PP
-If you find a bug, please submit a bug report at
-.UR http://bugs.winehq.org
-.B http://bugs.winehq.org.
-.UE
-.SH AVAILABILITY
-.B winebuild
-is part of the wine distribution, which is available through WineHQ,
-the
-.B wine
-development headquarters, at
-.UR http://www.winehq.org/
-.B http://www.winehq.org/.
-.UE
-.SH "SEE ALSO"
-.BR wine (1),
-.BR wrc (1).