From 5fee3fe2760d65a141873601c4b7b9fd2fc5c7b1 Mon Sep 17 00:00:00 2001 From: Tanzinul Islam Date: Sun, 6 Dec 2020 23:04:45 +0000 Subject: Support DLL builds + Fix C RTL variants We need to generate a import library without the version in the filename. MSVC's `link.exe` accommodates this with the [`/implib:` option][1], while C++Builder needs a separate run of [`implib.exe`][2]. Also fix the variants of the [C runtime library and startup objects][3]. [1]: https://docs.microsoft.com/en-us/cpp/build/reference/implib-name-import-library?view=msvc-160 [2]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/IMPLIB.EXE,_the_Import_Library_Tool_for_Win32 [3]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/Static_Runtime_Libraries Reviewed-by: Richard Levitte Reviewed-by: Dmitry Belyavskiy (Merged from https://github.com/openssl/openssl/pull/13540) --- Configurations/10-main.conf | 2 ++ Configurations/50-cppbuilder.conf | 30 +++++++++++++++++++++--------- Configurations/windows-makefile.tmpl | 19 +++++++++++-------- 3 files changed, 34 insertions(+), 17 deletions(-) (limited to 'Configurations') diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf index 518e8c77f4..3d6fbba5e4 100644 --- a/Configurations/10-main.conf +++ b/Configurations/10-main.conf @@ -1300,6 +1300,8 @@ my %targets = ( shared_defflag => '', shared_ldflag => "/dll", shared_target => "win-shared", # meaningless except it gives Configure a hint + lddefflag => "/def:", + ld_implib_flag => "/implib:", thread_scheme => "winthreads", dso_scheme => "win32", perl_platform => 'Windows::MSVC', diff --git a/Configurations/50-cppbuilder.conf b/Configurations/50-cppbuilder.conf index 334672e1a3..cb293afcb9 100644 --- a/Configurations/50-cppbuilder.conf +++ b/Configurations/50-cppbuilder.conf @@ -3,34 +3,46 @@ my %targets = ( inherit_from => [ "BASE_Windows" ], sys_id => "WIN32", bn_ops => "BN_LLONG", - dso_scheme => "win32", thread_scheme => "winthreads", cc => "bcc32c", defines => add("WIN32_LEAN_AND_MEAN", "OPENSSL_SYS_WIN32", "L_ENDIAN", "DSO_WIN32", "_stricmp=stricmp", "_strnicmp=strnicmp", "_malloca=malloc", "_freea=free", "_setmode=setmode"), - cflags => picker(default => "-q -c -tWC -tWM", + cflags => picker(default => add("-q -c", + threads("-tM"), + shared("-tR")), debug => "-Od -v -vi- -D_DEBUG", release => "-O2"), + bin_cflags => "-tWC", + lib_cflags => shared("-tWD -D_WINDLL -D_DLL"), coutflag => "-o", LD => "ilink32", - bin_lflags => combine(picker(default => "-ap -Tpe -x -Gn -q", - debug => '-j"$(BDS)\lib\win32c\debug" ' . - '-L"$(BDS)\lib\win32c\debug"', - release => '-j"$(BDS)\lib\win32c\release" ' . - '-L"$(BDS)\lib\win32c\release"'), - "wildargs.obj"), + LDFLAGS => picker(default => "-ap -x -Gn -q", + debug => '-j"$(BDS)\lib\win32c\debug" ' . + '-L"$(BDS)\lib\win32c\debug" -v', + release => '-j"$(BDS)\lib\win32c\release" ' . + '-L"$(BDS)\lib\win32c\release"'), + bin_lflags => "-Tpe c0x32.obj wildargs.obj", ldoutflag => ",", ldpostoutflag => ",,", ld_resp_delim => " +\n", ex_libs => add(sub { - my @ex_libs = ("cw32mt.lib", "import32.lib"); + my @ex_libs = ("import32.lib", + ($disabled{shared} + ? ($disabled{threads} ? "cw32.lib" : "cw32mt.lib") + : ($disabled{threads} ? "cw32i.lib" : "cw32mti.lib"))); push @ex_libs, ("crypt32.lib", "ws2_32.lib") unless $disabled{sock}; return join(" ", @ex_libs); }), AR => "tlib", ARFLAGS => "/P256 /N /u", ar_resp_delim => " &\n", + shared_target => "win-shared", + shared_ldflag => "-Tpd c0d32.obj", + dso_lflags => "-Tpd c0d32.obj", + lddefflag => ",", + ld_implib_rule => 'implib $< $**', + dso_scheme => "win32", } ); diff --git a/Configurations/windows-makefile.tmpl b/Configurations/windows-makefile.tmpl index bf214b0ee2..1e3d63f8d1 100644 --- a/Configurations/windows-makefile.tmpl +++ b/Configurations/windows-makefile.tmpl @@ -860,18 +860,22 @@ EOF my $deps = join(" ", @objs, @defs, @deps); my $import = platform->sharedlib_import($lib); my $dll = platform->sharedlib($lib); - my $shared_def = join("", map { " /def:$_" } @defs); + my $shared_def = join("", map { " $target{lddefflag}$_" } @defs); + my $implib_rule = $target{ld_implib_rule} || ""; + my $implib_flag = $target{ld_implib_flag} + ? "$target{ld_implib_flag}$import" + : ""; return <<"EOF" # The import library may look like a static library, but it is not. # We MUST make the import library depend on the DLL, in case someone # mistakenly removes the latter. $import: $dll + $implib_rule $dll: $deps IF EXIST $full.manifest DEL /F /Q $full.manifest IF EXIST \$@ DEL /F /Q \$@ - \$(LD) \$(LDFLAGS) \$(LIB_LDFLAGS) \\ - /implib:$import \$(LDOUTFLAG)$dll$shared_def @<< || (DEL /Q \$(\@B).* $import; EXIT 1) -$objs$target{ld_resp_delim}$linklibs\$(LIB_EX_LIBS) + \$(LD) \$(LDFLAGS) \$(LIB_LDFLAGS) @<< $implib_flag || (DEL /Q \$(\@B).* $import; EXIT 1) +$objs$target{ld_resp_delim}\$(LDOUTFLAG)$dll$target{ldpostoutflag}$target{ld_resp_delim}$linklibs\$(LIB_EX_LIBS)$shared_def << IF EXIST $dll.manifest \\ \$(MT) \$(MTFLAGS) \$(MTINFLAG)$dll.manifest \$(MTOUTFLAG)$dll @@ -897,13 +901,12 @@ EOF my $objs = join($target{ld_resp_delim}, @objs); my $linklibs = join("", map { "$_$target{ld_resp_delim}" } @deps); my $deps = join(" ", @objs, @defs, @deps); - my $shared_def = join("", map { " /def:$_" } @defs); + my $shared_def = join("", map { " $target{lddefflag}$_" } @defs); return <<"EOF"; $dso: $deps IF EXIST $dso.manifest DEL /F /Q $dso.manifest - \$(LD) \$(LDFLAGS) \$(DSO_LDFLAGS) \\ - \$(LDOUTFLAG)$dso$shared_def @<< || (DEL /Q \$(\@B).* $dso_n.*; EXIT 1) -$objs$target{ld_resp_delim}$linklibs \$(DSO_EX_LIBS) + \$(LD) \$(LDFLAGS) \$(DSO_LDFLAGS) @<< || (DEL /Q \$(\@B).* $dso_n.*; EXIT 1) +$objs$target{ld_resp_delim}\$(LDOUTFLAG)$dso$target{ldpostoutflag}$target{ld_resp_delim}$linklibs \$(DSO_EX_LIBS)$shared_def << IF EXIST $dso.manifest \\ \$(MT) \$(MTFLAGS) \$(MTINFLAG)$dso.manifest \$(MTOUTFLAG)$dso -- cgit v1.2.3