From: Viktor Szakats Date: Thu, 17 Apr 2025 08:07:30 +0000 (+0200) Subject: cmake: tidy up and document feature detections in dependencies X-Git-Tag: curl-8_14_0~222 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4bfc379b90f71e4886cd29b18a9ff02f88636d99;p=thirdparty%2Fcurl.git cmake: tidy up and document feature detections in dependencies - update text on dependency feature detection variables, and move it to its own section in `docs/INSTALL-CMAKE.md`. Ref: #17032 (Discussion) - tidy up descriptions/comments, alpha-sort. - move comment to its own section in `docs/INSTALL-CMAKE.md`. - split `HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT` to distinct names for each TLS backend API. To make the names more stable and to sync them with autotools. Follow-up to 07cc50f8ebc6ad4c2ad23642ca727d79dab8855e #17018 Follow-up to 342a654ef32f6c4ff284d8680f85db6136534699 #15873 - drop redundant condition while detecting QUICTLS API. Follow-up to 07cc50f8ebc6ad4c2ad23642ca727d79dab8855e #17018 - add config-comparison exception for `HAVE_SSL_SET_QUIC_TLS_CBS`. Follow-up to 5eefdd71a394d135c0ffb56fb8ec117c87dbe4f0 #17027 - detect `wolfSSL_get_peer_certificate` like autotools does. - detect `wolfSSL_UseALPN` like autotools does. Closes #17082 --- diff --git a/.github/scripts/cmp-config.pl b/.github/scripts/cmp-config.pl index 8a5246169b..2119142b4a 100755 --- a/.github/scripts/cmp-config.pl +++ b/.github/scripts/cmp-config.pl @@ -67,6 +67,7 @@ my %remove = ( '#define HAVE_OPENSSL_SSL_H 1' => 1, '#define HAVE_OPENSSL_X509_H 1' => 1, '#define HAVE_QUICHE_H 1' => 1, + '#define HAVE_SSL_SET_QUIC_TLS_CBS 1' => 1, '#define HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT 1' => 1, '#define HAVE_STDINT_H 1' => 1, '#define HAVE_STDIO_H 1' => 1, diff --git a/CMakeLists.txt b/CMakeLists.txt index 50386b47fa..3ee720fbe1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,26 +23,6 @@ ########################################################################### # by Tetetest and Sukender (Benoit Neil) -# Note: By default this CMake build script detects the version of some -# dependencies using `check_symbol_exists`. Those checks do not work in -# the case that both CURL and its dependency are included as sub-projects -# in a larger build using `FetchContent`. To support that case, additional -# variables may be defined by the parent project, ideally in the "extra" -# find package redirect file: -# https://cmake.org/cmake/help/latest/module/FetchContent.html#integrating-with-find-package -# -# The following variables are available: -# HAVE_SSL_SET0_WBIO: `SSL_set0_wbio` present in OpenSSL -# HAVE_OPENSSL_SRP: `SSL_CTX_set_srp_username` present in OpenSSL -# HAVE_GNUTLS_SRP: `gnutls_srp_verifier` present in GnuTLS -# HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT: `SSL_set_quic_use_legacy_codepoint` present in OpenSSL/wolfSSL -# HAVE_QUICHE_CONN_SET_QLOG_FD: `quiche_conn_set_qlog_fd` present in quiche -# HAVE_ECH: ECH API checks for OpenSSL, BoringSSL, wolfSSL or rustls-ffi -# -# For each of the above variables, if the variable is DEFINED (either -# to ON or OFF), the symbol detection is skipped. If the variable is -# NOT DEFINED, the symbol detection is performed. - cmake_minimum_required(VERSION 3.7...3.16 FATAL_ERROR) message(STATUS "Using CMake version ${CMAKE_VERSION}") @@ -1048,26 +1028,32 @@ macro(curl_openssl_check_exists) cmake_pop_check_state() endmacro() -# Ensure that the OpenSSL fork actually supports QUIC. +# Ensure that OpenSSL (or fork) or wolfSSL actually supports QUICTLS API. macro(curl_openssl_check_quic) - if(NOT DEFINED HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT) - if(USE_OPENSSL AND NOT USE_OPENSSL_QUIC) - if(OPENSSL_VERSION VERSION_GREATER_EQUAL 3.5.0 AND NOT USE_OPENSSL_QUIC) - curl_openssl_check_exists("SSL_set_quic_tls_cbs" HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT) - else() + if(USE_OPENSSL AND NOT USE_OPENSSL_QUIC) + if(OPENSSL_VERSION VERSION_GREATER_EQUAL 3.5.0) + if(NOT DEFINED HAVE_SSL_SET_QUIC_TLS_CBS) + curl_openssl_check_exists("SSL_set_quic_tls_cbs" HAVE_SSL_SET_QUIC_TLS_CBS) + endif() + else() + if(NOT DEFINED HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT) curl_openssl_check_exists("SSL_set_quic_use_legacy_codepoint" HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT) endif() endif() - if(USE_WOLFSSL) - curl_openssl_check_exists("wolfSSL_set_quic_use_legacy_codepoint" HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT) - endif() endif() - if(NOT HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT) - message(FATAL_ERROR "QUIC support is missing in OpenSSL fork. Try setting -DOPENSSL_ROOT_DIR") + if(USE_WOLFSSL AND NOT DEFINED HAVE_WOLFSSL_SET_QUIC_USE_LEGACY_CODEPOINT) + curl_openssl_check_exists("wolfSSL_set_quic_use_legacy_codepoint" HAVE_WOLFSSL_SET_QUIC_USE_LEGACY_CODEPOINT) + endif() + if(NOT HAVE_SSL_SET_QUIC_TLS_CBS AND + NOT HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT AND + NOT HAVE_WOLFSSL_SET_QUIC_USE_LEGACY_CODEPOINT) + message(FATAL_ERROR "QUICTLS API support is missing from OpenSSL/fork/wolfSSL. Try setting -DOPENSSL_ROOT_DIR") endif() endmacro() if(USE_WOLFSSL) + curl_openssl_check_exists("wolfSSL_get_peer_certificate" HAVE_WOLFSSL_GET_PEER_CERTIFICATE) + curl_openssl_check_exists("wolfSSL_UseALPN" HAVE_WOLFSSL_USEALPN) curl_openssl_check_exists("wolfSSL_DES_ecb_encrypt" HAVE_WOLFSSL_DES_ECB_ENCRYPT) curl_openssl_check_exists("wolfSSL_BIO_new" HAVE_WOLFSSL_BIO) curl_openssl_check_exists("wolfSSL_BIO_set_shutdown" HAVE_WOLFSSL_FULL_BIO) diff --git a/docs/INSTALL-CMAKE.md b/docs/INSTALL-CMAKE.md index afc0a758ff..65dc394ec0 100644 --- a/docs/INSTALL-CMAKE.md +++ b/docs/INSTALL-CMAKE.md @@ -464,6 +464,43 @@ Details via CMake - `TEST_NGHTTPX`: Default: `nghttpx` - `VSFTPD`: Default: `vsftps` +## Feature detection variables + +By default this CMake build script detects the version of some dependencies +using `check_symbol_exists`. Those checks do not work in the case that both +CURL and its dependency are included as sub-projects in a larger build using +`FetchContent`. To support that case, additional variables may be defined by +the parent project, ideally in the "extra" find package redirect file: + + +Available variables: + +- `HAVE_GNUTLS_SRP`: `gnutls_srp_verifier` present in GnuTLS. +- `HAVE_GSS_C_NT_HOSTBASED_SERVICE`: `GSS_C_NT_HOSTBASED_SERVICE` present in GSS/Heimdal/Kerberos. +- `HAVE_LDAP_INIT_FD`: `ldap_init_fd` present in LDAP library. +- `HAVE_LDAP_URL_PARSE`: `ldap_url_parse` present in LDAP library. +- `HAVE_OPENSSL_SRP`: `SSL_CTX_set_srp_username` present in OpenSSL (or fork). +- `HAVE_QUICHE_CONN_SET_QLOG_FD`: `quiche_conn_set_qlog_fd` present in quiche. +- `HAVE_RUSTLS_SUPPORTED_HPKE`: `rustls_supported_hpke` present in Rustls (unused if Rustls is detected via `pkg-config`). +- `HAVE_SSL_SET0_WBIO`: `SSL_set0_wbio` present in OpenSSL (or fork). +- `HAVE_SSL_SET1_ECH_CONFIG_LIST`: `SSL_set1_ech_config_list` present in OpenSSL (or fork). +- `HAVE_SSL_SET_QUIC_TLS_CBS`: `SSL_set_quic_tls_cbs` in OpenSSL. +- `HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT`: `SSL_set_quic_use_legacy_codepoint` in OpenSSL fork. +- `HAVE_WOLFSSL_BIO`: `wolfSSL_BIO_new` present in wolfSSL. +- `HAVE_WOLFSSL_CTX_GENERATEECHCONFIG`: `wolfSSL_CTX_GenerateEchConfig` present in wolfSSL. +- `HAVE_WOLFSSL_DES_ECB_ENCRYPT`: `wolfSSL_DES_ecb_encrypt` present in wolfSSL. +- `HAVE_WOLFSSL_FULL_BIO`: `wolfSSL_BIO_set_shutdown` present in wolfSSL. +- `HAVE_WOLFSSL_GET_PEER_CERTIFICATE`: `wolfSSL_get_peer_certificate` present in wolfSSL. +- `HAVE_WOLFSSL_SET_QUIC_USE_LEGACY_CODEPOINT`: + `wolfSSL_set_quic_use_legacy_codepoint` present in wolfSSL. +- `HAVE_WOLFSSL_USEALPN`: `wolfSSL_UseALPN` present in wolfSSL. + +For each of the above variables, if the variable is *defined* (either to `ON` +or `OFF`), the symbol detection is skipped. If the variable is *not defined*, +the feature detection is performed. + +Note: These variables are internal and subject to change. + # Migrating from Visual Studio IDE Project Files We recommend using CMake to build curl with MSVC. diff --git a/lib/curl_config.h.cmake b/lib/curl_config.h.cmake index 736fcc1451..fed94e2458 100644 --- a/lib/curl_config.h.cmake +++ b/lib/curl_config.h.cmake @@ -703,6 +703,12 @@ ${SIZEOF_TIME_T_CODE} /* if wolfSSL is enabled */ #cmakedefine USE_WOLFSSL 1 +/* if wolfSSL has the wolfSSL_get_peer_certificate function. */ +#cmakedefine HAVE_WOLFSSL_GET_PEER_CERTIFICATE 1 + +/* if wolfSSL has the wolfSSL_UseALPN function. */ +#cmakedefine HAVE_WOLFSSL_USEALPN 1 + /* if wolfSSL has the wolfSSL_DES_ecb_encrypt function. */ #cmakedefine HAVE_WOLFSSL_DES_ECB_ENCRYPT 1