diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dca6b3ca..830a8720 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -594,7 +594,7 @@ jobs: - name: 'mbedTLS' install: mbedtls configure: --with-crypto=mbedtls "--with-libmbedcrypto-prefix=$(brew --prefix)" - cmake: -DCRYPTO_BACKEND=mbedTLS "-DMBEDTLS_INCLUDE_DIR=$(brew --prefix)/opt/mbedtls/include" "-DMBEDCRYPTO_LIBRARY=$(brew --prefix)/opt/mbedtls/lib/libmbedcrypto.a" + cmake: -DCRYPTO_BACKEND=mbedTLS steps: - name: 'install packages' run: brew install ${{ matrix.build == 'autotools' && 'automake libtool' || 'ninja' }} ${{ matrix.crypto.install }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 3558246a..6b51ac64 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -350,7 +350,12 @@ if(CRYPTO_BACKEND STREQUAL "wolfSSL" OR NOT CRYPTO_BACKEND) set(CRYPTO_BACKEND_DEFINE "LIBSSH2_WOLFSSL") set(CRYPTO_BACKEND_INCLUDE_DIR ${WOLFSSL_INCLUDE_DIRS}) list(APPEND LIBSSH2_LIBS ${WOLFSSL_LIBRARIES}) + list(APPEND LIBSSH2_LIBDIRS ${WOLFSSL_LIBRARY_DIRS}) list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE "wolfssl") + link_directories(${WOLFSSL_LIBRARY_DIRS}) + if(WOLFSSL_CFLAGS) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WOLFSSL_CFLAGS}") + endif() if(WIN32) list(APPEND LIBSSH2_LIBS "crypt32") @@ -374,7 +379,12 @@ if(CRYPTO_BACKEND STREQUAL "Libgcrypt" OR NOT CRYPTO_BACKEND) set(CRYPTO_BACKEND_DEFINE "LIBSSH2_LIBGCRYPT") set(CRYPTO_BACKEND_INCLUDE_DIR ${LIBGCRYPT_INCLUDE_DIRS}) list(APPEND LIBSSH2_LIBS ${LIBGCRYPT_LIBRARIES}) + list(APPEND LIBSSH2_LIBDIRS ${LIBGCRYPT_LIBRARY_DIRS}) list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE "libgcrypt") + link_directories(${LIBGCRYPT_LIBRARY_DIRS}) + if(LIBGCRYPT_CFLAGS) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBGCRYPT_CFLAGS}") + endif() endif() endif() @@ -387,8 +397,12 @@ if(CRYPTO_BACKEND STREQUAL "mbedTLS" OR NOT CRYPTO_BACKEND) set(CRYPTO_BACKEND_DEFINE "LIBSSH2_MBEDTLS") set(CRYPTO_BACKEND_INCLUDE_DIR ${MBEDTLS_INCLUDE_DIRS}) list(APPEND LIBSSH2_LIBS ${MBEDTLS_LIBRARIES}) + list(APPEND LIBSSH2_LIBDIRS ${MBEDTLS_LIBRARY_DIRS}) list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE "mbedcrypto") - link_directories(${MBEDTLS_LIBRARY_DIR}) + link_directories(${MBEDTLS_LIBRARY_DIRS}) + if(MBEDTLS_CFLAGS) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MBEDTLS_CFLAGS}") + endif() endif() endif() diff --git a/cmake/FindLibgcrypt.cmake b/cmake/FindLibgcrypt.cmake index 1350d82c..4582ce9b 100644 --- a/cmake/FindLibgcrypt.cmake +++ b/cmake/FindLibgcrypt.cmake @@ -1,55 +1,59 @@ -# Copyright (C) Alexander Lamaison -# -# Redistribution and use in source and binary forms, -# with or without modification, are permitted provided -# that the following conditions are met: -# -# Redistributions of source code must retain the above -# copyright notice, this list of conditions and the -# following disclaimer. -# -# Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials -# provided with the distribution. -# -# Neither the name of the copyright holder nor the names -# of any other contributors may be used to endorse or -# promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -# OF SUCH DAMAGE. -# +# Copyright (C) The libssh2 project and its contributors. # SPDX-License-Identifier: BSD-3-Clause +# +########################################################################### +# Find the libgcrypt library +# +# Input variables: +# +# LIBGCRYPT_INCLUDE_DIR The libgcrypt include directory +# LIBGCRYPT_LIBRARY Path to libgcrypt library +# +# Result variables: +# +# LIBGCRYPT_FOUND System has libgcrypt +# LIBGCRYPT_INCLUDE_DIRS The libgcrypt include directories +# LIBGCRYPT_LIBRARIES The libgcrypt library names +# LIBGCRYPT_LIBRARY_DIRS The libgcrypt library directories +# LIBGCRYPT_CFLAGS Required compiler flags +# LIBGCRYPT_VERSION Version of libgcrypt -# - Try to find Libgcrypt -# This will define all or none of: -# LIBGCRYPT_FOUND - if Libgcrypt headers and library was found -# LIBGCRYPT_INCLUDE_DIRS - The Libgcrypt include directories -# LIBGCRYPT_LIBRARIES - The libraries needed to use Libgcrypt +if((UNIX OR VCPKG_TOOLCHAIN OR (MINGW AND NOT CMAKE_CROSSCOMPILING)) AND + NOT DEFINED LIBGCRYPT_INCLUDE_DIR AND + NOT DEFINED LIBGCRYPT_LIBRARY) + find_package(PkgConfig QUIET) + pkg_check_modules(LIBGCRYPT "libgcrypt") +endif() -find_path(LIBGCRYPT_INCLUDE_DIR "gcrypt.h") -find_library(LIBGCRYPT_LIBRARY NAMES "gcrypt" "libgcrypt") +if(LIBGCRYPT_FOUND) + string(REPLACE ";" " " LIBGCRYPT_CFLAGS "${LIBGCRYPT_CFLAGS}") + message(STATUS "Found Libgcrypt (via pkg-config): ${LIBGCRYPT_INCLUDE_DIRS} (found version \"${LIBGCRYPT_VERSION}\")") +else() + find_path(LIBGCRYPT_INCLUDE_DIR NAMES "gcrypt.h") + find_library(LIBGCRYPT_LIBRARY NAMES "gcrypt" "libgcrypt") -set(LIBGCRYPT_INCLUDE_DIRS ${LIBGCRYPT_INCLUDE_DIR}) -set(LIBGCRYPT_LIBRARIES ${LIBGCRYPT_LIBRARY}) + if(LIBGCRYPT_INCLUDE_DIR AND EXISTS "${LIBGCRYPT_INCLUDE_DIR}/gcrypt.h") + set(_version_regex "#[\t ]*define[\t ]+GCRYPT_VERSION[\t ]+\"([^\"]*)\"") + file(STRINGS "${LIBGCRYPT_INCLUDE_DIR}/gcrypt.h" _version_str REGEX "${_version_regex}") + string(REGEX REPLACE "${_version_regex}" "\\1" _version_str "${_version_str}") + set(LIBGCRYPT_VERSION "${_version_str}") + unset(_version_regex) + unset(_version_str) + endif() -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Libgcrypt - DEFAULT_MSG - LIBGCRYPT_INCLUDE_DIR LIBGCRYPT_LIBRARY) + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Libgcrypt + REQUIRED_VARS + LIBGCRYPT_INCLUDE_DIR + LIBGCRYPT_LIBRARY + VERSION_VAR + LIBGCRYPT_VERSION + ) -mark_as_advanced(LIBGCRYPT_INCLUDE_DIR LIBGCRYPT_LIBRARY) + if(LIBGCRYPT_FOUND) + set(LIBGCRYPT_INCLUDE_DIRS ${LIBGCRYPT_INCLUDE_DIR}) + set(LIBGCRYPT_LIBRARIES ${LIBGCRYPT_LIBRARY}) + endif() + + mark_as_advanced(LIBGCRYPT_INCLUDE_DIR LIBGCRYPT_LIBRARY) +endif() diff --git a/cmake/FindMbedTLS.cmake b/cmake/FindMbedTLS.cmake index 376bd83d..26bc5655 100644 --- a/cmake/FindMbedTLS.cmake +++ b/cmake/FindMbedTLS.cmake @@ -1,41 +1,69 @@ # Copyright (C) The libssh2 project and its contributors. # SPDX-License-Identifier: BSD-3-Clause # -# - Try to find mbedTLS +########################################################################### +# Find the mbedtls library # # Input variables: -# MBEDTLS_INCLUDE_DIR - the mbedTLS include directory -# MBEDCRYPTO_LIBRARY - path to mbedTLS Crypto library -# Output variables: -# MBEDTLS_FOUND - system has mbedTLS -# MBEDTLS_LIBRARIES - link these to use mbedTLS +# +# MBEDTLS_INCLUDE_DIR The mbedtls include directory +# MBEDCRYPTO_LIBRARY Path to mbedcrypto library +# +# Result variables: +# +# MBEDTLS_FOUND System has mbedtls +# MBEDTLS_INCLUDE_DIRS The mbedtls include directories +# MBEDTLS_LIBRARIES The mbedtls library names +# MBEDTLS_LIBRARY_DIRS The mbedtls library directories +# MBEDTLS_CFLAGS Required compiler flags +# MBEDTLS_VERSION Version of mbedtls -find_path(MBEDTLS_INCLUDE_DIR NAMES "mbedtls/version.h") -find_library(MBEDCRYPTO_LIBRARY NAMES "mbedcrypto" "libmbedcrypto") - -if(MBEDTLS_INCLUDE_DIR) - if(EXISTS "${MBEDTLS_INCLUDE_DIR}/mbedtls/build_info.h") - file(READ "${MBEDTLS_INCLUDE_DIR}/mbedtls/build_info.h" _mbedtls_header_new) - endif() - file(READ "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h" _mbedtls_header_old) - set(_mbedtls_regex "MBEDTLS_VERSION_STRING +\"([0-9|.]+)\"") - string(REGEX MATCH "${_mbedtls_regex}" _mbedtls_match "${_mbedtls_header_new} ${_mbedtls_header_old}") - string(REGEX REPLACE "${_mbedtls_regex}" "\\1" MBEDTLS_VERSION "${_mbedtls_match}") - unset(_mbedtls_header_new) - unset(_mbedtls_header_old) - unset(_mbedtls_match) - unset(_mbedtls_regex) +if((UNIX OR VCPKG_TOOLCHAIN OR (MINGW AND NOT CMAKE_CROSSCOMPILING)) AND + NOT DEFINED MBEDTLS_INCLUDE_DIR AND + NOT DEFINED MBEDCRYPTO_LIBRARY) + find_package(PkgConfig QUIET) + pkg_check_modules(MBEDTLS "mbedcrypto") endif() -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MbedTLS - REQUIRED_VARS MBEDTLS_INCLUDE_DIR MBEDCRYPTO_LIBRARY - VERSION_VAR MBEDTLS_VERSION) - if(MBEDTLS_FOUND) - set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR}) - set(MBEDTLS_LIBRARIES ${MBEDCRYPTO_LIBRARY}) - message(STATUS "Found mbedTLS libraries: ${MBEDTLS_LIBRARIES}") -endif() + string(REPLACE ";" " " MBEDTLS_CFLAGS "${MBEDTLS_CFLAGS}") + message(STATUS "Found MbedTLS (via pkg-config): ${MBEDTLS_INCLUDE_DIRS} (found version \"${MBEDTLS_VERSION}\")") +else() + find_path(MBEDTLS_INCLUDE_DIR NAMES "mbedtls/version.h") + find_library(MBEDCRYPTO_LIBRARY NAMES "mbedcrypto" "libmbedcrypto") -mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDCRYPTO_LIBRARY) + if(MBEDTLS_INCLUDE_DIR) + if(EXISTS "${MBEDTLS_INCLUDE_DIR}/mbedtls/build_info.h") # 3.x + set(_version_header "${MBEDTLS_INCLUDE_DIR}/mbedtls/build_info.h") + elseif(EXISTS "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h") # 2.x + set(_version_header "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h") + else() + unset(_version_header) + endif() + if(_version_header) + set(_version_regex "#[\t ]*define[\t ]+MBEDTLS_VERSION_STRING[\t ]+\"([0-9.]+)\"") + file(STRINGS "${_version_header}" _version_str REGEX "${_version_regex}") + string(REGEX REPLACE "${_version_regex}" "\\1" _version_str "${_version_str}") + set(MBEDTLS_VERSION "${_version_str}") + unset(_version_regex) + unset(_version_str) + unset(_version_header) + endif() + endif() + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(MbedTLS + REQUIRED_VARS + MBEDTLS_INCLUDE_DIR + MBEDCRYPTO_LIBRARY + VERSION_VAR + MBEDTLS_VERSION + ) + + if(MBEDTLS_FOUND) + set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR}) + set(MBEDTLS_LIBRARIES ${MBEDCRYPTO_LIBRARY}) + endif() + + mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDCRYPTO_LIBRARY) +endif() diff --git a/cmake/FindWolfSSL.cmake b/cmake/FindWolfSSL.cmake index c7c84fe0..f66a59df 100644 --- a/cmake/FindWolfSSL.cmake +++ b/cmake/FindWolfSSL.cmake @@ -1,44 +1,59 @@ # Copyright (C) The libssh2 project and its contributors. # SPDX-License-Identifier: BSD-3-Clause # -# - Try to find wolfssl -# Once done this will define -# WOLFSSL_FOUND - System has wolfssl -# WOLFSSL_INCLUDE_DIR - The wolfssl include directories -# WOLFSSL_LIBRARIES - The libraries needed to use wolfssl +########################################################################### +# Find the wolfssl library +# +# Input variables: +# +# WOLFSSL_INCLUDE_DIR The wolfssl include directory +# WOLFSSL_LIBRARY Path to wolfssl library +# +# Result variables: +# +# WOLFSSL_FOUND System has wolfssl +# WOLFSSL_INCLUDE_DIRS The wolfssl include directories +# WOLFSSL_LIBRARIES The wolfssl library names +# WOLFSSL_LIBRARY_DIRS The wolfssl library directories +# WOLFSSL_CFLAGS Required compiler flags +# WOLFSSL_VERSION Version of wolfssl -find_package(PkgConfig QUIET) -pkg_check_modules(PC_WOLFSSL QUIET "wolfssl") - -find_path(WOLFSSL_INCLUDE_DIR - NAMES "wolfssl/options.h" - HINTS ${PC_WOLFSSL_INCLUDE_DIRS} -) -find_library(WOLFSSL_LIBRARY - NAMES "wolfssl" - HINTS ${PC_WOLFSSL_LIBRARY_DIRS} -) - -if(WOLFSSL_INCLUDE_DIR) - set(_version_regex "^#define[ \t]+LIBWOLFSSL_VERSION_STRING[ \t]+\"([^\"]+)\".*") - file(STRINGS "${WOLFSSL_INCLUDE_DIR}/wolfssl/version.h" - WOLFSSL_VERSION REGEX "${_version_regex}") - string(REGEX REPLACE "${_version_regex}" "\\1" - WOLFSSL_VERSION "${WOLFSSL_VERSION}") - unset(_version_regex) +if((UNIX OR VCPKG_TOOLCHAIN OR (MINGW AND NOT CMAKE_CROSSCOMPILING)) AND + NOT DEFINED WOLFSSL_INCLUDE_DIR AND + NOT DEFINED WOLFSSL_LIBRARY) + find_package(PkgConfig QUIET) + pkg_check_modules(WOLFSSL "wolfssl") endif() -include(FindPackageHandleStandardArgs) -# handle the QUIETLY and REQUIRED arguments and set WOLFSSL_FOUND -# to TRUE if all listed variables are TRUE and the requested version -# matches. -find_package_handle_standard_args(WolfSSL - REQUIRED_VARS WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY - VERSION_VAR WOLFSSL_VERSION) - if(WOLFSSL_FOUND) - set(WOLFSSL_INCLUDE_DIRS ${WOLFSSL_INCLUDE_DIR}) - set(WOLFSSL_LIBRARIES ${WOLFSSL_LIBRARY}) -endif() + string(REPLACE ";" " " WOLFSSL_CFLAGS "${WOLFSSL_CFLAGS}") + message(STATUS "Found WolfSSL (via pkg-config): ${WOLFSSL_INCLUDE_DIRS} (found version \"${WOLFSSL_VERSION}\")") +else() + find_path(WOLFSSL_INCLUDE_DIR NAMES "wolfssl/options.h") + find_library(WOLFSSL_LIBRARY NAMES "wolfssl") -mark_as_advanced(WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY) + if(WOLFSSL_INCLUDE_DIR AND EXISTS "${WOLFSSL_INCLUDE_DIR}/wolfssl/version.h") + set(_version_regex "#[\t ]*define[\t ]+LIBWOLFSSL_VERSION_STRING[\t ]+\"([^\"]*)\"") + file(STRINGS "${WOLFSSL_INCLUDE_DIR}/wolfssl/version.h" _version_str REGEX "${_version_regex}") + string(REGEX REPLACE "${_version_regex}" "\\1" _version_str "${_version_str}") + set(WOLFSSL_VERSION "${_version_str}") + unset(_version_regex) + unset(_version_str) + endif() + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(WolfSSL + REQUIRED_VARS + WOLFSSL_INCLUDE_DIR + WOLFSSL_LIBRARY + VERSION_VAR + WOLFSSL_VERSION + ) + + if(WOLFSSL_FOUND) + set(WOLFSSL_INCLUDE_DIRS ${WOLFSSL_INCLUDE_DIR}) + set(WOLFSSL_LIBRARIES ${WOLFSSL_LIBRARY}) + endif() + + mark_as_advanced(WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY) +endif()