diff options
author | Tanzinul Islam <tanzinul.islam@gmail.com> | 2020-12-07 00:04:45 +0100 |
---|---|---|
committer | Dmitry Belyavskiy <beldmit@gmail.com> | 2021-04-19 11:05:54 +0200 |
commit | 5fee3fe2760d65a141873601c4b7b9fd2fc5c7b1 (patch) | |
tree | fb0832a2e24cde0f5e2dec0463225bbd06c838fa | |
parent | Ensure cw32mt.lib and import32.lib are linked to in no-sock mode (diff) | |
download | openssl-5fee3fe2760d65a141873601c4b7b9fd2fc5c7b1.tar.xz openssl-5fee3fe2760d65a141873601c4b7b9fd2fc5c7b1.zip |
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 <levitte@openssl.org>
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
(Merged from https://github.com/openssl/openssl/pull/13540)
-rw-r--r-- | Configurations/10-main.conf | 2 | ||||
-rw-r--r-- | Configurations/50-cppbuilder.conf | 30 | ||||
-rw-r--r-- | Configurations/windows-makefile.tmpl | 19 | ||||
-rw-r--r-- | NOTES-WINDOWS.md | 12 | ||||
-rw-r--r-- | crypto/build.info | 2 |
5 files changed, 42 insertions, 23 deletions
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 diff --git a/NOTES-WINDOWS.md b/NOTES-WINDOWS.md index 95682f205c..7ca8de299e 100644 --- a/NOTES-WINDOWS.md +++ b/NOTES-WINDOWS.md @@ -127,8 +127,8 @@ Native builds using Embarcadero C++Builder ========================================= This toolchain (a descendant of Turbo/Borland C++) is an alternative to MSVC. -OpenSSL currently includes an experimental 32-bit static-build configuration -targeting the Clang-based compiler (bcc32c.exe) in v10.3.3 Community Edition. +OpenSSL currently includes an experimental 32-bit configuration targeting the +Clang-based compiler (bcc32c.exe) in v10.3.3 Community Edition. <https://www.embarcadero.com/products/cbuilder/starter> 1. Install Perl. @@ -140,12 +140,14 @@ targeting the Clang-based compiler (bcc32c.exe) in v10.3.3 Community Edition. 4. make -N - 5. Build your program against this OpenSSL: + 5. make -N test + + 6. Build your program against this OpenSSL: * Set your include search path to the "include" subdirectory of OpenSSL. * Set your library search path to the OpenSSL source directory. -Note that this is very experimental. Support for 64-bit, dynamic library, and -other Configure options is still pending. +Note that this is very experimental. Support for 64-bit and other Configure +options is still pending. Native builds using MinGW ========================= diff --git a/crypto/build.info b/crypto/build.info index 3b78431f80..3e1c295aea 100644 --- a/crypto/build.info +++ b/crypto/build.info @@ -131,6 +131,6 @@ INCLUDE[armv4cpuid.o]=. GENERATE[s390xcpuid.S]=s390xcpuid.pl INCLUDE[s390xcpuid.o]=. -IF[{- $config{target} =~ /^(?:Cygwin|mingw|VC-)/ -}] +IF[{- $config{target} =~ /^(?:Cygwin|mingw|VC-|BC-)/ -}] SHARED_SOURCE[../libcrypto]=dllmain.c ENDIF |