Alexandre Julliard : winebuild: Add support for building Windows import libraries.
Alexandre Julliard
julliard at winehq.org
Wed Dec 30 10:18:12 CST 2009
Module: wine
Branch: master
Commit: 2fda3d6a179c0f2c74cc5d7530eccba260f87697
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2fda3d6a179c0f2c74cc5d7530eccba260f87697
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Dec 30 11:51:19 2009 +0100
winebuild: Add support for building Windows import libraries.
---
tools/winebuild/build.h | 1 +
tools/winebuild/import.c | 49 ++++++++++++++++++++++++++++++++++++++
tools/winebuild/main.c | 12 +++++++++
tools/winebuild/winebuild.man.in | 4 +++
4 files changed, 66 insertions(+), 0 deletions(-)
diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h
index 7dca2d8..0543eb1 100644
--- a/tools/winebuild/build.h
+++ b/tools/winebuild/build.h
@@ -251,6 +251,7 @@ extern void output_get_pc_thunk(void);
extern void output_module( DLLSPEC *spec );
extern void output_stubs( DLLSPEC *spec );
extern void output_imports( DLLSPEC *spec );
+extern void output_import_lib( DLLSPEC *spec, char **argv );
extern void output_exports( DLLSPEC *spec );
extern int load_res32_file( const char *name, DLLSPEC *spec );
extern void output_resources( DLLSPEC *spec );
diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c
index 0caaffd..648d29f 100644
--- a/tools/winebuild/import.c
+++ b/tools/winebuild/import.c
@@ -1304,3 +1304,52 @@ void output_imports( DLLSPEC *spec )
if (nb_imports || ext_link_imports.count || has_stubs(spec) || has_relays(spec))
output_get_pc_thunk();
}
+
+/* output an import library for a Win32 module and additional object files */
+void output_import_lib( DLLSPEC *spec, char **argv )
+{
+ char *dlltool, *def_file;
+ char *cmd;
+ int err;
+
+ if (target_platform != PLATFORM_WINDOWS)
+ fatal_error( "Unix-style import libraries not supported yet\n" );
+
+ def_file = get_temp_file_name( output_file_name, ".def" );
+ fclose( output_file );
+ if (!(output_file = fopen( def_file, "w" )))
+ fatal_error( "Unable to create output file '%s'\n", def_file );
+ BuildDef32File( spec );
+ fclose( output_file );
+ output_file = NULL;
+
+ dlltool = find_tool( "dlltool", NULL );
+ cmd = xmalloc( strlen(dlltool) + strlen(output_file_name) + strlen(def_file) + 12 );
+ sprintf( cmd, "%s -k -l %s -d %s", dlltool, output_file_name, def_file );
+ if (verbose) fprintf( stderr, "%s\n", cmd );
+ err = system( cmd );
+ if (err) fatal_error( "%s failed with status %d\n", dlltool, err );
+ free( cmd );
+ free( dlltool );
+
+ if (argv[0])
+ {
+ char *ar = find_tool( "ar", NULL );
+ int i, len;
+
+ for (i = len = 0; argv[i]; i++) len += strlen(argv[i]) + 1;
+ cmd = xmalloc( strlen(ar) + strlen(output_file_name) + len + 5 );
+ sprintf( cmd, "%s rs %s", ar, output_file_name );
+ for (i = 0; argv[i]; i++)
+ {
+ strcat( cmd, " " );
+ strcat( cmd, argv[i] );
+ }
+ if (verbose) fprintf( stderr, "%s\n", cmd );
+ err = system( cmd );
+ if (err) fatal_error( "%s failed with status %d\n", dlltool, err );
+ free( cmd );
+ free( ar );
+ }
+ output_file_name = NULL;
+}
diff --git a/tools/winebuild/main.c b/tools/winebuild/main.c
index e81f88f..138ec68 100644
--- a/tools/winebuild/main.c
+++ b/tools/winebuild/main.c
@@ -100,6 +100,7 @@ enum exec_mode_values
MODE_DLL,
MODE_EXE,
MODE_DEF,
+ MODE_IMPLIB,
MODE_RELAY16,
MODE_RELAY32,
MODE_RESOURCES
@@ -268,6 +269,7 @@ static const char usage_str[] =
" --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"
+" --implib Build an import library\n"
" --relay16 Build the 16-bit relay assembly routines\n"
" --relay32 Build the 32-bit relay assembly routines\n"
" --resources Build a .o file for the resource files\n\n"
@@ -278,6 +280,7 @@ enum long_options_values
LONG_OPT_DLL = 1,
LONG_OPT_DEF,
LONG_OPT_EXE,
+ LONG_OPT_IMPLIB,
LONG_OPT_ASCMD,
LONG_OPT_EXTERNAL_SYMS,
LONG_OPT_FAKE_MODULE,
@@ -300,6 +303,7 @@ static const struct option long_options[] =
{ "dll", 0, 0, LONG_OPT_DLL },
{ "def", 0, 0, LONG_OPT_DEF },
{ "exe", 0, 0, LONG_OPT_EXE },
+ { "implib", 0, 0, LONG_OPT_IMPLIB },
{ "as-cmd", 1, 0, LONG_OPT_ASCMD },
{ "external-symbols", 0, 0, LONG_OPT_EXTERNAL_SYMS },
{ "fake-module", 0, 0, LONG_OPT_FAKE_MODULE },
@@ -475,6 +479,9 @@ static char **parse_options( int argc, char **argv, DLLSPEC *spec )
set_exec_mode( MODE_EXE );
if (!spec->subsystem) spec->subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI;
break;
+ case LONG_OPT_IMPLIB:
+ set_exec_mode( MODE_IMPLIB );
+ break;
case LONG_OPT_ASCMD:
as_command = xstrdup( optarg );
break;
@@ -662,6 +669,11 @@ int main(int argc, char **argv)
if (!parse_input_file( spec )) break;
BuildDef32File( spec );
break;
+ case MODE_IMPLIB:
+ if (!spec_file_name) fatal_error( "missing .spec file\n" );
+ if (!parse_input_file( spec )) break;
+ output_import_lib( spec, argv );
+ break;
case MODE_RELAY16:
if (argv[0]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] );
BuildRelays16();
diff --git a/tools/winebuild/winebuild.man.in b/tools/winebuild/winebuild.man.in
index d41fae7..e0dd72b 100644
--- a/tools/winebuild/winebuild.man.in
+++ b/tools/winebuild/winebuild.man.in
@@ -46,6 +46,10 @@ executable, and all the other object files must be listed as
Build a .def file from a spec file. The .spec file is specified via the
-E option. This is used when building dlls with a PE (Win32) compiler.
.TP
+.BI \--implib
+Build a PE import library from a spec file. The .spec file is
+specified via the -E option.
+.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.
More information about the wine-cvs
mailing list