From 2c68b1229b7b8ebba5f53d78441917e72385e16e Mon Sep 17 00:00:00 2001 From: DDoSolitary Date: Thu, 12 Mar 2020 00:15:12 +0800 Subject: [PATCH] [libssh] Enable mbedtls's threading support (#10154) * Add "pthreads" feature to mbedtls. * Cleanup portfile. * Fix mbedtls pthreads support for Linux. * [mbedtls] Require the pthreads port only on Windows. * [mbedtls] Work around dependency issues about static linking. --- ports/libssh/CONTROL | 4 +- ports/mbedtls/CONTROL | 6 +- ports/mbedtls/enable-pthread.patch | 98 +++++++++++++++++++++++++ ports/mbedtls/portfile.cmake | 15 +++- ports/mbedtls/vcpkg-cmake-wrapper.cmake | 29 ++++++++ 5 files changed, 147 insertions(+), 5 deletions(-) create mode 100755 ports/mbedtls/enable-pthread.patch create mode 100644 ports/mbedtls/vcpkg-cmake-wrapper.cmake diff --git a/ports/libssh/CONTROL b/ports/libssh/CONTROL index 9b7a16004e..ada47ad871 100644 --- a/ports/libssh/CONTROL +++ b/ports/libssh/CONTROL @@ -1,5 +1,5 @@ Source: libssh -Version: 0.9.3 +Version: 0.9.3-1 Homepage: https://www.libssh.org/ Description: libssh is a multiplatform C library implementing the SSHv2 protocol on client and server side Default-Features: crypto @@ -10,7 +10,7 @@ Build-Depends: libssh[mbedtls] Description: Default crypto backend Feature: mbedtls -Build-Depends: mbedtls +Build-Depends: mbedtls[pthreads] Description: Crypto support (mbedTLS) Feature: openssl diff --git a/ports/mbedtls/CONTROL b/ports/mbedtls/CONTROL index 09562f001e..5ae5bf26b1 100644 --- a/ports/mbedtls/CONTROL +++ b/ports/mbedtls/CONTROL @@ -1,4 +1,8 @@ Source: mbedtls -Version: 2.16.3 +Version: 2.16.3-1 Homepage: https://github.com/ARMmbed/mbedtls Description: An open source, portable, easy to use, readable and flexible SSL library + +Feature: pthreads +Build-Depends: pthreads (windows) +Description: Multi-threading support diff --git a/ports/mbedtls/enable-pthread.patch b/ports/mbedtls/enable-pthread.patch new file mode 100755 index 0000000000..9a45e50bde --- /dev/null +++ b/ports/mbedtls/enable-pthread.patch @@ -0,0 +1,98 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 5f7d0d886..d65cfeb2b 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -7,6 +7,7 @@ endif() + + option(USE_PKCS11_HELPER_LIBRARY "Build mbed TLS with the pkcs11-helper library." OFF) + option(ENABLE_ZLIB_SUPPORT "Build mbed TLS with zlib library." OFF) ++option(ENABLE_PTHREAD "Build mbed TLS with pthread" OFF) + + option(ENABLE_PROGRAMS "Build mbed TLS programs." ON) + +@@ -174,6 +175,7 @@ else() + endif() + + include_directories(include/) ++include_directories(${CMAKE_CURRENT_BINARY_DIR}/include/) + + if(ENABLE_ZLIB_SUPPORT) + find_package(ZLIB) +@@ -183,6 +185,17 @@ if(ENABLE_ZLIB_SUPPORT) + endif(ZLIB_FOUND) + endif(ENABLE_ZLIB_SUPPORT) + ++if(ENABLE_PTHREAD) ++ if(WIN32) ++ find_package(pthreads_windows REQUIRED) ++ include_directories(${PThreads4W_INCLUDE_DIR}) ++ else() ++ set(CMAKE_THREAD_PREFER_PTHREAD ON) ++ find_package(Threads REQUIRED) ++ endif() ++ set(LINK_WITH_PTHREAD ON) ++endif() ++ + add_subdirectory(library) + add_subdirectory(include) + +diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt +index c2f2bd4e6..e110cd50c 100644 +--- a/include/CMakeLists.txt ++++ b/include/CMakeLists.txt +@@ -1,9 +1,13 @@ + option(INSTALL_MBEDTLS_HEADERS "Install mbed TLS headers." ON) + ++configure_file(mbedtls/config_threading.h.in mbedtls/config_threading.h) ++ + if(INSTALL_MBEDTLS_HEADERS) + + file(GLOB headers "mbedtls/*.h") + ++ set(headers ${headers} ${CMAKE_CURRENT_BINARY_DIR}/mbedtls/config_threading.h) ++ + install(FILES ${headers} + DESTINATION include/mbedtls + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) +diff --git a/include/mbedtls/config.h b/include/mbedtls/config.h +index 5df962ef6..f205bf599 100644 +--- a/include/mbedtls/config.h ++++ b/include/mbedtls/config.h +@@ -26,6 +26,8 @@ + * This file is part of mbed TLS (https://tls.mbed.org) + */ + ++#include "mbedtls/config_threading.h" ++ + #ifndef MBEDTLS_CONFIG_H + #define MBEDTLS_CONFIG_H + +diff --git a/include/mbedtls/config_threading.h.in b/include/mbedtls/config_threading.h.in +new file mode 100644 +index 000000000..f6286ed9c +--- /dev/null ++++ b/include/mbedtls/config_threading.h.in +@@ -0,0 +1,6 @@ ++#cmakedefine ENABLE_PTHREAD ++ ++#ifdef ENABLE_PTHREAD ++#define MBEDTLS_THREADING_C ++#define MBEDTLS_THREADING_PTHREAD ++#endif +diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt +index 9330cff9b..54a815ee7 100644 +--- a/library/CMakeLists.txt ++++ b/library/CMakeLists.txt +@@ -128,7 +128,11 @@ if(ENABLE_ZLIB_SUPPORT) + endif(ENABLE_ZLIB_SUPPORT) + + if(LINK_WITH_PTHREAD) +- set(libs ${libs} pthread) ++ if(WIN32) ++ set(libs ${libs} ${PThreads4W_LIBRARY}) ++ else() ++ set(libs ${libs} pthread) ++ endif() + endif() + + if (NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY) diff --git a/ports/mbedtls/portfile.cmake b/ports/mbedtls/portfile.cmake index cd32e2171a..4735a6adbe 100644 --- a/ports/mbedtls/portfile.cmake +++ b/ports/mbedtls/portfile.cmake @@ -1,5 +1,3 @@ -include(vcpkg_common_functions) - set(VCPKG_LIBRARY_LINKAGE static) vcpkg_from_github( @@ -8,12 +6,21 @@ vcpkg_from_github( REF mbedtls-2.16.3 SHA512 3d798f7de9c33325585d5d7c8608cc16acdcf42c246d283b2fb8a29f5e419f2899342965ff297432ef2ab20c91eaee28d6ca53349f5a68b0a4fd29d6905fc64c HEAD_REF master + PATCHES + enable-pthread.patch +) + +vcpkg_check_features( + OUT_FEATURE_OPTIONS FEATURE_OPTIONS + FEATURES + pthreads ENABLE_PTHREAD ) vcpkg_configure_cmake( SOURCE_PATH ${SOURCE_PATH} PREFER_NINJA OPTIONS + ${FEATURE_OPTIONS} -DENABLE_TESTING=OFF -DENABLE_PROGRAMS=OFF ) @@ -24,4 +31,8 @@ file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) file(INSTALL ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/mbedtls RENAME copyright) +if(WIN32 AND pthreads IN_LIST FEATURES) + file(INSTALL ${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake DESTINATION ${CURRENT_PACKAGES_DIR}/share/mbedtls) +endif() + vcpkg_copy_pdbs() diff --git a/ports/mbedtls/vcpkg-cmake-wrapper.cmake b/ports/mbedtls/vcpkg-cmake-wrapper.cmake new file mode 100644 index 0000000000..40a0bccb4d --- /dev/null +++ b/ports/mbedtls/vcpkg-cmake-wrapper.cmake @@ -0,0 +1,29 @@ +include(FindPackageHandleStandardArgs) + +find_path(MBEDTLS_INCLUDE_DIR mbedtls/ssl.h) + +find_library(MBEDTLS_CRYPTO_LIBRARY mbedcrypto) +find_package(pthreads_windows QUIET) +set(MBEDTLS_CRYPTO_LIBRARY ${MBEDTLS_CRYPTO_LIBRARY} ${PThreads4W_LIBRARY}) +find_library(MBEDTLS_X509_LIBRARY mbedx509) +find_library(MBEDTLS_TLS_LIBRARY mbedtls) +set(MBEDTLS_LIBRARIES ${MBEDTLS_CRYPTO_LIBRARY} ${MBEDTLS_X509_LIBRARY} ${MBEDTLS_TLS_LIBRARY}) + +if (MBEDTLS_INCLUDE_DIR AND EXISTS "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h") + file( + STRINGS ${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h _MBEDTLS_VERLINE + REGEX "^#define[ \t]+MBEDTLS_VERSION_STRING[\t ].*" + ) + string(REGEX REPLACE ".*MBEDTLS_VERSION_STRING[\t ]+\"(.*)\"" "\\1" MBEDTLS_VERSION ${_MBEDTLS_VERLINE}) +endif() + +find_package_handle_standard_args( + mbedTLS + REQUIRED_VARS + MBEDTLS_INCLUDE_DIR + MBEDTLS_CRYPTO_LIBRARY + MBEDTLS_X509_LIBRARY + MBEDTLS_TLS_LIBRARY + PThreads4W_FOUND + VERSION_VAR MBEDTLS_VERSION +)