From 18891efdf4813547bc4e5b3791ac7af72fa277c8 Mon Sep 17 00:00:00 2001 From: klaus triendl Date: Thu, 19 Jan 2023 14:14:48 +0200 Subject: [PATCH] Added 'hybrid CRT' targets for the Windows platform Reviewed-by: Hugo Landau Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/20081) --- Configurations/50-win-hybridcrt.conf | 36 ++++++++++++++++++++++++++++ INSTALL.md | 5 ++-- NOTES-WINDOWS.md | 2 ++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 Configurations/50-win-hybridcrt.conf diff --git a/Configurations/50-win-hybridcrt.conf b/Configurations/50-win-hybridcrt.conf new file mode 100644 index 0000000000..2ddd25a42a --- /dev/null +++ b/Configurations/50-win-hybridcrt.conf @@ -0,0 +1,36 @@ +## -*- mode: perl; -*- +# Windows HybridCRT targets. +# +# https://github.com/microsoft/WindowsAppSDK/blob/77761e244289fda6b3d5f14c7bded189fed4fb89/docs/Coding-Guidelines/HybridCRT.md +# Link statically against the runtime and STL, but link dynamically against the CRT by ignoring the static CRT +# lib and instead linking against the Universal CRT DLL import library. This "Hybrid" linking mechanism is +# supported according to the CRT maintainer. Dynamic linking against the CRT makes the binaries a bit smaller +# than they would otherwise be if the CRT, runtime, and STL were all statically linked in. + + +sub remove_from_flags { + my ($toRemove, $flags) = @_; + + return $flags =~ s/$toRemove//r; +} + +my %targets = ( + "VC-WIN32-HYBRIDCRT" => { + inherit_from => [ "VC-WIN32" ], + cflags => sub { + remove_from_flags(qr/\/MDd?\s/, add(picker(debug => "/MTd", + release => "/MT"))->(@_)) + }, + lflags => add(picker(debug => "/NODEFAULTLIB:libucrtd.lib /DEFAULTLIB:ucrtd.lib", + release => "/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib")), + }, + "VC-WIN64A-HYBRIDCRT" => { + inherit_from => [ "VC-WIN64A" ], + cflags => sub { + remove_from_flags(qr/\/MDd?\s/, add(picker(debug => "/MTd", + release => "/MT"))->(@_)) + }, + lflags => add(picker(debug => "/NODEFAULTLIB:libucrtd.lib /DEFAULTLIB:ucrtd.lib", + release => "/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib")), + }, +); diff --git a/INSTALL.md b/INSTALL.md index ebde856a90..0fb8b27fe3 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -167,8 +167,9 @@ issue the following commands to build OpenSSL. As mentioned in the [Choices](#choices) section, you need to pick one of the four Configure targets in the first command. -Most likely you will be using the `VC-WIN64A` target for 64bit Windows -binaries (AMD64) or `VC-WIN32` for 32bit Windows binaries (X86). +Most likely you will be using the `VC-WIN64A`/`VC-WIN64A-HYBRIDCRT` target for +64bit Windows binaries (AMD64) or `VC-WIN32`/`VC-WIN32-HYBRIDCRT` for 32bit +Windows binaries (X86). The other two options are `VC-WIN64I` (Intel IA64, Itanium) and `VC-CE` (Windows CE) are rather uncommon nowadays. diff --git a/NOTES-WINDOWS.md b/NOTES-WINDOWS.md index 63264b5731..e6bf5414dc 100644 --- a/NOTES-WINDOWS.md +++ b/NOTES-WINDOWS.md @@ -77,6 +77,8 @@ Quick start - `perl Configure VC-WIN64A` if you want 64-bit OpenSSL or - `perl Configure VC-WIN64-ARM` if you want Windows on Arm (win-arm64) OpenSSL or + - `perl Configure VC-WIN32-HYBRIDCRT` + - `perl Configure VC-WIN64A-HYBRIDCRT` - `perl Configure` to let Configure figure out the platform 6. `nmake` -- 2.34.1