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).