The branch master has been updated via 5ae52001e115452ca285713feb1c2feaf07902ad (commit) via daf98015aac8bf392cf95edf9a54d845c1c22fd7 (commit) via 491a1e3363228e8276ee293a86acd7a961ffe9d3 (commit) via 16f2a44435fccbd7466b0659220c765a17e5d0c0 (commit) via 96d4ec6724a9ecc5d193172d0cf1a347f428372a (commit) via 6afb36342d4bc63a774fd96088ededfc00401e1d (commit) via 5fee3fe2760d65a141873601c4b7b9fd2fc5c7b1 (commit) via c4f4cb14e3f06362c2ee9e0e480b816ab46f15b6 (commit) via 55aa235e85e156bf71c339804ef317ad4d0f27a5 (commit) via d5a6b54b49905cdb4edfe1e1caf9656896171cb6 (commit) via 847f41d97c966707d45da5640792e3bd8f8d23fd (commit) via 583a9f1f6b0d0842f8d63a21c335b24494fc67bc (commit) via f1ee757daaf8ea1000c6558abd1ffc8ad5234c09 (commit) via a8368d573e5b4553e7344dd37239da6d72480832 (commit) via a75a87561b491fc9b96b15153eba1f5e142280c5 (commit) via 830cd025b199fab165a378884fb5b4373799bde9 (commit) via 8557bdde4836b4dc63ad305c9f3c648816a05e86 (commit) via e15eff3aaabe17be37ec42ae7ca342cbf2a2733c (commit) via 118faf5ffe2ba495407f482a8d8438b7d266815c (commit) via 23f3242ffe8613411714eb9350275371059c7bfe (commit) via 1bb381227b432676451ead3f9d4b92352464e9cc (commit) from a4afa6c1d00c027a5afc8974a298e0f54607f1b5 (commit)
- Log ----------------------------------------------------------------- commit 5ae52001e115452ca285713feb1c2feaf07902ad Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Mon Dec 14 23:31:49 2020 +0000 Remove crypt32.lib from C++Builder configuration `import32.lib` serves the purpose for most Windows API libraries, including this one. For example, with a GNU `grep` utility: >tdump %BDS%\lib\win32c\release\import32.lib | grep -B 3 -A 1 CertOpenStore 171E32 COMENT Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h) Dynamic link import (IMPDEF) Imported by: name Internal Name: CertOpenStore Module Name: CRYPT32.dll Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit daf98015aac8bf392cf95edf9a54d845c1c22fd7 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sun Dec 13 18:04:43 2020 +0000 Link with uplink module The Clang-based `bcc32c.exe` expects AT&T syntax for inline assembly. References: - http://docwiki.embarcadero.com/RADStudio/Sydney/en/Differences_Between_Clang-enhanced_C%2B%2B_Compilers_and_Previous-Generation_C%2B%2B_Compilers#Inline_Assembly - https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html - https://sourceware.org/binutils/docs/as/i386_002dVariations.html Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 491a1e3363228e8276ee293a86acd7a961ffe9d3 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sun Dec 13 18:01:46 2020 +0000 Link with .def files MSVC's `link.exe` automatically finds `__cdecl` C functions (which are decorated with a leading underscore by the compiler) when they are mentioned in a `.def` file without the leading underscore. This is an [under-documented feature][1] of MSVC's `link.exe`. C++Builder's `ilink32.exe` doesn't do this, and thus needs the name-translation in the `.def` file. Then `implib.exe` needs to be told to re-add it. (The Clang-based `bcc32c.exe` doesn't implement the [`-vu` or `-u-`][2] options to skip adding the leading underscore to `__cdecl` C function names, so this is the only way to have things work with non-underscored export names in the DLLs.) [1]: https://github.com/MicrosoftDocs/cpp-docs/issues/2653 [2]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/Options_Not_Supported_by_Clang-enhanced_C%2B%2B_Compilers#BCC32_Options_that_Are_Not_Supported_by_Clang-enhanced_C.2B.2B_Compilers Also silence linker warnings on duplicate symbols and ensure that error- case cleanup in link rules work in C++Builder's `make.exe`. Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 16f2a44435fccbd7466b0659220c765a17e5d0c0 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Thu Dec 10 14:53:07 2020 +0000 Generate dependency information The Clang-based `bcc32c.exe` doesn't implement the `-Hp` option, so we have to use [`cpp32.exe`][1] instead. Therefore, change the dependency- emitting command to use `$(CPP)` instead of `$(CC)`, which which also uncovered the [existing bug of `2>&1` before `> $dep`][2]. Also C++Builder's `make.exe` doesn't implement `2>&1` in its command runner, so wrap the whole line in a `cmd /C`. [1]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/CPP32.EXE,_the_C_Compiler_Preprocessor [2]: https://ss64.com/nt/syntax-redirection.html Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 96d4ec6724a9ecc5d193172d0cf1a347f428372a Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Wed Dec 9 00:45:11 2020 +0000 Avoid more MSVC-specific C runtime library functions Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 6afb36342d4bc63a774fd96088ededfc00401e1d Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Wed Dec 9 00:29:14 2020 +0000 Build resource files We need to compile with [brcc32.exe][1] and link with [ilink32.exe][2]. The latter expects the `.res` files to be given in the final comma- separated section in the command line (after the `.def` file). [1]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/BRCC32.EXE,_the_Resource_Compiler [2]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/Using_ILINK32_and_ILINK64_on_the_Command_Line#Command-Line_Elements Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 5fee3fe2760d65a141873601c4b7b9fd2fc5c7b1 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sun Dec 6 23:04:45 2020 +0000 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 <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit c4f4cb14e3f06362c2ee9e0e480b816ab46f15b6 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sat Nov 28 22:56:53 2020 +0000 Ensure cw32mt.lib and import32.lib are linked to in no-sock mode Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 55aa235e85e156bf71c339804ef317ad4d0f27a5 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sat Nov 28 02:21:03 2020 +0000 Document C++Builder usage in NOTES-WINDOWS.md Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit d5a6b54b49905cdb4edfe1e1caf9656896171cb6 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sat Nov 28 02:11:28 2020 +0000 Replace "ld_wildcard_args" with "bin_lflags" Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 847f41d97c966707d45da5640792e3bd8f8d23fd Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Fri Nov 27 14:22:38 2020 +0000 Add explanation + bugtracker link for quoted dependency workarounds Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 583a9f1f6b0d0842f8d63a21c335b24494fc67bc Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Thu Nov 26 15:38:40 2020 +0000 Use cmd.exe to export env vars before commands Microsoft NMake runs the entire command block in a single `cmd.exe` session, so environment variables exported with `set` are seen by the following commands. C++Builder's `make.exe` doesn't use `cmd.exe` but executes each command line separately. While it emulates only certain shell features itself, `set` isn't one of them. Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit f1ee757daaf8ea1000c6558abd1ffc8ad5234c09 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Thu Nov 19 23:39:12 2020 +0000 Resurrect and modernize C++Builder config Similar configuration to what was deleted in 8e56a422, updated for the unified build scheme. Use the [Clang-based `bcc32c.exe`][1] to avoid a [bug][2] with the old one, and increase the `tlib.exe` page size to 256. Also avoid MSVC-specific C runtime library functions. [1]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/Win32_Clang-enhanced_Compilers [2]: https://quality.embarcadero.com/browse/RSP-31630 Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit a8368d573e5b4553e7344dd37239da6d72480832 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Thu Nov 19 23:25:22 2020 +0000 Avoid redirection to quoted filename C++Builder's `make.exe` cannot handle a command output redirection to a quoted filename, saying: "The system cannot find the file specified." Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit a75a87561b491fc9b96b15153eba1f5e142280c5 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Thu Nov 19 17:57:46 2020 +0000 Generalize link rule in windows-makefile.tmpl C++Builder's [`ilink32.exe`][1] expects its different types of input / output files to be in a particular sequence and comma-separated -- even in the response file as experimentation revealed, contrary to what is documented. The lines of the response file need to end with `+`. Also [`setargv.obj`][2] is MSVC-specific. The C++Builder equivalent is [`wildargs.obj`][3]. [1]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/Using_ILINK32_and_ILINK64_on_the_Command_Line [2]: https://docs.microsoft.com/en-us/cpp/c-language/expanding-wildcard-arguments?view=msvc-160 [3]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/Wildcard_Arguments Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 830cd025b199fab165a378884fb5b4373799bde9 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Mon Nov 16 22:52:44 2020 +0000 Ensure at least one command if no dependencies C++Builder's `make.exe` complains if a target has no dependencies (e.g. after variable expansion) and no lines of commands. Ensure there is a blank command line if the dependency list is entirely made of variables. Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 8557bdde4836b4dc63ad305c9f3c648816a05e86 Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sun Nov 15 20:57:49 2020 +0000 Avoid quoting dependency filepaths in build tree C++Builder's `make.exe` has a bug in finding the rule of a quoted dependency that doesn't exist in the filesystem. So for example: A: "src\B" "out\C" touch $@ out\C: mkdir out touch $@ leads to: Fatal: '"out\C"' does not exist - don't know how to make it This happens even with the `-N` option, and is different behavior from Microsoft NMake which documents the feature of [quoted filepaths][1]. Commit cb663908 quoted all dependency filepaths, in case they are used in a out-of-source build. The quoting is not done for target names, however, which implies that the build directory is still expected to not have spaces. It follows that we only need to quote non-generated source files in dependency lists, since generated source files will be created in the build directory. Change the logic accordingly as a workaround, so that it works at least for in-source builds with C++Builder's `make.exe`. [1]: https://docs.microsoft.com/cpp/build/reference/long-filenames-in-a-makefile?view=msvc-160 Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit e15eff3aaabe17be37ec42ae7ca342cbf2a2733c Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sat Nov 7 20:49:47 2020 +0000 Generalize delimiter in archiver response file While [`lib.exe` of MSVC][1] expects newline-delimited response file lines, [`tlib.exe` of C++Builder][2] expects lines to end with `&` in order to read the next line. [1]: https://docs.microsoft.com/cpp/build/reference/running-lib?view=msvc-160#lib-command-files [2]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/TLIB.EXE,_the_Library_Manager#Response_Files Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 118faf5ffe2ba495407f482a8d8438b7d266815c Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sat Nov 7 14:11:05 2020 +0000 Avoid space between "-I" and include directory The space is problematic with C++Builder (`bcc32.exe`). MSVC (`cl.exe`) doesn't care. Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 23f3242ffe8613411714eb9350275371059c7bfe Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sat Nov 7 13:13:34 2020 +0000 Move VS Tools configuration to VC-common target The Windows toolchain is composed of utilites from both the Windows SDK and the Visual Studio Build Tools. Move the configuration of the latter utilities into the `VC-common` template inside `10-main.conf`, while leaving the former utilities in `BASE_Windows`. This allows for other Windows compilers to be configured inheriting from `BASE_Windows`. Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) commit 1bb381227b432676451ead3f9d4b92352464e9cc Author: Tanzinul Islam <tanzinul.is...@gmail.com> Date: Sat Nov 7 12:52:30 2020 +0000 Avoid "&&" in windows-makefile.tmpl The `make.exe` utility shipped with Embarcadero C++Builder has a special meaning for the [`&&` operator in commands][1]. This meaning is retained even in Microsoft NMake compatibility mode (`make -N`). Split all commands using this shell (`cmd.exe`) operator into two commands. [1]: http://docwiki.embarcadero.com/RADStudio/Sydney/en/MAKE_Rules_(Explicit_and_Implicit)_and_Commands#MAKE_Command_Operators Reviewed-by: Richard Levitte <levi...@openssl.org> Reviewed-by: Dmitry Belyavskiy <beld...@gmail.com> (Merged from https://github.com/openssl/openssl/pull/13540) ----------------------------------------------------------------------- Summary of changes: .gitignore | 2 + Configurations/00-base-templates.conf | 8 -- Configurations/10-main.conf | 19 +++- Configurations/50-cppbuilder.conf | 56 ++++++++++++ Configurations/platform/Windows/cppbuilder.pm | 16 ++++ Configurations/windows-makefile.tmpl | 126 +++++++++++++++----------- Configure | 6 +- NOTES-WINDOWS.md | 30 ++++++ apps/build.info | 2 +- apps/cmp.c | 2 +- apps/lib/apps.c | 2 +- apps/lib/build.info | 2 +- build.info | 2 +- crypto/bio/bss_file.c | 2 +- crypto/build.info | 2 +- crypto/conf/conf_sap.c | 2 +- crypto/init.c | 2 +- ms/applink.c | 6 ++ ms/uplink.c | 19 +++- test/build.info | 2 +- test/conf_include_test.c | 4 +- test/testutil/driver.c | 2 +- util/add-depends.pl | 19 +++- util/mkdef.pl | 8 +- 24 files changed, 254 insertions(+), 87 deletions(-) create mode 100644 Configurations/50-cppbuilder.conf create mode 100644 Configurations/platform/Windows/cppbuilder.pm diff --git a/.gitignore b/.gitignore index 7a07450106..b88ede1d59 100644 --- a/.gitignore +++ b/.gitignore @@ -212,6 +212,7 @@ providers/common/include/prov/der_sm2.h *.exp *.lib *.pdb +*.tds *.ilk *.def *.rc @@ -227,6 +228,7 @@ cscope.* *.d *.d.tmp pod2htmd.tmp +MAKE0[0-9][0-9][0-9].@@@ # Windows manifest files *.manifest diff --git a/Configurations/00-base-templates.conf b/Configurations/00-base-templates.conf index 1da5c5f0d0..0e5d38d5a6 100644 --- a/Configurations/00-base-templates.conf +++ b/Configurations/00-base-templates.conf @@ -108,14 +108,6 @@ my %targets=( return (); }, - LD => "link", - LDFLAGS => "/nologo", - ldoutflag => "/out:", - AR => "lib", - ARFLAGS => "/nologo", - aroutflag => "/out:", - RC => "rc", - rcoutflag => "/fo", MT => "mt", MTFLAGS => "-nologo", mtinflag => "-manifest ", diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf index 9529bbfe5c..f5e5754b3a 100644 --- a/Configurations/10-main.conf +++ b/Configurations/10-main.conf @@ -1275,10 +1275,22 @@ my %targets = ( inherit_from => [ "BASE_Windows" ], template => 1, CC => "cl", - CPP => '$(CC) /EP /C', + CPP => '"$(CC)" /EP /C', CFLAGS => "/W3 /wd4090 /nologo", - LDFLAGS => add("/debug"), coutflag => "/Fo", + cpp_depend_flags => "/Zs /showIncludes", + LD => "link", + LDFLAGS => "/nologo /debug", + ldoutflag => "/out:", + ldpostoutflag => "", + ld_resp_delim => "\n", + bin_lflags => "setargv.obj", + AR => "lib", + ARFLAGS => "/nologo", + aroutflag => "/out:", + ar_resp_delim => "\n", + RC => "rc", + rcoutflag => "/fo", defines => add("OPENSSL_SYS_WIN32", "WIN32_LEAN_AND_MEAN", "UNICODE", "_UNICODE", "_CRT_SECURE_NO_DEPRECATE", @@ -1291,6 +1303,9 @@ my %targets = ( shared_defflag => '', shared_ldflag => "/dll", shared_target => "win-shared", # meaningless except it gives Configure a hint + lddefflag => "/def:", + ldresflag => " ", + 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 new file mode 100644 index 0000000000..1c47a4c2be --- /dev/null +++ b/Configurations/50-cppbuilder.conf @@ -0,0 +1,56 @@ +my %targets = ( + "BC-32" => { + inherit_from => [ "BASE_Windows" ], + sys_id => "WIN32", + bn_ops => "BN_LLONG", + thread_scheme => "winthreads", + cc => "bcc32c", + CPP => "cpp32 -oCON -Sc -Sr", + 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 => 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", + cpp_depend_flags => "-Hp", + LD => "ilink32", + LDFLAGS => picker(default => "-x -Gn -q -w-dup", + 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 => "-ap -Tpe c0x32.obj wildargs.obj", + ldoutflag => ",", + ldpostoutflag => ",,", + ld_resp_delim => " +\n", + ex_libs => add(sub { + my @ex_libs = ("import32.lib", + ($disabled{shared} + ? ($disabled{threads} ? "cw32.lib" : "cw32mt.lib") + : ($disabled{threads} ? "cw32i.lib" : "cw32mti.lib"))); + push @ex_libs, "ws2_32.lib" unless $disabled{sock}; + return join(" ", @ex_libs); + }), + AR => "tlib", + ARFLAGS => "/P256 /N /u", + ar_resp_delim => " &\n", + RC => "brcc32", + RCFLAGS => '-i"$(BDS)\include\windows\sdk"', + rcoutflag => "-fo", + shared_target => "win-shared", + shared_ldflag => "-aa -Tpd c0d32.obj", + lddefflag => ",", + ldresflag => ",", + ld_implib_rule => 'implib -a $< $**', + dso_scheme => "win32", + shared_defflag => '', + perl_platform => 'Windows::cppbuilder', + uplink_arch => 'common', + } +); diff --git a/Configurations/platform/Windows/cppbuilder.pm b/Configurations/platform/Windows/cppbuilder.pm new file mode 100644 index 0000000000..b4d208d6d4 --- /dev/null +++ b/Configurations/platform/Windows/cppbuilder.pm @@ -0,0 +1,16 @@ +package platform::Windows::cppbuilder; + +use vars qw(@ISA); + +require platform::Windows::MSVC; +@ISA = qw(platform::Windows::MSVC); + +sub pdbext { '.tds' } + +# C++Builder's Clang-based compilers prepend an underscore to __cdecl-convention +# C functions, and the linker needs those as the InternalName in the .def file. +sub export2internal { + return "_$_[1]"; +} + +1; diff --git a/Configurations/windows-makefile.tmpl b/Configurations/windows-makefile.tmpl index 050d618a23..6ceab7e94d 100644 --- a/Configurations/windows-makefile.tmpl +++ b/Configurations/windows-makefile.tmpl @@ -29,7 +29,7 @@ sub dependmagic { my $target = shift; - return "$target: build_generated\n\t\$(MAKE) /\$(MAKEFLAGS) depend && \$(MAKE) /\$(MAKEFLAGS) _$target\n_$target"; + return "$target: build_generated\n\t\$(MAKE) /\$(MAKEFLAGS) depend\n\t\$(MAKE) /\$(MAKEFLAGS) _$target\n_$target"; } ''; -} @@ -226,10 +226,10 @@ libdir={- file_name_is_absolute($libdir) ##### User defined commands and flags ################################ CC="{- $config{CC} -}" -CPP="{- $config{CPP} -}" +CPP={- $config{CPP} -} CPPFLAGS={- our $cppflags1 = join(" ", (map { "-D".$_} @{$config{CPPDEFINES}}), - (map { " -I ".$_} @{$config{CPPINCLUDES}}), + (map { " -I".$_} @{$config{CPPINCLUDES}}), @{$config{CPPFLAGS}}) -} CFLAGS={- join(' ', @{$config{CFLAGS}}) -} LD="{- $config{LD} -}" @@ -388,11 +388,15 @@ PROCESSOR= {- $config{processor} -} build_docs: build_html_docs build_html_docs: $(HTMLDOCS1) $(HTMLDOCS3) $(HTMLDOCS5) $(HTMLDOCS7) - + @ build_generated: $(GENERATED_MANDATORY) + @ build_libs_nodep: $(LIBS) {- join(" ",map { platform->sharedlib_import($_) // () } @{$unified_info{libraries}}) -} + @ build_modules_nodep: $(MODULES) + @ build_programs_nodep: $(PROGRAMS) $(SCRIPTS) + @ # Kept around for backward compatibility build_apps build_tests: build_programs @@ -411,19 +415,14 @@ all: build_sw build_docs test: tests {- dependmagic('tests'); -}: build_programs_nodep build_modules_nodep copy-utils @{- output_off() if $disabled{tests}; "" -} - set SRCTOP=$(SRCDIR) - set BLDTOP=$(BLDDIR) - set PERL=$(PERL) - set FIPSKEY=$(FIPSKEY) - "$(PERL)" "$(SRCDIR)\test\run_tests.pl" $(TESTS) + cmd /C "set "SRCTOP=$(SRCDIR)" & set "BLDTOP=$(BLDDIR)" & set "PERL=$(PERL)" & set "FIPSKEY=$(FIPSKEY)" & "$(PERL)" "$(SRCDIR)\test\run_tests.pl" $(TESTS)" @{- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -} @$(ECHO) "Tests are not supported with your chosen Configure options" @{- output_on() if !$disabled{tests}; "" -} list-tests: @{- output_off() if $disabled{tests}; "" -} - @set SRCTOP=$(SRCDIR) - @"$(PERL)" "$(SRCDIR)\test\run_tests.pl" list + @cmd /C "set "SRCTOP=$(SRCDIR)" & "$(PERL)" "$(SRCDIR)\test\run_tests.pl" list" @{- if ($disabled{tests}) { output_on(); } else { output_off(); } "" -} @$(ECHO) "Tests are not supported with your chosen Configure options" @{- output_on() if !$disabled{tests}; "" -} @@ -621,7 +620,7 @@ reconfigure reconf: {- use File::Basename; - use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/; + use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs file_name_is_absolute/; # Helper function to figure out dependencies on libraries # It takes a list of library names and outputs a list of dependencies @@ -640,16 +639,23 @@ $args{target}: $deps EOF } + # This function (and the next) avoids quoting paths of generated dependencies + # (in the build tree), but quotes paths of non-generated dependencies (in the + # source tree). This is a workaround for a limitation of C++Builder's make.exe + # in handling quoted paths: https://quality.embarcadero.com/browse/RSP-31756 sub generatesrc { my %args = @_; my $gen0 = $args{generator}->[0]; my $gen_args = join('', map { " $_" } @{$args{generator}}[1..$#{$args{generator}}]); - my $gen_incs = join("", map { " -I \"$_\"" } @{$args{generator_incs}}); - my $incs = join("", map { " -I \"$_\"" } @{$args{incs}}); + my $gen_incs = join("", map { " -I\"$_\"" } @{$args{generator_incs}}); + my $incs = join("", map { " -I\"$_\"" } @{$args{incs}}); my $defs = join("", map { " -D".$_ } @{$args{defs}}); my $deps = @{$args{deps}} ? - '"'.join('" "', @{$args{generator_deps}}, @{$args{deps}}).'"' : ''; + join(' ', + map { file_name_is_absolute($_) || ($_ =~ m|^../|) ? "\"$_\"" : $_ } + (@{$args{generator_deps}}, @{$args{deps}})) + : ''; if ($args{src} =~ /\.html$/) { # @@ -704,22 +710,22 @@ EOF if ($args{src} =~ /\.S$/) { return <<"EOF"; $target: "$gen0" $deps - set ASM=\$(AS) - $generator \$@.S - \$(CPP) $incs $cppflags $defs \$@.S > \$@.i && move /Y \$@.i \$@ + cmd /C "set "ASM=\$(AS)" & $generator \$@.S" + \$(CPP) $incs $cppflags $defs \$@.S > \$@.i + move /Y \$@.i \$@ del /Q \$@.S EOF } # Otherwise.... return <<"EOF"; $target: "$gen0" $deps - set ASM=\$(AS) - $generator \$@ + cmd /C "set "ASM=\$(AS)" & $generator \$@" EOF } return <<"EOF"; $target: "$gen0" $deps - \$(CPP) $incs $cppflags $defs "$gen0" > \$@.i && move /Y \$@.i \$@ + \$(CPP) $incs $cppflags $defs "$gen0" > \$@.i + move /Y \$@.i \$@ EOF } elsif ($gen0 =~ m|^.*\.in$|) { # @@ -785,8 +791,10 @@ EOF ? platform->asm($x) : $x } ( @{$args{srcs}} ); my $srcs = '"'.join('" "', @srcs).'"'; - my $deps = '"'.join('" "', @srcs, @{$args{deps}}).'"'; - my $incs = join("", map { ' -I "'.$_.'"' } @{$args{incs}}); + my $deps = join(' ', + map { file_name_is_absolute($_) || ($_ =~ m|^../|) ? "\"$_\"" : $_ } + (@srcs, @{$args{deps}})); + my $incs = join("", map { ' -I"'.$_.'"' } @{$args{incs}}); my $defs = join("", map { " -D".$_ } @{$args{defs}}); my $cflags = { shlib => ' $(LIB_CFLAGS)', lib => ' $(LIB_CFLAGS)', @@ -819,7 +827,8 @@ EOF } elsif ($srcs[0] =~ /.S$/) { return <<"EOF"; $obj: $deps - \$(CC) /EP -D__ASSEMBLER__ $cflags $defs $srcs > \$@.asm && \$(AS) $asflags \$(ASOUTFLAG)\$\@ \$@.asm + \$(CC) /EP -D__ASSEMBLER__ $cflags $defs $srcs > \$@.asm + \$(AS) $asflags \$(ASOUTFLAG)\$\@ \$@.asm EOF } my $recipe = <<"EOF"; @@ -827,7 +836,7 @@ $obj: $deps \$(CC) $cflags $defs -c \$(COUTFLAG)\$\@ $srcs EOF $recipe .= <<"EOF" unless $disabled{makedepend}; - \$(CC) $cflags $defs /Zs /showIncludes $srcs 2>&1 > $dep + cmd /C "\$(CPP) $cflags $defs $target{cpp_depend_flags} $srcs > $dep 2>&1" EOF return $recipe; } @@ -839,31 +848,38 @@ EOF my %args = @_; my $lib = $args{lib}; my @objs = map { platform->convertext($_) } - grep { platform->isobj($_) || platform->isres($_) } + grep { platform->isobj($_) } + @{$args{objs}}; + my @ress = map { platform->convertext($_) } + grep { platform->isres($_) } @{$args{objs}}; my @defs = map { platform->def($_) } grep { platform->isdef($_) } @{$args{objs}}; my @deps = compute_lib_depends(@{$args{deps}}); die "More than one exported symbols list" if scalar @defs > 1; - my $linklibs = join("", map { "$_\n" } @deps); - my $objs = join("\n", @objs); - my $deps = join(" ", @objs, @defs, @deps); + my $linklibs = join("", map { "$_$target{ld_resp_delim}" } @deps); + my $objs = join($target{ld_resp_delim}, @objs); + my $ress = join($target{ld_resp_delim}, @ress); + my $deps = join(" ", @objs, @ress, @defs, @deps); my $import = platform->sharedlib_import($lib); my $dll = platform->sharedlib($lib); - my $shared_def = join("", map { " /def:$_" } @defs); + my $shared_def = $target{lddefflag} . join("", @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 -$linklibs\$(LIB_EX_LIBS) + cmd /C "\$(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)$target{ld_resp_delim}$shared_def$target{ldresflag}$ress << IF EXIST $dll.manifest \\ \$(MT) \$(MTFLAGS) \$(MTINFLAG)$dll.manifest \$(MTOUTFLAG)$dll @@ -880,23 +896,26 @@ EOF my $dso = platform->dso($args{module}); my $dso_n = platform->dsoname($args{module}); my @objs = map { platform->convertext($_) } - grep { platform->isobj($_) || platform->isres($_) } + grep { platform->isobj($_) } + @{$args{objs}}; + my @ress = map { platform->convertext($_) } + grep { platform->isres($_) } @{$args{objs}}; my @defs = map { platform->def($_) } grep { platform->isdef($_) } @{$args{objs}}; my @deps = compute_lib_depends(@{$args{deps}}); - my $objs = join("\n", @objs); - my $linklibs = join("", map { "$_\n" } @deps); - my $deps = join(" ", @objs, @defs, @deps); - my $shared_def = join("", map { " /def:$_" } @defs); + die "More than one exported symbols list" if scalar @defs > 1; + my $objs = join($target{ld_resp_delim}, @objs); + my $ress = join($target{ld_resp_delim}, @ress); + my $linklibs = join("", map { "$_$target{ld_resp_delim}" } @deps); + my $deps = join(" ", @objs, @ress, @defs, @deps); + my $shared_def = $target{lddefflag} . join("", @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 -$linklibs \$(DSO_EX_LIBS) + cmd /C "\$(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)$target{ld_resp_delim}$shared_def$target{ldresflag}$ress << IF EXIST $dso.manifest \\ \$(MT) \$(MTFLAGS) \$(MTINFLAG)$dso.manifest \$(MTOUTFLAG)$dso @@ -906,7 +925,7 @@ EOF my %args = @_; my $lib = platform->staticlib($args{lib}); my @objs = map { platform->obj($_) } @{$args{objs}}; - my $objs = join("\n", @objs); + my $objs = join($target{ar_resp_delim}, @objs); my $deps = join(" ", @objs); return <<"EOF"; $lib: $deps @@ -919,19 +938,20 @@ EOF my %args = @_; my $bin = platform->bin($args{bin}); my @objs = map { platform->convertext($_) } - grep { platform->isobj($_) || platform->isres($_) } + grep { platform->isobj($_) } + @{$args{objs}}; + my @ress = map { platform->convertext($_) } + grep { platform->isres($_) } @{$args{objs}}; my @deps = compute_lib_depends(@{$args{deps}}); - my $objs = join("\n", @objs); - my $linklibs = join("", map { "$_\n" } @deps); - my $deps = join(" ", @objs, @deps); + my $objs = join($target{ld_resp_delim}, @objs); + my $linklibs = join("", map { "$_$target{ld_resp_delim}" } @deps); + my $deps = join(" ", @objs, @ress, @deps); return <<"EOF"; $bin: $deps IF EXIST $bin.manifest DEL /F /Q $bin.manifest - \$(LD) \$(LDFLAGS) \$(BIN_LDFLAGS) \$(LDOUTFLAG)$bin @<< -$objs -setargv.obj -$linklibs\$(BIN_EX_LIBS) + \$(LD) \$(LDFLAGS) \$(BIN_LDFLAGS) @<< +$objs$target{ld_resp_delim}\$(LDOUTFLAG)$bin$target{ldpostoutflag}$target{ld_resp_delim}$linklibs\$(BIN_EX_LIBS)$target{ldresflag}$target{ldresflag}$ress << IF EXIST $bin.manifest \\ \$(MT) \$(MTFLAGS) \$(MTINFLAG)$bin.manifest \$(MTOUTFLAG)$bin @@ -947,7 +967,7 @@ EOF return <<"EOF"; $script: $sources "\$(PERL)" "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\ - "-o$target{build_file}" $sources > "$script" + "-o$target{build_file}" $sources > \$@ EOF } sub generatedir { diff --git a/Configure b/Configure index e36c5d93aa..76c27bacb8 100755 --- a/Configure +++ b/Configure @@ -1533,10 +1533,10 @@ unless ($disabled{asm}) { # Check for makedepend capabilities. if (!$disabled{makedepend}) { - if ($config{target} =~ /^(VC|vms)-/) { - # For VC- and vms- targets, there's nothing more to do here. The + if ($config{target} =~ /^(VC|BC|vms)-/) { + # For VC-, BC- and vms- targets, there's nothing more to do here. The # functionality is hard coded in the corresponding build files for - # cl (Windows) and CC/DECC (VMS). + # cl/cpp32 (Windows) and CC/DECC (VMS). } elsif (($predefined_C{__GNUC__} // -1) >= 3 && !($predefined_C{__APPLE_CC__} && !$predefined_C{__clang__})) { # We know that GNU C version 3 and up as well as all clang diff --git a/NOTES-WINDOWS.md b/NOTES-WINDOWS.md index dca13a7260..7ca8de299e 100644 --- a/NOTES-WINDOWS.md +++ b/NOTES-WINDOWS.md @@ -2,6 +2,8 @@ Notes for Windows platforms =========================== - [Native builds using Visual C++](#native-builds-using-visual-c++) + - [Native builds using Embarcadero C++Builder]( + #native-builds-using-embarcadero-c++-builder) - [Native builds using MinGW](#native-builds-using-mingw) - [Linking native applications](#linking-native-applications) - [Hosted builds using Cygwin](#hosted-builds-using-cygwin) @@ -13,6 +15,8 @@ There are various options to build and run OpenSSL on the Windows platforms. To build a native OpenSSL you can either use: Microsoft Visual C++ (MSVC) C compiler on the command line +or + Embarcadero C++Builder or MinGW cross compiler run on the GNU-like development environment MSYS2 @@ -119,6 +123,32 @@ Special notes for Universal Windows Platform builds, aka VC-*-UWP "vcvarsall.bat" before you compile. For example, if you want to build "arm64" builds, you should run "vcvarsall.bat x86_arm64 uwp". +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 configuration targeting the +Clang-based compiler (bcc32c.exe) in v10.3.3 Community Edition. +<https://www.embarcadero.com/products/cbuilder/starter> + + 1. Install Perl. + + 2. Open the RAD Studio Command Prompt. + + 3. Go to the root of the OpenSSL source directory and run: + perl Configure BC-32 --prefix=%CD% + + 4. make -N + + 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 and other Configure +options is still pending. + Native builds using MinGW ========================= diff --git a/apps/build.info b/apps/build.info index 146e9009f5..06759b2f94 100644 --- a/apps/build.info +++ b/apps/build.info @@ -71,7 +71,7 @@ IF[{- !$disabled{apps} -}] # always depend on a changed configuration. DEPEND[progs.c]=../configdata.pm - IF[{- $config{target} =~ /^(?:Cygwin|mingw|VC-)/ -}] + IF[{- $config{target} =~ /^(?:Cygwin|mingw|VC-|BC-)/ -}] GENERATE[openssl.rc]=../util/mkrc.pl openssl SOURCE[openssl]=openssl.rc ENDIF diff --git a/apps/cmp.c b/apps/cmp.c index 50282315d8..644fb545d2 100644 --- a/apps/cmp.c +++ b/apps/cmp.c @@ -20,7 +20,7 @@ #include "cmp_mock_srv.h" /* tweaks needed due to missing unistd.h on Windows */ -#ifdef _WIN32 +#if defined(_WIN32) && !defined(__BORLANDC__) # define access _access #endif #ifndef F_OK diff --git a/apps/lib/apps.c b/apps/lib/apps.c index df4edfb837..7eadf5a4b5 100644 --- a/apps/lib/apps.c +++ b/apps/lib/apps.c @@ -50,7 +50,7 @@ static int WIN32_rename(const char *from, const char *to); # include <conio.h> #endif -#if defined(OPENSSL_SYS_MSDOS) && !defined(_WIN32) +#if defined(OPENSSL_SYS_MSDOS) && !defined(_WIN32) || defined(__BORLANDC__) # define _kbhit kbhit #endif diff --git a/apps/lib/build.info b/apps/lib/build.info index c352f7086d..340ce29b09 100644 --- a/apps/lib/build.info +++ b/apps/lib/build.info @@ -1,5 +1,5 @@ # Auxiliary program source -IF[{- $config{target} =~ /^(?:VC-|mingw)/ -}] +IF[{- $config{target} =~ /^(?:VC-|mingw|BC-)/ -}] # It's called 'init', but doesn't have much 'init' in it... $AUXLIBAPPSSRC=win32_init.c ENDIF diff --git a/build.info b/build.info index f631d6c780..6c91e22309 100644 --- a/build.info +++ b/build.info @@ -79,7 +79,7 @@ IF[{- defined $target{shared_defflag} -}] GENERATE[libssl.ld]=util/libssl.num libssl ENDIF -IF[{- $config{target} =~ /^(?:Cygwin|mingw|VC-)/ -}] +IF[{- $config{target} =~ /^(?:Cygwin|mingw|VC-|BC-)/ -}] GENERATE[libcrypto.rc]=util/mkrc.pl libcrypto GENERATE[libssl.rc]=util/mkrc.pl libssl diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c index 981a5e7b59..41c3a59665 100644 --- a/crypto/bio/bss_file.c +++ b/crypto/bio/bss_file.c @@ -216,7 +216,7 @@ static long file_ctrl(BIO *b, int cmd, long num, void *ptr) # define _IOB_ENTRIES 20 # endif /* Safety net to catch purely internal BIO_set_fp calls */ -# if defined(_MSC_VER) && _MSC_VER>=1900 +# if (defined(_MSC_VER) && _MSC_VER>=1900) || defined(__BORLANDC__) if (ptr == stdin || ptr == stdout || ptr == stderr) BIO_clear_flags(b, BIO_FLAGS_UPLINK_INTERNAL); # elif defined(_IOB_ENTRIES) 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 diff --git a/crypto/conf/conf_sap.c b/crypto/conf/conf_sap.c index 4188f9113a..5cd018c167 100644 --- a/crypto/conf/conf_sap.c +++ b/crypto/conf/conf_sap.c @@ -15,7 +15,7 @@ #include <openssl/asn1.h> #include <openssl/engine.h> -#ifdef _WIN32 +#if defined(_WIN32) && !defined(__BORLANDC__) # define strdup _strdup #endif diff --git a/crypto/init.c b/crypto/init.c index bf5c17da6d..788abe52e8 100644 --- a/crypto/init.c +++ b/crypto/init.c @@ -89,7 +89,7 @@ DEFINE_RUN_ONCE_STATIC(ossl_init_register_atexit) fprintf(stderr, "OPENSSL_INIT: ossl_init_register_atexit()\n"); #endif #ifndef OPENSSL_SYS_UEFI -# ifdef _WIN32 +# if defined(_WIN32) && !defined(__BORLANDC__) /* We use _onexit() in preference because it gets called on DLL unload */ if (_onexit(win32atexit) == NULL) return 0; diff --git a/ms/applink.c b/ms/applink.c index d19966a33e..2cf3a92f18 100644 --- a/ms/applink.c +++ b/ms/applink.c @@ -38,6 +38,12 @@ # include <io.h> # include <fcntl.h> +# ifdef __BORLANDC__ + /* _lseek in <io.h> is a function-like macro so we can't take its address */ +# undef _lseek +# define _lseek lseek +# endif + static void *app_stdin(void) { return stdin; diff --git a/ms/uplink.c b/ms/uplink.c index 8c61a7ed1d..f924eb3e58 100644 --- a/ms/uplink.c +++ b/ms/uplink.c @@ -99,14 +99,29 @@ void OPENSSL_Uplink(volatile void **table, int index) table[index] = func; } -#if defined(_MSC_VER) && defined(_M_IX86) -# define LAZY(i) \ +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && defined(_M_IX86) +# if defined(_MSC_VER) +# define LAZY(i) \ __declspec(naked) static void lazy##i (void) { \ _asm push i \ _asm push OFFSET OPENSSL_UplinkTable \ _asm call OPENSSL_Uplink \ _asm add esp,8 \ _asm jmp OPENSSL_UplinkTable+4*i } +# elif defined(__BORLANDC__) && defined(__clang__) +void *OPENSSL_UplinkTable[26]; /* C++Builder requires declaration before use */ +# define LAZY(i) \ +__declspec(naked) static void lazy##i (void) { \ + __asm__("pushl $" #i "; " \ + "pushl %0; " \ + "call %P1; " \ + "addl $8, %%esp; " \ + "jmp *%2 " \ + : /* no outputs */ \ + : "i" (OPENSSL_UplinkTable), \ + "i" (OPENSSL_Uplink), \ + "m" (OPENSSL_UplinkTable[i])); } +# endif # if APPLINK_MAX>25 # error "Add more stubs..." diff --git a/test/build.info b/test/build.info index b31e5dedd5..8043f0d3be 100644 --- a/test/build.info +++ b/test/build.info @@ -5,7 +5,7 @@ # be useful here. # # Auxiliary program source (copied from ../apps/build.info) -IF[{- $config{target} =~ /^(?:VC-|mingw)/ -}] +IF[{- $config{target} =~ /^(?:VC-|mingw|BC-)/ -}] # It's called 'init', but doesn't have much 'init' in it... $AUXLIBAPPSSRC=../apps/lib/win32_init.c ENDIF diff --git a/test/conf_include_test.c b/test/conf_include_test.c index 0cf8d49740..a38c4913d2 100644 --- a/test/conf_include_test.c +++ b/test/conf_include_test.c @@ -16,7 +16,9 @@ #ifdef _WIN32 # include <direct.h> # define DIRSEP "/\\" -# define chdir _chdir +# ifndef __BORLANDC__ +# define chdir _chdir +# endif # define DIRSEP_PRESERVE 0 #elif !defined(OPENSSL_NO_POSIX_IO) # include <unistd.h> diff --git a/test/testutil/driver.c b/test/testutil/driver.c index 0b50e2ae16..702f7b2caa 100644 --- a/test/testutil/driver.c +++ b/test/testutil/driver.c @@ -19,7 +19,7 @@ #include "platform.h" /* From libapps */ -#ifdef _WIN32 +#if defined(_WIN32) && !defined(__BORLANDC__) # define strdup _strdup #endif diff --git a/util/add-depends.pl b/util/add-depends.pl index 1a87cdd364..6fdc5e5ef4 100644 --- a/util/add-depends.pl +++ b/util/add-depends.pl @@ -161,8 +161,7 @@ my %procedures = ( }, 'VC' => sub { - # For the moment, we only support Visual C on native Windows, or - # compatible compilers. With those, the flags /Zs /showIncludes + # On Windows, with Microsoft Visual C the flags /Zs /showIncludes # give us the necessary output to be able to create dependencies # that nmake (or any 'make' implementation) should be able to read, # with a bit of help. The output we're interested in looks like @@ -170,6 +169,15 @@ my %procedures = ( # # Note: including file: {whatever header file} # + # With Embarcadero C++Builder's preprocessor (cpp32.exe) the -Hp + # flag gives us the preprocessed output annotated with the following + # note whenever a #include file is read: + # + # Including ->->{whatever header file} + # + # where each "->" indicates the nesting level of the #include. The + # logic here is otherwise the same as the 'VC' case. + # # Since there's no object file name at all in that information, # we must construct it ourselves. @@ -180,13 +188,14 @@ my %procedures = ( # warnings, so we simply discard anything that doesn't start with # the Note: - if (/^Note: including file: */) { + if (/^Note: including file: */ or /^Including (->)*/) { (my $tail = $') =~ s/\s*\R$//; # VC gives us absolute paths for all include files, so to # remove system header dependencies, we need to check that - # they don't match $abs_srcdir or $abs_blddir. - $tail = canonpath($tail); + # they don't match $abs_srcdir or $abs_blddir. C++Builder gives + # us relative paths when possible, so convert to absolute paths. + $tail = rel2abs($tail); unless (defined $depconv_cache{$tail}) { my $dep = $tail; diff --git a/util/mkdef.pl b/util/mkdef.pl index a4772e9c8f..3207040e25 100755 --- a/util/mkdef.pl +++ b/util/mkdef.pl @@ -295,12 +295,16 @@ sub writer_windows { ; Definition file for the DLL version of the $libname library from OpenSSL ; -LIBRARY $libname +LIBRARY "$libname" EXPORTS _____ for (@_) { - print " ",$_->name(),"\n"; + print " ",$_->name(); + if (platform->can('export2internal')) { + print "=". platform->export2internal($_->name()); + } + print "\n"; } }