Browse code

contrib/vcpkg-ports: add openssl port with --no-autoload-config option set (CVE-2121-3606)

In default configuration OpenSSL loads config from
certain location on disk, for example

c:\vcpkg\packages\openssl_x64-windows\openvpn.cnf

which may pose a security risk.

There is "no-autoload-config" config option for OpenSSL
which disables this functionality:

https://github.com/openssl/openssl/pull/5959

however it is not "exported" to vcpkg.

This adds openssl port overlay which sets "no-autoload-config"
config option. Here is the diff (indented with "!" to avoid
confusing "git am"):

! diff --git a/ports/openssl/windows/portfile.cmake
! b/ports/openssl/windows/portfile.cmake
! index 7a3bf08ed..c873eb756 100644
! --- a/ports/openssl/windows/portfile.cmake
! +++ b/ports/openssl/windows/portfile.cmake
! @@ -21,6 +21,7 @@ set(CONFIGURE_OPTIONS
! enable-capieng
! no-ssl2
! no-tests
! + no-autoload-config
! -utf-8
! ${OPENSSL_SHARED}
! )

There is also corresponsing PR to vcpkg:

https://github.com/microsoft/vcpkg/pull/18389

When above PR is merged, this port overlay can be removed.

CVE: 2121-3606
Signed-off-by: Lev Stipakov <lev@openvpn.net>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <20210617061259.297-1-lstipakov@gmail.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg22569.html

