1
0
mirror of https://github.com/libssh2/libssh2.git synced 2025-08-05 20:55:47 +03:00

cmake: sync and improve Find modules, add pkg-config native detection

- sync code between Find modules.
- wolfssl: replace `pkg-config` hints with native detection.
- libgcrypt, mbedtls: add `pkg-config`-based native detection.
- libgcrypt: add version detection.
- limit `pkg-config` use for `UNIX`, vcpkg, and non-cross MinGW builds,
  and builds with no manual customization via `*_INCLUDE_DIR` or
  `*_LIBRARY`.
- replace and sync Find module header comments.
- ci: delete manual mbedTLS config that's now redundant.

Based on similar work done in curl.

Second attempt at #1420
Closes #1445
This commit is contained in:
Viktor Szakats
2024-08-17 23:23:06 +02:00
parent 4b5f6b1031
commit 45064137ac
5 changed files with 179 additions and 118 deletions

View File

@@ -594,7 +594,7 @@ jobs:
- name: 'mbedTLS' - name: 'mbedTLS'
install: mbedtls install: mbedtls
configure: --with-crypto=mbedtls "--with-libmbedcrypto-prefix=$(brew --prefix)" 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: steps:
- name: 'install packages' - name: 'install packages'
run: brew install ${{ matrix.build == 'autotools' && 'automake libtool' || 'ninja' }} ${{ matrix.crypto.install }} run: brew install ${{ matrix.build == 'autotools' && 'automake libtool' || 'ninja' }} ${{ matrix.crypto.install }}

View File

@@ -350,7 +350,12 @@ if(CRYPTO_BACKEND STREQUAL "wolfSSL" OR NOT CRYPTO_BACKEND)
set(CRYPTO_BACKEND_DEFINE "LIBSSH2_WOLFSSL") set(CRYPTO_BACKEND_DEFINE "LIBSSH2_WOLFSSL")
set(CRYPTO_BACKEND_INCLUDE_DIR ${WOLFSSL_INCLUDE_DIRS}) set(CRYPTO_BACKEND_INCLUDE_DIR ${WOLFSSL_INCLUDE_DIRS})
list(APPEND LIBSSH2_LIBS ${WOLFSSL_LIBRARIES}) list(APPEND LIBSSH2_LIBS ${WOLFSSL_LIBRARIES})
list(APPEND LIBSSH2_LIBDIRS ${WOLFSSL_LIBRARY_DIRS})
list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE "wolfssl") 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) if(WIN32)
list(APPEND LIBSSH2_LIBS "crypt32") 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_DEFINE "LIBSSH2_LIBGCRYPT")
set(CRYPTO_BACKEND_INCLUDE_DIR ${LIBGCRYPT_INCLUDE_DIRS}) set(CRYPTO_BACKEND_INCLUDE_DIR ${LIBGCRYPT_INCLUDE_DIRS})
list(APPEND LIBSSH2_LIBS ${LIBGCRYPT_LIBRARIES}) list(APPEND LIBSSH2_LIBS ${LIBGCRYPT_LIBRARIES})
list(APPEND LIBSSH2_LIBDIRS ${LIBGCRYPT_LIBRARY_DIRS})
list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE "libgcrypt") 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()
endif() endif()
@@ -387,8 +397,12 @@ if(CRYPTO_BACKEND STREQUAL "mbedTLS" OR NOT CRYPTO_BACKEND)
set(CRYPTO_BACKEND_DEFINE "LIBSSH2_MBEDTLS") set(CRYPTO_BACKEND_DEFINE "LIBSSH2_MBEDTLS")
set(CRYPTO_BACKEND_INCLUDE_DIR ${MBEDTLS_INCLUDE_DIRS}) set(CRYPTO_BACKEND_INCLUDE_DIR ${MBEDTLS_INCLUDE_DIRS})
list(APPEND LIBSSH2_LIBS ${MBEDTLS_LIBRARIES}) list(APPEND LIBSSH2_LIBS ${MBEDTLS_LIBRARIES})
list(APPEND LIBSSH2_LIBDIRS ${MBEDTLS_LIBRARY_DIRS})
list(APPEND LIBSSH2_PC_REQUIRES_PRIVATE "mbedcrypto") 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()
endif() endif()

View File

