Module: wine Branch: master Commit: 9faa5eeddd24a057d9ff522259c9dbdc6203c098 URL: https://source.winehq.org/git/wine.git/?a=commit;h=9faa5eeddd24a057d9ff52225...
Author: Kevin Puetz PuetzKevinA@JohnDeere.com Date: Wed Nov 25 13:41:43 2020 -0600
winegcc: Implement -Wl,--out-implib.
This allows a CMake toolchain (or other caller) to treat winegcc like MinGW, specifying that it produce a separate file for imports, e.g.
set(CMAKE_IMPORT_LIBRARY_PREFIX lib) set(CMAKE_IMPORT_LIBRARY_SUFFIX .a) string(APPEND CMAKE_C_CREATE_SHARED_LIBRARY " -Wl,--out-implib,<TARGET_IMPLIB>")
Signed-off-by: Kevin Puetz PuetzKevinA@JohnDeere.com Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
tools/winegcc/winegcc.c | 39 ++++++++++++++++++++++++++++++++++++++- tools/winegcc/winegcc.man.in | 2 ++ 2 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index 9268a5dfd1d..e9707a73774 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -141,6 +141,7 @@ static const char* app_loader_template =
static const char *output_file_name; static const char *output_debug_file; +static const char *output_implib; static int keep_generated = 0; static strarray* tmp_files; #ifdef HAVE_SIGSET_T @@ -231,6 +232,7 @@ struct options const char* entry_point; const char* prelink; const char* debug_file; + const char* out_implib; strarray* prefix; strarray* lib_dirs; strarray* args; @@ -273,6 +275,7 @@ static void cleanup_output_files(void) { if (output_file_name) unlink( output_file_name ); if (output_debug_file) unlink( output_debug_file ); + if (output_implib) unlink( output_implib ); }
static void clean_temp_files(void) @@ -522,6 +525,9 @@ static strarray *get_link_args( struct options *opts, const char *output_name ) if (opts->debug_file && strendswith(opts->debug_file, ".pdb")) strarray_add(link_args, strmake("-Wl,-pdb,%s", opts->debug_file));
+ if (opts->out_implib) + strarray_add(link_args, strmake("-Wl,--out-implib,%s", opts->out_implib)); + if (!try_link( opts->prefix, link_args, "-Wl,--file-alignment,0x1000" )) strarray_add( link_args, strmake( "-Wl,--file-alignment,%s", opts->file_align ? opts->file_align : "0x1000" )); @@ -554,6 +560,10 @@ static strarray *get_link_args( struct options *opts, const char *output_name ) strarray_add(link_args, "-Wl,-debug"); strarray_add(link_args, strmake("-Wl,-pdb:%s", opts->debug_file)); } + + if (opts->out_implib) + strarray_add(link_args, strmake("-Wl,-implib:%s", opts->out_implib)); + else if (!opts->strip) strarray_add(link_args, "-Wl,-debug:dwarf"); strarray_add( link_args, strmake( "-Wl,-filealign:%s", opts->file_align ? opts->file_align : "0x1000" )); @@ -1085,7 +1095,7 @@ static void add_library( struct options *opts, strarray *lib_dirs, strarray *fil static void build(struct options* opts) { strarray *lib_dirs, *files; - strarray *spec_args, *link_args, *tool; + strarray *spec_args, *link_args, *implib_args, *tool; char *output_file, *output_path; const char *spec_o_name, *libgcc = NULL; const char *output_name, *spec_file, *lang; @@ -1430,6 +1440,7 @@ static void build(struct options* opts)
output_file_name = output_path; output_debug_file = opts->debug_file; + output_implib = opts->out_implib; atexit( cleanup_output_files );
spawn(opts->prefix, link_args, 0); @@ -1460,6 +1471,26 @@ static void build(struct options* opts) strarray_free(tool); }
+ if (opts->out_implib && !is_pe) + { + if (!spec_file) + error("--out-implib requires a .spec or .def file\n"); + + implib_args = get_winebuild_args( opts ); + if ((tool = build_tool_name( opts, TOOL_CC ))) strarray_add( implib_args, strmake( "--cc-cmd=%s", strarray_tostring( tool, " " ))); + if ((tool = build_tool_name( opts, TOOL_LD ))) strarray_add( implib_args, strmake( "--ld-cmd=%s", strarray_tostring( tool, " " ))); + + strarray_add(implib_args, "--implib"); + strarray_add(implib_args, "-o"); + strarray_add(implib_args, opts->out_implib); + strarray_add(implib_args, "--export"); + strarray_add(implib_args, spec_file); + strarray_addall(implib_args, opts->winebuild_args); + + spawn(opts->prefix, implib_args, 0); + strarray_free (implib_args); + } + /* set the base address with prelink if linker support is not present */ if (opts->prelink && !opts->target) { @@ -1972,6 +2003,11 @@ int main(int argc, char **argv) strarray_add( opts.files, strmake( "-Wl,%s", Wl->base[j] )); continue; } + if (!strcmp(Wl->base[j], "--out-implib")) + { + opts.out_implib = strdup( Wl->base[++j] ); + continue; + } if (!strcmp(Wl->base[j], "-static")) linking = -1; strarray_add(opts.linker_args, strmake("-Wl,%s",Wl->base[j])); } @@ -2056,5 +2092,6 @@ int main(int argc, char **argv)
output_file_name = NULL; output_debug_file = NULL; + output_implib = NULL; return 0; } diff --git a/tools/winegcc/winegcc.man.in b/tools/winegcc/winegcc.man.in index 8a14dd59fd1..831a98323cf 100644 --- a/tools/winegcc/winegcc.man.in +++ b/tools/winegcc/winegcc.man.in @@ -72,6 +72,8 @@ Do not add the winecrt0 library when linking. .IP \fB-Wb,\fIoption\fR Pass an option to winebuild. If \fIoption\fR contains commas, it is split into multiple options at the commas. +.IP \fB-Wl,--out-implib,\fIlib.a\fR +When linking a dll, also create its corresponding import library. .SH ENVIRONMENT .TP .B WINEBUILD