Lev Stipakov authored on 2021/06/17 15:12:59
Showing 12 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,25 @@
0
+if(EXISTS "${CURRENT_INSTALLED_DIR}/include/openssl/ssl.h")
1
+  message(FATAL_ERROR "Can't build openssl if libressl/boringssl is installed. Please remove libressl/boringssl, and try install openssl again if you need it.")
2
+endif()
3
+
4
+set(OPENSSL_VERSION 1.1.1k)
5
+vcpkg_download_distfile(ARCHIVE
6
+    URLS "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" "https://www.openssl.org/source/old/1.1.1/openssl-${OPENSSL_VERSION}.tar.gz"
7
+    FILENAME "openssl-${OPENSSL_VERSION}.tar.gz"
8
+    SHA512 73cd042d4056585e5a9dd7ab68e7c7310a3a4c783eafa07ab0b560e7462b924e4376436a6d38a155c687f6942a881cfc0c1b9394afcde1d8c46bf396e7d51121
9
+)
10
+
11
+vcpkg_find_acquire_program(PERL)
12
+get_filename_component(PERL_EXE_PATH ${PERL} DIRECTORY)
13
+vcpkg_add_to_path("${PERL_EXE_PATH}")
14
+
15
+if(VCPKG_TARGET_IS_UWP)
16
+    include("${CMAKE_CURRENT_LIST_DIR}/uwp/portfile.cmake")
17
+elseif(VCPKG_TARGET_IS_WINDOWS AND NOT VCPKG_TARGET_IS_MINGW)
18
+    include("${CMAKE_CURRENT_LIST_DIR}/windows/portfile.cmake")
19
+else()
20
+    include("${CMAKE_CURRENT_LIST_DIR}/unix/portfile.cmake")
21
+endif()
22
+
23
+
24
+file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")
0 25
new file mode 100644
... ...
@@ -0,0 +1,280 @@
0
+cmake_minimum_required(VERSION 3.9)
1
+project(openssl C)
2
+
3
+if(NOT SOURCE_PATH)
4
+    message(FATAL_ERROR "Requires SOURCE_PATH")
5
+endif()
6
+
7
+if(CMAKE_SYSTEM_NAME STREQUAL "Android" OR CMAKE_SYSTEM_NAME STREQUAL "Linux")
8
+    if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
9
+        set(PLATFORM linux-x86_64)
10
+    else()
11
+        set(PLATFORM linux-generic32)
12
+    endif()
13
+elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS")
14
+    if(VCPKG_TARGET_ARCHITECTURE MATCHES "arm64")
15
+        set(PLATFORM ios64-xcrun)
16
+    elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "arm")
17
+        set(PLATFORM ios-xcrun)
18
+    elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "x86" OR
19
+           VCPKG_TARGET_ARCHITECTURE MATCHES "x64")
20
+        set(PLATFORM iossimulator-xcrun)
21
+    else()
22
+        message(FATAL_ERROR "Unknown iOS target architecture: ${VCPKG_TARGET_ARCHITECTURE}")
23
+    endif()
24
+    # disable that makes linkage error (e.g. require stderr usage)
25
+    list(APPEND DISABLES no-stdio no-ui no-asm)
26
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
27
+    if(VCPKG_TARGET_ARCHITECTURE MATCHES "arm64")
28
+        set(PLATFORM darwin64-arm64-cc)
29
+    else()
30
+        set(PLATFORM darwin64-x86_64-cc)
31
+    endif()
32
+elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
33
+    set(PLATFORM BSD-generic64)
34
+elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
35
+    set(PLATFORM BSD-generic64)
36
+elseif(MINGW)
37
+    if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
38
+        set(PLATFORM mingw64)
39
+    else()
40
+        set(PLATFORM mingw)
41
+    endif()
42
+elseif(EMSCRIPTEN)
43
+    set(MAKE $ENV{EMSDK}/upstream/emscripten/emmake)
44
+    set(ENV{MAKE} $ENV{EMSDK}/upstream/emscripten/emmake)
45
+else()
46
+    message(FATAL_ERROR "Unknown platform")
47
+endif()
48
+
49
+get_filename_component(COMPILER_ROOT "${CMAKE_C_COMPILER}" DIRECTORY)
50
+
51
+message("CMAKE_C_COMPILER=${CMAKE_C_COMPILER}")
52
+message("COMPILER_ROOT=${COMPILER_ROOT}")
53
+message("CMAKE_SYSROOT=${CMAKE_SYSROOT}")
54
+message("CMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT}")
55
+message("CMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}")
56
+message("CMAKE_C_FLAGS=${CMAKE_C_FLAGS}")
57
+message("CMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}")
58
+message("CMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}")
59
+message("CMAKE_INCLUDE_SYSTEM_FLAG_C=${CMAKE_INCLUDE_SYSTEM_FLAG_C}")
60
+message("CMAKE_C_OSX_DEPLOYMENT_TARGET_FLAG=${CMAKE_C_OSX_DEPLOYMENT_TARGET_FLAG}")
61
+
62
+set(CFLAGS "${CMAKE_C_FLAGS}")
63
+if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
64
+    set(CFLAGS "-Wno-error=unused-command-line-argument ${CMAKE_C_FLAGS}")
65
+endif()
66
+if(CMAKE_C_COMPILER_TARGET AND CMAKE_C_COMPILE_OPTIONS_TARGET)
67
+    set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_TARGET}${CMAKE_C_COMPILER_TARGET}")
68
+endif()
69
+if(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN AND CMAKE_C_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN)
70
+    set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}${CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN}")
71
+endif()
72
+if(CMAKE_SYSROOT AND CMAKE_C_COMPILE_OPTIONS_SYSROOT)
73
+    set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_SYSROOT}${CMAKE_SYSROOT}")
74
+elseif(CMAKE_OSX_SYSROOT AND CMAKE_C_COMPILE_OPTIONS_SYSROOT)
75
+    set(CFLAGS "${CFLAGS} ${CMAKE_C_COMPILE_OPTIONS_SYSROOT}${CMAKE_OSX_SYSROOT}")
76
+endif()
77
+if (CMAKE_OSX_DEPLOYMENT_TARGET AND CMAKE_C_OSX_DEPLOYMENT_TARGET_FLAG)
78
+    set(CFLAGS "${CFLAGS} ${CMAKE_C_OSX_DEPLOYMENT_TARGET_FLAG}${CMAKE_OSX_DEPLOYMENT_TARGET}")
79
+endif()
80
+
81
+string(REGEX REPLACE "^ " "" CFLAGS "${CFLAGS}")
82
+
83
+if(CMAKE_HOST_WIN32)
84
+    file(TO_NATIVE_PATH ENV_PATH "${COMPILER_ROOT};$ENV{PATH}")
85
+else()
86
+    file(TO_NATIVE_PATH ENV_PATH "${COMPILER_ROOT}:$ENV{PATH}")
87
+endif()
88
+set(ENV{ANDROID_DEV} "${CMAKE_SYSROOT}/usr")
89
+
90
+if(NOT IOS)
91
+    set(ENV{CC} "${CMAKE_C_COMPILER}")
92
+endif()
93
+
94
+message("ENV{ANDROID_DEV}=$ENV{ANDROID_DEV}")
95
+
96
+get_filename_component(SOURCE_PATH_NAME "${SOURCE_PATH}" NAME)
97
+set(BUILDDIR "${CMAKE_CURRENT_BINARY_DIR}/${SOURCE_PATH_NAME}")
98
+
99
+if(NOT EXISTS "${BUILDDIR}")
100
+    file(COPY ${SOURCE_PATH} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
101
+endif()
102
+
103
+get_filename_component(MSYS_BIN_DIR "${MAKE}" DIRECTORY)
104
+
105
+if(BUILD_SHARED_LIBS)
106
+    set(SHARED shared)
107
+    file(STRINGS "${BUILDDIR}/include/openssl/opensslv.h" SHLIB_VERSION
108
+        REGEX "^#[\t ]*define[\t ]+SHLIB_VERSION_NUMBER[\t ]+\".*\".*")
109
+    string(REGEX REPLACE "^.*SHLIB_VERSION_NUMBER[\t ]+\"([^\"]*)\".*$" "\\1"
110
+        SHLIB_VERSION "${SHLIB_VERSION}")
111
+    if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "iOS")
112
+        set(LIB_EXT dylib)
113
+        set(LIB_EXTS ${SHLIB_VERSION}.${LIB_EXT})
114
+    elseif(MINGW)
115
+        string(REPLACE "." "_" SHLIB_VERSION "${SHLIB_VERSION}")
116
+        set(BIN_EXT dll)
117
+        set(LIB_EXT dll.a)
118
+    else()
119
+        set(LIB_EXT so)
120
+        set(LIB_EXTS ${LIB_EXT}.${SHLIB_VERSION})
121
+    endif()
122
+    list(APPEND BIN_EXTS ${BIN_EXT})
123
+    list(APPEND LIB_EXTS ${LIB_EXT})
124
+else()
125
+    set(SHARED no-shared)
126
+    set(LIB_EXTS a)
127
+endif()
128
+foreach(lib ssl crypto)
129
+    foreach(ext ${LIB_EXTS})
130
+        list(APPEND INSTALL_LIBS "${BUILDDIR}/lib${lib}.${ext}")
131
+        list(APPEND INSTALL_PKG_CONFIGS "${BUILDDIR}/lib${lib}.pc")
132
+    endforeach()
133
+    foreach(ext ${BIN_EXTS})
134
+    # This might be wrong for targets which don't follow this naming scheme, but I'm not aware of any
135
+        if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
136
+            list(APPEND INSTALL_BINS "${BUILDDIR}/lib${lib}-${SHLIB_VERSION}-x64.${ext}")
137
+        else()
138
+            list(APPEND INSTALL_BINS "${BUILDDIR}/lib${lib}-${SHLIB_VERSION}.${ext}")
139
+        endif()
140
+    endforeach()
141
+endforeach()
142
+
143
+if(CMAKE_HOST_WIN32)
144
+    set(ENV_COMMAND set)
145
+    set(PATH_VAR ";%PATH%")
146
+else()
147
+    set(ENV_COMMAND export)
148
+    set(PATH_VAR ":$ENV{PATH}")
149
+endif()
150
+
151
+add_custom_command(
152
+        OUTPUT "${BUILDDIR}/Makefile"
153
+        COMMAND ${ENV_COMMAND} "PATH=${MSYS_BIN_DIR}${PATH_VAR}"
154
+        VERBATIM
155
+        WORKING_DIRECTORY "${BUILDDIR}"
156
+)
157
+
158
+if(NOT IOS)
159
+    add_custom_command(
160
+        OUTPUT "${BUILDDIR}/Makefile"
161
+        COMMAND ${ENV_COMMAND} CC=${CMAKE_C_COMPILER}
162
+        COMMAND ${ENV_COMMAND} AR=${CMAKE_AR}
163
+        COMMAND ${ENV_COMMAND} LD=${CMAKE_LINKER}
164
+        COMMAND ${ENV_COMMAND} RANLIB=${CMAKE_RANLIB}
165
+        COMMAND ${ENV_COMMAND} MAKE=${MAKE}
166
+        COMMAND ${ENV_COMMAND} MAKEDEPPROG=${CMAKE_C_COMPILER}
167
+        VERBATIM
168
+        APPEND
169
+    )
170
+
171
+    if(EMSCRIPTEN)
172
+        list(APPEND DISABLES
173
+                threads
174
+                no-engine
175
+                no-dso
176
+                no-asm
177
+                no-shared
178
+                no-sse2
179
+                no-srtp
180
+                )
181
+    else()
182
+        list(APPEND DISABLES
183
+                enable-static-engine
184
+                no-zlib
185
+                no-ssl2
186
+                no-idea
187
+                no-cast
188
+                no-seed
189
+                no-md2
190
+                no-tests)
191
+    endif()
192
+endif()
193
+
194
+if(EMSCRIPTEN)
195
+    add_custom_command(
196
+            OUTPUT "${BUILDDIR}/Makefile"
197
+            COMMAND "$ENV{EMSDK}/upstream/emscripten/emconfigure" ./config
198
+            ${SHARED}
199
+            ${DISABLES}
200
+            "--prefix=${CMAKE_INSTALL_PREFIX}"
201
+            "--openssldir=/etc/ssl"
202
+            "--cross-compile-prefix=\"/\""
203
+            VERBATIM
204
+            APPEND
205
+    )
206
+
207
+    add_custom_target(build_libs ALL
208
+            COMMAND ${ENV_COMMAND} "PATH=${MSYS_BIN_DIR}${PATH_VAR}"
209
+            COMMAND "${CMAKE_COMMAND}" -E touch "${BUILDDIR}/krb5.h"
210
+            COMMAND "${MAKE}" make build_libs
211
+            VERBATIM
212
+            WORKING_DIRECTORY "${BUILDDIR}"
213
+            DEPENDS "${BUILDDIR}/Makefile"
214
+            BYPRODUCTS ${INSTALL_LIBS}
215
+            )
216
+else()
217
+    add_custom_command(
218
+            OUTPUT "${BUILDDIR}/Makefile"
219
+            COMMAND "${PERL}" Configure
220
+            ${SHARED}
221
+            ${DISABLES}
222
+            ${PLATFORM}
223
+            "--prefix=${CMAKE_INSTALL_PREFIX}"
224
+            "--openssldir=/etc/ssl"
225
+            ${CFLAGS}
226
+            VERBATIM
227
+            APPEND
228
+    )
229
+
230
+    add_custom_target(build_libs ALL
231
+            COMMAND ${ENV_COMMAND} "PATH=${MSYS_BIN_DIR}${PATH_VAR}"
232
+            COMMAND "${CMAKE_COMMAND}" -E touch "${BUILDDIR}/krb5.h"
233
+            COMMAND "${MAKE}" -j ${VCPKG_CONCURRENCY} build_libs
234
+            VERBATIM
235
+            WORKING_DIRECTORY "${BUILDDIR}"
236
+            DEPENDS "${BUILDDIR}/Makefile"
237
+            BYPRODUCTS ${INSTALL_LIBS}
238
+            )
239
+endif()
240
+
241
+add_custom_command(
242
+        OUTPUT "${BUILDDIR}/Makefile"
243
+        COMMAND "${CMAKE_COMMAND}" "-DDIR=${BUILDDIR}" -P "${CMAKE_CURRENT_LIST_DIR}/remove-deps.cmake"
244
+        VERBATIM
245
+        APPEND
246
+)
247
+
248
+if((CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "iOS") AND BUILD_SHARED_LIBS)
249
+    if(DEFINED CMAKE_INSTALL_NAME_DIR)
250
+        set(ID_PREFIX "${CMAKE_INSTALL_NAME_DIR}")
251
+    else()
252
+        set(ID_PREFIX "@rpath")
253
+    endif()
254
+
255
+    add_custom_command(
256
+        TARGET build_libs
257
+        COMMAND /usr/bin/install_name_tool -id "${ID_PREFIX}/libssl.${SHLIB_VERSION}.dylib"
258
+                                               "${BUILDDIR}/libssl.${SHLIB_VERSION}.dylib"
259
+        COMMAND /usr/bin/install_name_tool -id "${ID_PREFIX}/libcrypto.${SHLIB_VERSION}.dylib"
260
+                                               "${BUILDDIR}/libcrypto.1.1.dylib"
261
+        COMMAND /usr/bin/install_name_tool -change "${CMAKE_INSTALL_PREFIX}/lib/libcrypto.${SHLIB_VERSION}.dylib"
262
+                                                   "${ID_PREFIX}/libcrypto.${SHLIB_VERSION}.dylib"
263
+                                                   "${BUILDDIR}/libssl.${SHLIB_VERSION}.dylib"
264
+        VERBATIM
265
+    )
266
+endif()
267
+
268
+install(
269
+    FILES ${INSTALL_LIBS}
270
+    DESTINATION lib
271
+)
272
+install(
273
+    FILES ${INSTALL_BINS}
274
+    DESTINATION bin
275
+)
276
+install(
277
+    FILES ${INSTALL_PKG_CONFIGS}
278
+    DESTINATION lib/pkgconfig
279
+)
0 280
new file mode 100644
... ...
@@ -0,0 +1,49 @@
0
+if (NOT VCPKG_TARGET_IS_MINGW)
1
+    vcpkg_fail_port_install(MESSAGE "${PORT} is only for openssl on Unix-like systems" ON_TARGET "UWP" "Windows")
2
+endif()
3
+
4
+vcpkg_extract_source_archive_ex(
5
+    OUT_SOURCE_PATH MASTER_COPY_SOURCE_PATH
6
+    ARCHIVE "${ARCHIVE}"
7
+    REF ${OPENSSL_VERSION}
8
+)
9
+
10
+if(CMAKE_HOST_WIN32)
11
+    vcpkg_acquire_msys(MSYS_ROOT PACKAGES make perl)
12
+    set(MAKE ${MSYS_ROOT}/usr/bin/make.exe)
13
+    set(PERL ${MSYS_ROOT}/usr/bin/perl.exe)
14
+else()
15
+    find_program(MAKE make)
16
+    if(NOT MAKE)
17
+        message(FATAL_ERROR "Could not find make. Please install it through your package manager.")
18
+    endif()
19
+endif()
20
+
21
+vcpkg_configure_cmake(
22
+    SOURCE_PATH ${CMAKE_CURRENT_LIST_DIR}
23
+    PREFER_NINJA
24
+    OPTIONS
25
+        -DSOURCE_PATH=${MASTER_COPY_SOURCE_PATH}
26
+        -DPERL=${PERL}
27
+        -DMAKE=${MAKE}
28
+        -DVCPKG_CONCURRENCY=${VCPKG_CONCURRENCY}
29
+    OPTIONS_RELEASE
30
+        -DINSTALL_HEADERS=ON
31
+)
32
+
33
+vcpkg_install_cmake()
34
+vcpkg_fixup_pkgconfig()
35
+
36
+file(GLOB HEADERS ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel/*/include/openssl/*.h)
37
+set(RESOLVED_HEADERS)
38
+foreach(HEADER ${HEADERS})
39
+    get_filename_component(X "${HEADER}" REALPATH)
40
+    list(APPEND RESOLVED_HEADERS "${X}")
41
+endforeach()
42
+
43
+file(INSTALL ${RESOLVED_HEADERS} DESTINATION ${CURRENT_PACKAGES_DIR}/include/openssl)
44
+file(INSTALL ${MASTER_COPY_SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/${PORT} RENAME copyright)
45
+
46
+if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
47
+    file(COPY ${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/openssl)
48
+endif()
0 49
new file mode 100644
... ...
@@ -0,0 +1,7 @@
0
+file(GLOB_RECURSE MAKEFILES ${DIR}/*/Makefile)
1
+foreach(MAKEFILE ${MAKEFILES})
2
+    message("removing deps from ${MAKEFILE}")
3
+    file(READ "${MAKEFILE}" _contents)
4
+    string(REGEX REPLACE "\n# DO NOT DELETE THIS LINE.*" "" _contents "${_contents}")
5
+    file(WRITE "${MAKEFILE}" "${_contents}")
6
+endforeach()
0 7
new file mode 100644
... ...
@@ -0,0 +1,18 @@
0
+_find_package(${ARGS})
1
+if(OPENSSL_FOUND)
2
+    find_library(OPENSSL_DL_LIBRARY NAMES dl)
3
+    if(OPENSSL_DL_LIBRARY)
4
+        list(APPEND OPENSSL_LIBRARIES "dl")
5
+        if(TARGET OpenSSL::Crypto)
6
+            set_property(TARGET OpenSSL::Crypto APPEND PROPERTY INTERFACE_LINK_LIBRARIES "dl")
7
+        endif()
8
+    endif()
9
+    find_package(Threads REQUIRED)
10
+    list(APPEND OPENSSL_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
11
+    if(TARGET OpenSSL::Crypto)
12
+        set_property(TARGET OpenSSL::Crypto APPEND PROPERTY INTERFACE_LINK_LIBRARIES "Threads::Threads")
13
+    endif()
14
+    if(TARGET OpenSSL::SSL)
15
+        set_property(TARGET OpenSSL::SSL APPEND PROPERTY INTERFACE_LINK_LIBRARIES "Threads::Threads")
16
+    endif()
17
+endif()
0 18
new file mode 100644
... ...
@@ -0,0 +1,4 @@
0
+The package openssl is compatible with built-in CMake targets:
1
+
2
+    find_package(OpenSSL REQUIRED)
3
+    target_link_libraries(main PRIVATE OpenSSL::SSL OpenSSL::Crypto)
0 4
new file mode 100644
... ...
@@ -0,0 +1,170 @@
0
+diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf
1
+index 3c4299d264..99fcb1f713 100644
2
+--- a/Configurations/10-main.conf
3
+@@ -1287,7 +1287,7 @@ my %targets = (
4
+     },
5
+     "VC-WIN64I" => {
6
+         inherit_from     => [ "VC-WIN64-common", asm("ia64_asm"),
7
+-                              sub { $disabled{shared} ? () : "ia64_uplink" } ],
8
++                              sub { $disabled{uplink} ? () : "ia64_uplink" } ],
9
+         AS               => "ias",
10
+         ASFLAGS          => "-d debug",
11
+         asoutflag        => "-o ",
12
+@@ -1299,7 +1299,7 @@ my %targets = (
13
+     },
14
+     "VC-WIN64A" => {
15
+         inherit_from     => [ "VC-WIN64-common", asm("x86_64_asm"),
16
+-                              sub { $disabled{shared} ? () : "x86_64_uplink" } ],
17
++                              sub { $disabled{uplink} ? () : "x86_64_uplink" } ],
18
+         AS               => sub { vc_win64a_info()->{AS} },
19
+         ASFLAGS          => sub { vc_win64a_info()->{ASFLAGS} },
20
+         asoutflag        => sub { vc_win64a_info()->{asoutflag} },
21
+@@ -1312,7 +1312,7 @@ my %targets = (
22
+     },
23
+     "VC-WIN32" => {
24
+         inherit_from     => [ "VC-noCE-common", asm("x86_asm"),
25
+-                              sub { $disabled{shared} ? () : "uplink_common" } ],
26
++                              sub { $disabled{uplink} ? () : "uplink_common" } ],
27
+         AS               => sub { vc_win32_info()->{AS} },
28
+         ASFLAGS          => sub { vc_win32_info()->{ASFLAGS} },
29
+         asoutflag        => sub { vc_win32_info()->{asoutflag} },
30
+@@ -1374,7 +1374,7 @@ my %targets = (
31
+ #### MinGW
32
+     "mingw" => {
33
+         inherit_from     => [ "BASE_unix", asm("x86_asm"),
34
+-                              sub { $disabled{shared} ? () : "x86_uplink" } ],
35
++                              sub { $disabled{uplink} ? () : "x86_uplink" } ],
36
+         CC               => "gcc",
37
+         CFLAGS           => picker(default => "-Wall",
38
+                                    debug   => "-g -O0",
39
+diff --git a/Configurations/50-win-onecore.conf b/Configurations/50-win-onecore.conf
40
+index d478f42b0f..e0fb70daca 100644
41
+--- a/Configurations/50-win-onecore.conf
42
+@@ -1,3 +1,4 @@
43
++## -*- mode: perl; -*-
44
+ # Windows OneCore targets.
45
+ #
46
+ # OneCore is new API stability "contract" that transcends Desktop, IoT and
47
+@@ -10,6 +11,25 @@
48
+ # TODO: extend error handling to use ETW based eventing
49
+ # (Or rework whole error messaging)
50
+ 
51
++my $UWP_info = {};
52
++sub UWP_info {
53
++    unless (%$UWP_info) {
54
++        my $SDKver = `pwsh.exe -Command  \"& {\$(Get-Item \\\"hklm:\\SOFTWARE\\WOW6432Node\\Microsoft\\Microsoft SDKs\\Windows\\\").GetValue(\\\"CurrentVersion\\\")}\"`;
55
++        $SDKver =~ s|\R$||;
56
++        my @SDKver_split = split(/\./, $SDKver);
57
++        # SDK version older than 10.0.17763 don't support our ASM builds
58
++        if ($SDKver_split[0] < 10
59
++            || ($SDKver_split[0] == 10
60
++                && $SDKver_split[1] == 0
61
++                && $SDKver_split[2] < 17763)) {
62
++            $UWP_info->{disable} = [ 'asm' ];
63
++        } else {
64
++            $UWP_info->{disable} = [ ];
65
++        }
66
++    }
67
++    return $UWP_info;
68
++}
69
++
70
+ my %targets = (
71
+     "VC-WIN32-ONECORE" => {
72
+         inherit_from    => [ "VC-WIN32" ],
73
+@@ -61,4 +81,57 @@ my %targets = (
74
+         ex_libs         => "onecore.lib",
75
+         multilib        => "-arm64",
76
+     },
77
++
78
++    # Universal Windows Platform (UWP) App Support
79
++
80
++    # TODO
81
++    #
82
++    # The 'disable' attribute should have 'uplink'.
83
++    # however, these are checked in some 'inherit_from', which is processed
84
++    # very early, before the 'disable' attributes are seen.
85
++    # This is a problem that needs to be resolved in Configure first.
86
++    #
87
++    # But if you want to build library with Windows 10 Version 1809 SDK or
88
++    # earlier, the 'disable' attribute should also have 'asm'.
89
++
90
++    "VC-WIN32-UWP" => {
91
++        inherit_from    => [ "VC-WIN32-ONECORE" ],
92
++        lflags          => add("/APPCONTAINER"),
93
++        defines         => add("WINAPI_FAMILY=WINAPI_FAMILY_APP",
94
++                               "_WIN32_WINNT=0x0A00"),
95
++        dso_scheme      => "",
96
++        disable         => sub { [ 'ui-console', 'stdio', 'async', 'uplink',
97
++                                   @{ UWP_info()->{disable} } ] },
98
++        ex_libs         => "WindowsApp.lib",
99
++    },
100
++     "VC-WIN64A-UWP" => {
101
++        inherit_from    => [ "VC-WIN64A-ONECORE" ],
102
++        lflags          => add("/APPCONTAINER"),
103
++        defines         => add("WINAPI_FAMILY=WINAPI_FAMILY_APP",
104
++                               "_WIN32_WINNT=0x0A00"),
105
++        dso_scheme      => "",
106
++        disable         => sub { [ 'ui-console', 'stdio', 'async', 'uplink',
107
++                                   @{ UWP_info()->{disable} } ] },
108
++        ex_libs         => "WindowsApp.lib",
109
++    },
110
++    "VC-WIN32-ARM-UWP" => {
111
++        inherit_from    => [ "VC-WIN32-ARM" ],
112
++        lflags          => add("/APPCONTAINER"),
113
++        defines         => add("WINAPI_FAMILY=WINAPI_FAMILY_APP",
114
++                               "_WIN32_WINNT=0x0A00"),
115
++        dso_scheme      => "",
116
++        disable         => sub { [ 'ui-console', 'stdio', 'async', 'uplink',
117
++                                   @{ UWP_info()->{disable} } ] },
118
++        ex_libs         => "WindowsApp.lib",
119
++    },
120
++     "VC-WIN64-ARM-UWP" => {
121
++        inherit_from    => [ "VC-WIN64-ARM" ],
122
++        lflags          => add("/APPCONTAINER"),
123
++        defines         => add("WINAPI_FAMILY=WINAPI_FAMILY_APP",
124
++                               "_WIN32_WINNT=0x0A00"),
125
++        dso_scheme      => "",
126
++        disable         => sub { [ 'ui-console', 'stdio', 'async', 'uplink',
127
++                                   @{ UWP_info()->{disable} } ] },
128
++        ex_libs         => "WindowsApp.lib",
129
++    },
130
+ );
131
+diff --git a/Configure b/Configure
132
+index 5a699836f3..de45f1e299 100755
133
+--- a/Configure
134
+@@ -407,6 +408,7 @@ my @disablables = (
135
+     "ubsan",
136
+     "ui-console",
137
+     "unit-test",
138
++    "uplink",
139
+     "whirlpool",
140
+     "weak-ssl-ciphers",
141
+     "zlib",
142
+@@ -491,8 +493,8 @@ my @disable_cascades = (
143
+ 
144
+     # Without position independent code, there can be no shared libraries or DSOs
145
+     "pic"               => [ "shared" ],
146
+-    "shared"            => [ "dynamic-engine" ],
147
++    "shared"            => [ "dynamic-engine", "uplink" ],
148
+     "dso"               => [ "dynamic-engine" ],
149
+     "engine"            => [ "afalgeng", "devcryptoeng" ],
150
+ 
151
+     # no-autoalginit is only useful when building non-shared
152
+diff --git a/INSTALL b/INSTALL
153
+index 2119cbae9e..ee54e8c215 100644
154
+--- a/INSTALL
155
+@@ -560,6 +560,10 @@
156
+                    likely to complement configuration command line with
157
+                    suitable compiler-specific option.
158
+ 
159
++  no-uplink
160
++                   Don't build support for UPLINK interface.
161
++
162
++
163
+   no-<prot>
164
+                    Don't build support for negotiating the specified SSL/TLS
165
+                    protocol (one of ssl, ssl3, tls, tls1, tls1_1, tls1_2,
0 166
new file mode 100644
... ...
@@ -0,0 +1,16 @@
0
+set build=%1
1
+
2
+perl Configure no-asm no-hw no-dso VC-WINUNIVERSAL -FS -FIWindows.h
3
+
4
+for /D %%f in ("%WindowsSdkDir%References\%WindowsSDKLibVersion%Windows.Foundation.FoundationContract\*") do set LibPath=%LibPath%;%%f\
5
+for /D %%f in ("%WindowsSdkDir%References\%WindowsSDKLibVersion%Windows.Foundation.UniversalApiContract\*") do set LibPath=%LibPath%;%%f\
6
+for /D %%f in ("%WindowsSdkDir%References\Windows.Foundation.FoundationContract\*") do set LibPath=%LibPath%;%%f\
7
+for /D %%f in ("%WindowsSdkDir%References\Windows.Foundation.UniversalApiContract\*") do set LibPath=%LibPath%;%%f\
8
+
9
+call ms\do_winuniversal.bat
10
+
11
+mkdir inc32\openssl
12
+
13
+jom -j %NUMBER_OF_PROCESSORS% -k -f ms\ntdll.mak
14
+REM due to a race condition in the build, we need to have a second single-threaded pass.
15
+nmake -f ms\ntdll.mak
0 16
new file mode 100644
... ...
@@ -0,0 +1,156 @@
0
+vcpkg_fail_port_install(MESSAGE "${PORT} is only for Windows Universal Platform" ON_TARGET "Linux" "OSX")
1
+
2
+vcpkg_check_linkage(ONLY_DYNAMIC_LIBRARY)
3
+
4
+vcpkg_find_acquire_program(JOM)
5
+get_filename_component(JOM_EXE_PATH ${JOM} DIRECTORY)
6
+vcpkg_add_to_path("${PERL_EXE_PATH}")
7
+
8
+vcpkg_extract_source_archive_ex(
9
+  OUT_SOURCE_PATH SOURCE_PATH
10
+  ARCHIVE ${ARCHIVE}
11
+  PATCHES
12
+    uwp/EnableUWPSupport.patch
13
+)
14
+
15
+vcpkg_find_acquire_program(NASM)
16
+get_filename_component(NASM_EXE_PATH ${NASM} DIRECTORY)
17
+vcpkg_add_to_path(PREPEND "${NASM_EXE_PATH}")
18
+
19
+set(CONFIGURE_COMMAND ${PERL} Configure
20
+    enable-static-engine
21
+    enable-capieng
22
+    no-unit-test
23
+    no-ssl2
24
+    no-asm
25
+    no-uplink
26
+    no-tests
27
+    -utf-8
28
+    shared
29
+)
30
+
31
+if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
32
+    set(OPENSSL_ARCH VC-WIN32-UWP)
33
+elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
34
+    set(OPENSSL_ARCH VC-WIN64A-UWP)
35
+elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm")
36
+    set(OPENSSL_ARCH VC-WIN32-ARM-UWP)
37
+elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64")
38
+    set(OPENSSL_ARCH VC-WIN64-ARM-UWP)
39
+else()
40
+    message(FATAL_ERROR "Unsupported target architecture: ${VCPKG_TARGET_ARCHITECTURE}")
41
+endif()
42
+
43
+set(OPENSSL_MAKEFILE "makefile")
44
+
45
+file(REMOVE_RECURSE ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel ${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg)
46
+
47
+
48
+if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
49
+
50
+    # Copy openssl sources.
51
+    message(STATUS "Copying openssl release source files...")
52
+    file(GLOB OPENSSL_SOURCE_FILES "${SOURCE_PATH}/*")
53
+    foreach(SOURCE_FILE ${OPENSSL_SOURCE_FILES})
54
+        file(COPY ${SOURCE_FILE} DESTINATION "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")
55
+    endforeach()
56
+    message(STATUS "Copying openssl release source files... done")
57
+    set(SOURCE_PATH_RELEASE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")
58
+
59
+    set(OPENSSLDIR_RELEASE "${CURRENT_PACKAGES_DIR}")
60
+
61
+    message(STATUS "Configure ${TARGET_TRIPLET}-rel")
62
+    vcpkg_execute_required_process(
63
+        COMMAND ${CONFIGURE_COMMAND} ${OPENSSL_ARCH} "--prefix=${OPENSSLDIR_RELEASE}" "--openssldir=${OPENSSLDIR_RELEASE}" -FS
64
+        WORKING_DIRECTORY "${SOURCE_PATH_RELEASE}"
65
+        LOGNAME configure-perl-${TARGET_TRIPLET}-${VCPKG_BUILD_TYPE}-rel
66
+    )
67
+    message(STATUS "Configure ${TARGET_TRIPLET}-rel done")
68
+
69
+    message(STATUS "Build ${TARGET_TRIPLET}-rel")
70
+    # Openssl's buildsystem has a race condition which will cause JOM to fail at some point.
71
+    # This is ok; we just do as much work as we can in parallel first, then follow up with a single-threaded build.
72
+    make_directory(${SOURCE_PATH_RELEASE}/inc32/openssl)
73
+    execute_process(
74
+        COMMAND "${JOM}" -k -j ${VCPKG_CONCURRENCY} -f "${OPENSSL_MAKEFILE}" build_libs
75
+        WORKING_DIRECTORY "${SOURCE_PATH_RELEASE}"
76
+        OUTPUT_FILE "${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-0-out.log"
77
+        ERROR_FILE "${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-0-err.log"
78
+    )
79
+    vcpkg_execute_required_process(
80
+        COMMAND nmake -f "${OPENSSL_MAKEFILE}" install_dev
81
+        WORKING_DIRECTORY "${SOURCE_PATH_RELEASE}"
82
+        LOGNAME build-${TARGET_TRIPLET}-rel-1)
83
+
84
+    message(STATUS "Build ${TARGET_TRIPLET}-rel done")
85
+endif()
86
+
87
+
88
+if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
89
+    # Copy openssl sources.
90
+    message(STATUS "Copying openssl debug source files...")
91
+    file(GLOB OPENSSL_SOURCE_FILES ${SOURCE_PATH}/*)
92
+    foreach(SOURCE_FILE ${OPENSSL_SOURCE_FILES})
93
+        file(COPY "${SOURCE_FILE}" DESTINATION "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
94
+    endforeach()
95
+    message(STATUS "Copying openssl debug source files... done")
96
+    set(SOURCE_PATH_DEBUG "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
97
+
98
+    set(OPENSSLDIR_DEBUG "${CURRENT_PACKAGES_DIR}/debug")
99
+
100
+    message(STATUS "Configure ${TARGET_TRIPLET}-dbg")
101
+    vcpkg_execute_required_process(
102
+        COMMAND ${CONFIGURE_COMMAND} debug-${OPENSSL_ARCH} "--prefix=${OPENSSLDIR_DEBUG}" "--openssldir=${OPENSSLDIR_DEBUG}" -FS
103
+        WORKING_DIRECTORY "${SOURCE_PATH_DEBUG}"
104
+        LOGNAME configure-perl-${TARGET_TRIPLET}-${VCPKG_BUILD_TYPE}-dbg
105
+    )
106
+    message(STATUS "Configure ${TARGET_TRIPLET}-dbg done")
107
+
108
+    message(STATUS "Build ${TARGET_TRIPLET}-dbg")
109
+    make_directory("${SOURCE_PATH_DEBUG}/inc32/openssl")
110
+    execute_process(
111
+        COMMAND "${JOM}" -k -j ${VCPKG_CONCURRENCY} -f "${OPENSSL_MAKEFILE}" build_libs
112
+        WORKING_DIRECTORY "${SOURCE_PATH_DEBUG}"
113
+        OUTPUT_FILE "${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-dbg-0-out.log"
114
+        ERROR_FILE "${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-dbg-0-err.log"
115
+    )
116
+    vcpkg_execute_required_process(
117
+        COMMAND nmake -f "${OPENSSL_MAKEFILE}" install_dev
118
+        WORKING_DIRECTORY "${SOURCE_PATH_DEBUG}"
119
+        LOGNAME build-${TARGET_TRIPLET}-dbg-1)
120
+
121
+    message(STATUS "Build ${TARGET_TRIPLET}-dbg done")
122
+endif()
123
+
124
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/certs")
125
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/private")
126
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/lib/engines-1_1")
127
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/certs")
128
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/lib/engines-1_1")
129
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/private")
130
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
131
+
132
+file(REMOVE
133
+    "${CURRENT_PACKAGES_DIR}/bin/openssl.exe"
134
+    "${CURRENT_PACKAGES_DIR}/debug/bin/openssl.exe"
135
+    "${CURRENT_PACKAGES_DIR}/debug/openssl.cnf"
136
+    "${CURRENT_PACKAGES_DIR}/openssl.cnf"
137
+    "${CURRENT_PACKAGES_DIR}/ct_log_list.cnf"
138
+    "${CURRENT_PACKAGES_DIR}/ct_log_list.cnf.dist"
139
+    "${CURRENT_PACKAGES_DIR}/openssl.cnf.dist"
140
+    "${CURRENT_PACKAGES_DIR}/debug/ct_log_list.cnf"
141
+    "${CURRENT_PACKAGES_DIR}/debug/ct_log_list.cnf.dist"
142
+    "${CURRENT_PACKAGES_DIR}/debug/openssl.cnf.dist"
143
+)
144
+
145
+file(READ "${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h" _contents)
146
+string(REPLACE "<winsock.h>" "<winsock2.h>" _contents "${_contents}")
147
+file(WRITE "${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h" "${_contents}")
148
+
149
+file(READ "${CURRENT_PACKAGES_DIR}/include/openssl/rand.h" _contents)
150
+string(REPLACE "#  include <windows.h>" "#ifndef _WINSOCKAPI_\n#define _WINSOCKAPI_\n#endif\n#  include <windows.h>" _contents "${_contents}")
151
+file(WRITE "${CURRENT_PACKAGES_DIR}/include/openssl/rand.h" "${_contents}")
152
+
153
+vcpkg_copy_pdbs()
154
+
155
+file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
0 156
new file mode 100644
... ...
@@ -0,0 +1,7 @@
0
+{
1
+  "name": "openssl",
2
+  "version-string": "1.1.1k",
3
+  "port-version": 4,
4
+  "description": "OpenSSL is an open source project that provides a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library.",
5
+  "homepage": "https://www.openssl.org"
6
+}
0 7
new file mode 100644
... ...
@@ -0,0 +1,174 @@
0
+vcpkg_fail_port_install(MESSAGE "${PORT} is only for Windows Desktop" ON_TARGET "UWP" "Linux" "OSX")
1
+
2
+vcpkg_extract_source_archive_ex(
3
+    OUT_SOURCE_PATH SOURCE_PATH
4
+    ARCHIVE ${ARCHIVE}
5
+)
6
+
7
+vcpkg_find_acquire_program(NASM)
8
+get_filename_component(NASM_EXE_PATH "${NASM}" DIRECTORY)
9
+vcpkg_add_to_path(PREPEND "${NASM_EXE_PATH}")
10
+
11
+vcpkg_find_acquire_program(JOM)
12
+
13
+set(OPENSSL_SHARED no-shared)
14
+if(VCPKG_LIBRARY_LINKAGE STREQUAL dynamic)
15
+    set(OPENSSL_SHARED shared)
16
+endif()
17
+
18
+set(CONFIGURE_OPTIONS 
19
+    enable-static-engine
20
+    enable-capieng
21
+    no-ssl2
22
+    no-tests
23
+    no-autoload-config
24
+    -utf-8
25
+    ${OPENSSL_SHARED}
26
+)
27
+
28
+if(DEFINED OPENSSL_USE_NOPINSHARED)
29
+    set(CONFIGURE_OPTIONS ${CONFIGURE_OPTIONS} no-pinshared)
30
+endif()
31
+
32
+set(CONFIGURE_COMMAND "${PERL}" Configure ${CONFIGURE_OPTIONS})
33
+
34
+if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
35
+    set(OPENSSL_ARCH VC-WIN32)
36
+elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
37
+    set(OPENSSL_ARCH VC-WIN64A)
38
+elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm")
39
+    set(OPENSSL_ARCH VC-WIN32-ARM)
40
+elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64")
41
+    set(OPENSSL_ARCH VC-WIN64-ARM)
42
+else()
43
+    message(FATAL_ERROR "Unsupported target architecture: ${VCPKG_TARGET_ARCHITECTURE}")
44
+endif()
45
+
46
+set(OPENSSL_MAKEFILE "makefile")
47
+
48
+file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel"
49
+                    "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
50
+
51
+if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
52
+
53
+    # Copy openssl sources.
54
+    message(STATUS "Copying openssl release source files...")
55
+    file(GLOB OPENSSL_SOURCE_FILES ${SOURCE_PATH}/*)
56
+    foreach(SOURCE_FILE ${OPENSSL_SOURCE_FILES})
57
+        file(COPY ${SOURCE_FILE} DESTINATION "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")
58
+    endforeach()
59
+    message(STATUS "Copying openssl release source files... done")
60
+    set(SOURCE_PATH_RELEASE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel")
61
+
62
+    set(OPENSSLDIR_RELEASE ${CURRENT_PACKAGES_DIR})
63
+
64
+    message(STATUS "Configure ${TARGET_TRIPLET}-rel")
65
+    vcpkg_execute_required_process(
66
+        COMMAND ${CONFIGURE_COMMAND} ${OPENSSL_ARCH} "--prefix=${OPENSSLDIR_RELEASE}" "--openssldir=${OPENSSLDIR_RELEASE}" -FS
67
+        WORKING_DIRECTORY ${SOURCE_PATH_RELEASE}
68
+        LOGNAME configure-perl-${TARGET_TRIPLET}-rel
69
+    )
70
+    message(STATUS "Configure ${TARGET_TRIPLET}-rel done")
71
+
72
+    message(STATUS "Build ${TARGET_TRIPLET}-rel")
73
+    # Openssl's buildsystem has a race condition which will cause JOM to fail at some point.
74
+    # This is ok; we just do as much work as we can in parallel first, then follow up with a single-threaded build.
75
+    make_directory(${SOURCE_PATH_RELEASE}/inc32/openssl)
76
+    execute_process(
77
+        COMMAND ${JOM} -k -j $ENV{NUMBER_OF_PROCESSORS} -f ${OPENSSL_MAKEFILE}
78
+        WORKING_DIRECTORY ${SOURCE_PATH_RELEASE}
79
+        OUTPUT_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-0-out.log
80
+        ERROR_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-rel-0-err.log
81
+    )
82
+    vcpkg_execute_required_process(
83
+        COMMAND nmake -f ${OPENSSL_MAKEFILE} install_sw install_ssldirs
84
+        WORKING_DIRECTORY ${SOURCE_PATH_RELEASE}
85
+        LOGNAME build-${TARGET_TRIPLET}-rel-1)
86
+
87
+    message(STATUS "Build ${TARGET_TRIPLET}-rel done")
88
+endif()
89
+
90
+
91
+if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
92
+    # Copy openssl sources.
93
+    message(STATUS "Copying openssl debug source files...")
94
+    file(GLOB OPENSSL_SOURCE_FILES ${SOURCE_PATH}/*)
95
+    foreach(SOURCE_FILE ${OPENSSL_SOURCE_FILES})
96
+        file(COPY ${SOURCE_FILE} DESTINATION "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
97
+    endforeach()
98
+    message(STATUS "Copying openssl debug source files... done")
99
+    set(SOURCE_PATH_DEBUG "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
100
+
101
+    set(OPENSSLDIR_DEBUG ${CURRENT_PACKAGES_DIR}/debug)
102
+
103
+    message(STATUS "Configure ${TARGET_TRIPLET}-dbg")
104
+    vcpkg_execute_required_process(
105
+        COMMAND ${CONFIGURE_COMMAND} debug-${OPENSSL_ARCH} "--prefix=${OPENSSLDIR_DEBUG}" "--openssldir=${OPENSSLDIR_DEBUG}" -FS
106
+        WORKING_DIRECTORY ${SOURCE_PATH_DEBUG}
107
+        LOGNAME configure-perl-${TARGET_TRIPLET}-dbg
108
+    )
109
+    message(STATUS "Configure ${TARGET_TRIPLET}-dbg done")
110
+
111
+    message(STATUS "Build ${TARGET_TRIPLET}-dbg")
112
+    make_directory(${SOURCE_PATH_DEBUG}/inc32/openssl)
113
+    execute_process(
114
+        COMMAND "${JOM}" -k -j ${VCPKG_CONCURRENCY} -f "${OPENSSL_MAKEFILE}"
115
+        WORKING_DIRECTORY ${SOURCE_PATH_DEBUG}
116
+        OUTPUT_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-dbg-0-out.log
117
+        ERROR_FILE ${CURRENT_BUILDTREES_DIR}/build-${TARGET_TRIPLET}-dbg-0-err.log
118
+    )
119
+    vcpkg_execute_required_process(
120
+        COMMAND nmake -f "${OPENSSL_MAKEFILE}" install_sw install_ssldirs
121
+        WORKING_DIRECTORY ${SOURCE_PATH_DEBUG}
122
+        LOGNAME build-${TARGET_TRIPLET}-dbg-1)
123
+
124
+    message(STATUS "Build ${TARGET_TRIPLET}-dbg done")
125
+endif()
126
+
127
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/certs")
128
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/private")
129
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/lib/engines-1_1")
130
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/certs")
131
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/lib/engines-1_1")
132
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/private")
133
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
134
+
135
+file(REMOVE
136
+    "${CURRENT_PACKAGES_DIR}/ct_log_list.cnf"
137
+    "${CURRENT_PACKAGES_DIR}/ct_log_list.cnf.dist"
138
+    "${CURRENT_PACKAGES_DIR}/openssl.cnf.dist"
139
+    "${CURRENT_PACKAGES_DIR}/debug/bin/openssl.exe"
140
+    "${CURRENT_PACKAGES_DIR}/debug/ct_log_list.cnf"
141
+    "${CURRENT_PACKAGES_DIR}/debug/ct_log_list.cnf.dist"
142
+    "${CURRENT_PACKAGES_DIR}/debug/openssl.cnf"
143
+    "${CURRENT_PACKAGES_DIR}/debug/openssl.cnf.dist"
144
+)
145
+
146
+file(MAKE_DIRECTORY "${CURRENT_PACKAGES_DIR}/tools/openssl/")
147
+file(RENAME "${CURRENT_PACKAGES_DIR}/bin/openssl.exe" "${CURRENT_PACKAGES_DIR}/tools/openssl/openssl.exe")
148
+file(RENAME "${CURRENT_PACKAGES_DIR}/openssl.cnf" "${CURRENT_PACKAGES_DIR}/tools/openssl/openssl.cnf")
149
+
150
+vcpkg_copy_tool_dependencies("${CURRENT_PACKAGES_DIR}/tools/openssl")
151
+
152
+if(VCPKG_LIBRARY_LINKAGE STREQUAL static)
153
+    # They should be empty, only the exes deleted above were in these directories
154
+    file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/bin/")
155
+    file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin/")
156
+endif()
157
+
158
+vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/include/openssl/dtls1.h"
159
+    "<winsock.h>"
160
+    "<winsock2.h>"
161
+)
162
+
163
+vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/include/openssl/rand.h"
164
+    "#  include <windows.h>"
165
+    "#ifndef _WINSOCKAPI_\n#define _WINSOCKAPI_\n#endif\n#  include <windows.h>"
166
+)
167
+
168
+vcpkg_copy_pdbs()
169
+
170
+file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)
171
+if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
172
+    file(COPY "${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake" DESTINATION "${CURRENT_PACKAGES_DIR}/share/openssl")
173
+endif()
0 174
new file mode 100644
... ...
@@ -0,0 +1,10 @@
0
+_find_package(${ARGS})
1
+if(OPENSSL_FOUND)
2
+    list(APPEND OPENSSL_LIBRARIES Crypt32.lib ws2_32.lib)
3
+    if(TARGET OpenSSL::Crypto)
4
+        set_property(TARGET OpenSSL::Crypto APPEND PROPERTY INTERFACE_LINK_LIBRARIES "Crypt32.lib;ws2_32.lib")
5
+    endif()
6
+    if(TARGET OpenSSL::SSL)
7
+        set_property(TARGET OpenSSL::SSL APPEND PROPERTY INTERFACE_LINK_LIBRARIES "Crypt32.lib;ws2_32.lib")
8
+    endif()
9
+endif()