@@ -1,55 +1,59 @@
# Copyright (C) Alexander Lamaison <alexander.lamaison@gmail.com> # Copyright (C) The libssh2 project and its contributors.
#
# 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.
#
# SPDX-License-Identifier: BSD-3-Clause # 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 if((UNIX OR VCPKG_TOOLCHAIN OR (MINGW AND NOT CMAKE_CROSSCOMPILING)) AND
# This will define all or none of: NOT DEFINED LIBGCRYPT_INCLUDE_DIR AND
# LIBGCRYPT_FOUND - if Libgcrypt headers and library was found NOT DEFINED LIBGCRYPT_LIBRARY)
# LIBGCRYPT_INCLUDE_DIRS - The Libgcrypt include directories find_package(PkgConfig QUIET)
# LIBGCRYPT_LIBRARIES - The libraries needed to use Libgcrypt pkg_check_modules(LIBGCRYPT "libgcrypt")
endif()
find_path(LIBGCRYPT_INCLUDE_DIR "gcrypt.h") if(LIBGCRYPT_FOUND)
find_library(LIBGCRYPT_LIBRARY NAMES "gcrypt" "libgcrypt") 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}) if(LIBGCRYPT_INCLUDE_DIR AND EXISTS "${LIBGCRYPT_INCLUDE_DIR}/gcrypt.h")
set(LIBGCRYPT_LIBRARIES ${LIBGCRYPT_LIBRARY}) 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) include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Libgcrypt find_package_handle_standard_args(Libgcrypt
DEFAULT_MSG REQUIRED_VARS
LIBGCRYPT_INCLUDE_DIR LIBGCRYPT_LIBRARY) 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()

View File

@@ -1,41 +1,69 @@
# Copyright (C) The libssh2 project and its contributors. # Copyright (C) The libssh2 project and its contributors.
# SPDX-License-Identifier: BSD-3-Clause # SPDX-License-Identifier: BSD-3-Clause
# #
# - Try to find mbedTLS ###########################################################################
# Find the mbedtls library
# #
# Input variables: # Input variables:
# MBEDTLS_INCLUDE_DIR - the mbedTLS include directory #
# MBEDCRYPTO_LIBRARY - path to mbedTLS Crypto library # MBEDTLS_INCLUDE_DIR The mbedtls include directory
# Output variables: # MBEDCRYPTO_LIBRARY Path to mbedcrypto library
# MBEDTLS_FOUND - system has mbedTLS #
# MBEDTLS_LIBRARIES - link these to use mbedTLS # 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") if((UNIX OR VCPKG_TOOLCHAIN OR (MINGW AND NOT CMAKE_CROSSCOMPILING)) AND
find_library(MBEDCRYPTO_LIBRARY NAMES "mbedcrypto" "libmbedcrypto") NOT DEFINED MBEDTLS_INCLUDE_DIR AND
NOT DEFINED MBEDCRYPTO_LIBRARY)
if(MBEDTLS_INCLUDE_DIR) find_package(PkgConfig QUIET)
if(EXISTS "${MBEDTLS_INCLUDE_DIR}/mbedtls/build_info.h") pkg_check_modules(MBEDTLS "mbedcrypto")
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)
endif() endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MbedTLS
REQUIRED_VARS MBEDTLS_INCLUDE_DIR MBEDCRYPTO_LIBRARY
VERSION_VAR MBEDTLS_VERSION)
if(MBEDTLS_FOUND) if(MBEDTLS_FOUND)
set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR}) string(REPLACE ";" " " MBEDTLS_CFLAGS "${MBEDTLS_CFLAGS}")
set(MBEDTLS_LIBRARIES ${MBEDCRYPTO_LIBRARY}) message(STATUS "Found MbedTLS (via pkg-config): ${MBEDTLS_INCLUDE_DIRS} (found version \"${MBEDTLS_VERSION}\")")
message(STATUS "Found mbedTLS libraries: ${MBEDTLS_LIBRARIES}") else()
endif() 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()

View File

@@ -1,44 +1,59 @@
# Copyright (C) The libssh2 project and its contributors. # Copyright (C) The libssh2 project and its contributors.
# SPDX-License-Identifier: BSD-3-Clause # SPDX-License-Identifier: BSD-3-Clause
# #
# - Try to find wolfssl ###########################################################################
# Once done this will define # Find the wolfssl library
# WOLFSSL_FOUND - System has wolfssl #
# WOLFSSL_INCLUDE_DIR - The wolfssl include directories # Input variables:
# WOLFSSL_LIBRARIES - The libraries needed to use wolfssl #
# 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) if((UNIX OR VCPKG_TOOLCHAIN OR (MINGW AND NOT CMAKE_CROSSCOMPILING)) AND
pkg_check_modules(PC_WOLFSSL QUIET "wolfssl") NOT DEFINED WOLFSSL_INCLUDE_DIR AND
NOT DEFINED WOLFSSL_LIBRARY)
find_path(WOLFSSL_INCLUDE_DIR find_package(PkgConfig QUIET)
NAMES "wolfssl/options.h" pkg_check_modules(WOLFSSL "wolfssl")
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)
endif() 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) if(WOLFSSL_FOUND)
set(WOLFSSL_INCLUDE_DIRS ${WOLFSSL_INCLUDE_DIR}) string(REPLACE ";" " " WOLFSSL_CFLAGS "${WOLFSSL_CFLAGS}")
set(WOLFSSL_LIBRARIES ${WOLFSSL_LIBRARY}) message(STATUS "Found WolfSSL (via pkg-config): ${WOLFSSL_INCLUDE_DIRS} (found version \"${WOLFSSL_VERSION}\")")
endif() 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()