From 1966c86d71eb90beeeb3ccbefd6321bd64992553 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Mon, 20 Oct 2025 15:51:39 +0200 Subject: [PATCH] cmake: add and use local FindGnuTLS module Replacing a combination of custom logic in the main script and relying on CMake's built-in Find module, with code and behavior used for the rest of dependencies. Also to: - add version detection in the non-pkg-config path. - make `GNUTLS_INCLUDE_DIR` and `GNUTLS_LIBRARY` take precedence over pkg-config. As with other dependencies. - document the above two configuration options. - prepare for #16973, which originally introduced this local Find module. The local module is doing largely the same as CMake's built-in FindGnuTLS. Differences: - honors `CURL_USE_PKGCONFIG`. - returns GnuTLS version for non-pkg-config detection. - consistently returns `GNUTLS_VERSION`. (CMake's built-in uses s different name in <3.16.) - CMake 3.16+ returns an imported target. curl supports 3.7, therefore we may only use it conditionally, which isn't worth it. Cherry-picked from #16973 Closes #19163 --- CMake/FindGnuTLS.cmake | 83 ++++++++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 30 +++++++-------- Makefile.am | 1 + docs/INSTALL-CMAKE.md | 2 + 4 files changed, 99 insertions(+), 17 deletions(-) create mode 100644 CMake/FindGnuTLS.cmake diff --git a/CMake/FindGnuTLS.cmake b/CMake/FindGnuTLS.cmake new file mode 100644 index 0000000000..5b564fd9b2 --- /dev/null +++ b/CMake/FindGnuTLS.cmake @@ -0,0 +1,83 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) Daniel Stenberg, , et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at https://curl.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +# SPDX-License-Identifier: curl +# +########################################################################### +# Find the GnuTLS library +# +# Input variables: +# +# - `GNUTLS_INCLUDE_DIR`: The GnuTLS include directory. +# - `GNUTLS_LIBRARY`: Path to `gnutls` library. +# +# Result variables: +# +# - `GNUTLS_FOUND`: System has GnuTLS. +# - `GNUTLS_INCLUDE_DIRS`: The GnuTLS include directories. +# - `GNUTLS_LIBRARIES`: The GnuTLS library names. +# - `GNUTLS_LIBRARY_DIRS`: The GnuTLS library directories. +# - `GNUTLS_PC_REQUIRES`: The GnuTLS pkg-config packages. +# - `GNUTLS_CFLAGS`: Required compiler flags. +# - `GNUTLS_VERSION`: Version of GnuTLS. + +set(GNUTLS_PC_REQUIRES "gnutls") + +if(CURL_USE_PKGCONFIG AND + NOT DEFINED GNUTLS_INCLUDE_DIR AND + NOT DEFINED GNUTLS_LIBRARY) + find_package(PkgConfig QUIET) + pkg_check_modules(GNUTLS ${GNUTLS_PC_REQUIRES}) +endif() + +if(GNUTLS_FOUND) + set(GnuTLS_FOUND TRUE) + string(REPLACE ";" " " GNUTLS_CFLAGS "${GNUTLS_CFLAGS}") + message(STATUS "Found GnuTLS (via pkg-config): ${GNUTLS_INCLUDE_DIRS} (found version \"${GNUTLS_VERSION}\")") +else() + find_path(GNUTLS_INCLUDE_DIR NAMES "gnutls/gnutls.h") + find_library(GNUTLS_LIBRARY NAMES "gnutls" "libgnutls") + + unset(GNUTLS_VERSION CACHE) + if(GNUTLS_INCLUDE_DIR AND EXISTS "${GNUTLS_INCLUDE_DIR}/gnutls/gnutls.h") + set(_version_regex "#[\t ]*define[\t ]+GNUTLS_VERSION[\t ]+\"([^\"]*)\"") + file(STRINGS "${GNUTLS_INCLUDE_DIR}/gnutls/gnutls.h" _version_str REGEX "${_version_regex}") + string(REGEX REPLACE "${_version_regex}" "\\1" _version_str "${_version_str}") + set(GNUTLS_VERSION "${_version_str}") + unset(_version_regex) + unset(_version_str) + endif() + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(GnuTLS + REQUIRED_VARS + GNUTLS_INCLUDE_DIR + GNUTLS_LIBRARY + VERSION_VAR + GNUTLS_VERSION + ) + + if(GNUTLS_FOUND) + set(GNUTLS_INCLUDE_DIRS ${GNUTLS_INCLUDE_DIR}) + set(GNUTLS_LIBRARIES ${GNUTLS_LIBRARY}) + endif() + + mark_as_advanced(GNUTLS_INCLUDE_DIR GNUTLS_LIBRARY) +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index cdd580ab59..2986902c02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -890,27 +890,23 @@ if(CURL_USE_WOLFSSL) endif() if(CURL_USE_GNUTLS) - if(CURL_USE_PKGCONFIG) - find_package(PkgConfig QUIET) - pkg_check_modules(GNUTLS "gnutls") - if(GNUTLS_FOUND) - set(GNUTLS_LIBRARIES ${GNUTLS_LINK_LIBRARIES}) - string(REPLACE ";" " " GNUTLS_CFLAGS "${GNUTLS_CFLAGS}") - if(GNUTLS_CFLAGS) - string(APPEND CMAKE_C_FLAGS " ${GNUTLS_CFLAGS}") - endif() - endif() - endif() - if(NOT GNUTLS_FOUND) - find_package(GnuTLS REQUIRED) + find_package(GnuTLS REQUIRED) + list(APPEND CURL_LIBS ${GNUTLS_LIBRARIES}) + list(APPEND CURL_LIBDIRS ${GNUTLS_LIBRARY_DIRS}) + list(APPEND LIBCURL_PC_REQUIRES_PRIVATE ${GNUTLS_PC_REQUIRES}) + include_directories(SYSTEM ${GNUTLS_INCLUDE_DIRS}) + link_directories(${GNUTLS_LIBRARY_DIRS}) + if(GNUTLS_CFLAGS) + string(APPEND CMAKE_C_FLAGS " ${GNUTLS_CFLAGS}") endif() + find_package(Nettle REQUIRED) set(_ssl_enabled ON) set(USE_GNUTLS ON) - list(APPEND CURL_LIBS ${GNUTLS_LIBRARIES} ${NETTLE_LIBRARIES}) - list(APPEND CURL_LIBDIRS ${GNUTLS_LIBRARY_DIRS} ${NETTLE_LIBRARY_DIRS}) - list(APPEND LIBCURL_PC_REQUIRES_PRIVATE "gnutls" ${NETTLE_PC_REQUIRES}) - include_directories(SYSTEM ${GNUTLS_INCLUDE_DIRS} ${NETTLE_INCLUDE_DIRS}) + list(APPEND CURL_LIBS ${NETTLE_LIBRARIES}) + list(APPEND CURL_LIBDIRS ${NETTLE_LIBRARY_DIRS}) + list(APPEND LIBCURL_PC_REQUIRES_PRIVATE ${NETTLE_PC_REQUIRES}) + include_directories(SYSTEM ${NETTLE_INCLUDE_DIRS}) link_directories(${NETTLE_LIBRARY_DIRS}) if(NETTLE_CFLAGS) string(APPEND CMAKE_C_FLAGS " ${NETTLE_CFLAGS}") diff --git a/Makefile.am b/Makefile.am index 7687385416..7b2f05f92e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -34,6 +34,7 @@ CMAKE_DIST = \ CMake/CurlTests.c \ CMake/FindBrotli.cmake \ CMake/FindCares.cmake \ + CMake/FindGnuTLS.cmake \ CMake/FindGSS.cmake \ CMake/FindLDAP.cmake \ CMake/FindLibgsasl.cmake \ diff --git a/docs/INSTALL-CMAKE.md b/docs/INSTALL-CMAKE.md index 1c5fee1b0d..a2a73050b0 100644 --- a/docs/INSTALL-CMAKE.md +++ b/docs/INSTALL-CMAKE.md @@ -404,6 +404,8 @@ Details via CMake - `CARES_INCLUDE_DIR`: The c-ares include directory. - `CARES_LIBRARY`: Path to `cares` library. - `DL_LIBRARY`: Path to `dl` library. (for Rustls) +- `GNUTLS_INCLUDE_DIR`: The GnuTLS include directory. +- `GNUTLS_LIBRARY`: Path to `gnutls` library. - `GSS_ROOT_DIR`: Set this variable to the root installation of GSS. (also supported as environment) - `LDAP_INCLUDE_DIR`: The LDAP include directory. - `LDAP_LIBRARY`: Path to `ldap` library. -- 2.47.3