2018-10-11 10:15:24 +03:00
#***************************************************************************
2014-01-02 01:35:59 +04:00
# _ _ ____ _
# Project ___| | | | _ \| |
# / __| | | | |_) | |
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
2023-01-02 15:51:48 +03:00
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
2014-01-02 01:35:59 +04:00
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
2020-11-04 16:02:01 +03:00
# are also available at https://curl.se/docs/copyright.html.
2014-01-02 01:35:59 +04:00
#
# 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.
#
2009-04-08 01:00:50 +04:00
# SPDX-License-Identifier: curl
2022-05-17 12:16:50 +03:00
#
2014-01-02 01:35:59 +04:00
###########################################################################
2009-04-09 23:59:38 +04:00
# by Tetetest and Sukender (Benoit Neil)
2009-04-02 17:14:53 +04:00
2022-10-02 22:43:07 +03:00
# 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:
2023-09-27 16:40:54 +03:00
# HAVE_SSL_SET0_WBIO: `SSL_set0_wbio` present in OpenSSL/wolfSSL
# HAVE_OPENSSL_SRP: `SSL_CTX_set_srp_username` present in OpenSSL/wolfSSL
# HAVE_GNUTLS_SRP: `gnutls_srp_verifier` present in GnuTLS
2023-03-14 14:57:31 +03:00
# HAVE_SSL_CTX_SET_QUIC_METHOD: `SSL_CTX_set_quic_method` present in OpenSSL/wolfSSL
2022-10-02 22:43:07 +03:00
# HAVE_QUICHE_CONN_SET_QLOG_FD: `quiche_conn_set_qlog_fd` present in QUICHE
2024-04-16 11:10:11 +03:00
# HAVE_ECH: ECH API checks for OpenSSL, BoringSSL or wolfSSL
2022-10-02 22:43:07 +03:00
#
# For each of the above variables, if the variable is DEFINED (either
# to ON or OFF), the symbol detection will be skipped. If the
# variable is NOT DEFINED, the symbol detection will be performed.
2022-12-26 12:25:23 +03:00
cmake_minimum_required ( VERSION 3.7...3.16 FATAL_ERROR )
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
message ( STATUS "Using CMake version ${CMAKE_VERSION}" )
2020-02-24 15:34:54 +03:00
2009-06-09 21:29:16 +04:00
set ( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}" )
include ( Utilities )
2014-08-06 16:46:01 +04:00
include ( Macros )
2016-08-08 09:37:29 +03:00
include ( CMakeDependentOption )
2017-08-17 16:55:38 +03:00
include ( CheckCCompilerFlag )
2009-04-09 03:20:04 +04:00
2018-07-17 09:36:59 +03:00
project ( CURL C )
2009-06-10 18:08:00 +04:00
2020-02-24 15:34:54 +03:00
file ( STRINGS ${ CURL_SOURCE_DIR } /include/curl/curlver.h CURL_VERSION_H_CONTENTS REGEX "#define LIBCURL_VERSION( |_NUM )" )
2018-07-17 09:36:59 +03:00
string ( REGEX MATCH "#define LIBCURL_VERSION \" [^\ "]*"
2014-10-14 13:38:16 +04:00
C U R L _ V E R S I O N $ { C U R L _ V E R S I O N _ H _ C O N T E N T S } )
2018-07-17 09:36:59 +03:00
string ( REGEX REPLACE "[^\" ]+\ "" "" CURL_VERSION ${ CURL_VERSION } )
string ( REGEX MATCH "#define LIBCURL_VERSION_NUM 0x[0-9a-fA-F]+"
2014-10-14 13:38:16 +04:00
C U R L _ V E R S I O N _ N U M $ { C U R L _ V E R S I O N _ H _ C O N T E N T S } )
2018-07-17 09:36:59 +03:00
string ( REGEX REPLACE "[^0]+0x" "" CURL_VERSION_NUM ${ CURL_VERSION_NUM } )
2009-04-02 17:14:53 +04:00
# Setup package meta-data
2024-05-19 19:49:42 +03:00
# set(PACKAGE "curl")
2009-06-10 18:08:00 +04:00
message ( STATUS "curl version=[${CURL_VERSION}]" )
2024-05-19 19:49:42 +03:00
# set(PACKAGE_TARNAME "curl")
# set(PACKAGE_NAME "curl")
# set(PACKAGE_VERSION "-")
# set(PACKAGE_STRING "curl-")
# set(PACKAGE_BUGREPORT "a suitable curl mailing list => https://curl.se/mail/")
2009-06-09 21:29:16 +04:00
set ( OPERATING_SYSTEM "${CMAKE_SYSTEM_NAME}" )
2022-07-11 22:41:31 +03:00
if ( CMAKE_C_COMPILER_TARGET )
set ( OS "\" ${ CMAKE_C_COMPILER_TARGET } \"")
else ( )
set ( OS "\" ${ CMAKE_SYSTEM_NAME } \"")
endif ( )
2009-04-02 17:14:53 +04:00
2018-07-17 09:36:59 +03:00
include_directories ( ${ CURL_SOURCE_DIR } /include )
2009-04-02 17:14:53 +04:00
2023-05-09 13:10:40 +03:00
set ( CMAKE_UNITY_BUILD_BATCH_SIZE 0 )
2017-07-06 13:12:31 +03:00
option ( CURL_WERROR "Turn compiler warnings into errors" OFF )
2017-08-17 16:55:38 +03:00
option ( PICKY_COMPILER "Enable picky compiler options" ON )
2016-10-18 14:59:54 +03:00
option ( BUILD_CURL_EXE "Set to ON to build curl executable." ON )
2018-07-10 12:54:34 +03:00
option ( BUILD_SHARED_LIBS "Build shared libraries" ON )
2023-09-13 15:55:58 +03:00
option ( BUILD_STATIC_LIBS "Build static libraries" OFF )
2023-06-22 12:24:37 +03:00
option ( BUILD_STATIC_CURL "Build curl executable with static libcurl" OFF )
2014-11-06 03:32:45 +03:00
option ( ENABLE_ARES "Set to ON to enable c-ares support" OFF )
2023-12-06 12:16:36 +03:00
option ( CURL_DISABLE_INSTALL "Set to ON to disable installation targets" OFF )
2023-11-07 00:19:00 +03:00
2016-08-08 09:37:29 +03:00
if ( WIN32 )
2017-07-02 02:02:12 +03:00
option ( CURL_STATIC_CRT "Set to ON to build libcurl with static CRT on Windows (/MT)." OFF )
2020-08-22 11:04:29 +03:00
option ( ENABLE_UNICODE "Set to ON to use the Unicode version of the Windows API functions" OFF )
2020-01-14 22:28:20 +03:00
set ( CURL_TARGET_WINDOWS_VERSION "" CACHE STRING "Minimum target Windows version as hex string" )
if ( CURL_TARGET_WINDOWS_VERSION )
add_definitions ( -D_WIN32_WINNT= ${ CURL_TARGET_WINDOWS_VERSION } )
2023-01-10 00:38:28 +03:00
list ( APPEND CMAKE_REQUIRED_DEFINITIONS -D_WIN32_WINNT= ${ CURL_TARGET_WINDOWS_VERSION } )
2022-09-01 20:50:29 +03:00
set ( CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -D_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION}" )
2020-01-14 22:28:20 +03:00
endif ( )
2020-08-22 11:04:29 +03:00
if ( ENABLE_UNICODE )
add_definitions ( -DUNICODE -D_UNICODE )
if ( MINGW )
add_compile_options ( -municode )
endif ( )
endif ( )
2016-08-08 09:37:29 +03:00
endif ( )
2020-01-09 14:10:55 +03:00
option ( CURL_LTO "Turn on compiler Link Time Optimizations" OFF )
2017-08-01 20:40:29 +03:00
2018-07-17 09:36:59 +03:00
cmake_dependent_option ( ENABLE_THREADED_RESOLVER "Set to ON to enable threaded DNS lookup"
2024-06-25 14:12:30 +03:00
O N " N O T E N A B L E _ A R E S "
O F F )
2017-08-01 20:40:29 +03:00
2023-04-17 01:28:25 +03:00
include ( PickyWarnings )
2017-08-17 16:55:38 +03:00
2024-05-27 15:33:54 +03:00
option ( ENABLE_DEBUG "Set to ON to enable curl debug features" OFF )
option ( ENABLE_CURLDEBUG "Set to ON to build with TrackMemory feature enabled" ${ ENABLE_DEBUG } )
2018-07-17 09:36:59 +03:00
if ( ENABLE_DEBUG )
2024-05-11 03:44:10 +03:00
set_property ( DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS DEBUGBUILD )
2015-03-03 02:15:38 +03:00
endif ( )
2018-07-17 09:36:59 +03:00
if ( ENABLE_CURLDEBUG )
2015-03-03 02:15:38 +03:00
set_property ( DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS CURLDEBUG )
endif ( )
2017-07-06 18:53:41 +03:00
# For debug libs and exes, add "-d" postfix
2018-05-24 00:37:53 +03:00
if ( NOT DEFINED CMAKE_DEBUG_POSTFIX )
set ( CMAKE_DEBUG_POSTFIX "-d" )
endif ( )
2017-07-06 18:53:41 +03:00
2023-06-22 12:24:37 +03:00
set ( LIB_STATIC "libcurl_static" )
set ( LIB_SHARED "libcurl_shared" )
if ( NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS )
set ( BUILD_STATIC_LIBS ON )
endif ( )
if ( NOT BUILD_STATIC_CURL AND NOT BUILD_SHARED_LIBS )
set ( BUILD_STATIC_CURL ON )
elseif ( BUILD_STATIC_CURL AND NOT BUILD_STATIC_LIBS )
set ( BUILD_STATIC_CURL OFF )
endif ( )
# lib flavour selected for curl tool
if ( BUILD_STATIC_CURL )
set ( LIB_SELECTED_FOR_EXE ${ LIB_STATIC } )
else ( )
set ( LIB_SELECTED_FOR_EXE ${ LIB_SHARED } )
endif ( )
# lib flavour selected for example and test programs.
if ( BUILD_SHARED_LIBS )
set ( LIB_SELECTED ${ LIB_SHARED } )
else ( )
set ( LIB_SELECTED ${ LIB_STATIC } )
endif ( )
2009-07-14 23:03:31 +04:00
# initialize CURL_LIBS
set ( CURL_LIBS "" )
2024-06-08 01:41:24 +03:00
set ( LIBCURL_PC_REQUIRES_PRIVATE "" )
2009-07-14 23:03:31 +04:00
2014-11-06 03:32:45 +03:00
if ( ENABLE_ARES )
set ( USE_ARES 1 )
2010-03-24 17:57:54 +03:00
find_package ( CARES REQUIRED )
2018-07-17 09:36:59 +03:00
list ( APPEND CURL_LIBS ${ CARES_LIBRARY } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libcares" )
2009-07-14 23:03:31 +04:00
endif ( )
2009-04-08 15:42:45 +04:00
2016-09-04 13:37:46 +03:00
include ( CurlSymbolHiding )
2009-04-08 01:00:50 +04:00
2021-08-24 21:27:39 +03:00
option ( CURL_ENABLE_EXPORT_TARGET "to enable cmake export target" ON )
mark_as_advanced ( CURL_ENABLE_EXPORT_TARGET )
option ( CURL_DISABLE_ALTSVC "disables alt-svc support" OFF )
mark_as_advanced ( CURL_DISABLE_ALTSVC )
2023-09-27 16:40:54 +03:00
option ( CURL_DISABLE_SRP "disables TLS-SRP support" OFF )
mark_as_advanced ( CURL_DISABLE_SRP )
2021-08-24 21:27:39 +03:00
option ( CURL_DISABLE_COOKIES "disables cookies support" OFF )
mark_as_advanced ( CURL_DISABLE_COOKIES )
2023-07-20 17:09:04 +03:00
option ( CURL_DISABLE_BASIC_AUTH "disables Basic authentication" OFF )
mark_as_advanced ( CURL_DISABLE_BASIC_AUTH )
option ( CURL_DISABLE_BEARER_AUTH "disables Bearer authentication" OFF )
mark_as_advanced ( CURL_DISABLE_BEARER_AUTH )
option ( CURL_DISABLE_DIGEST_AUTH "disables Digest authentication" OFF )
mark_as_advanced ( CURL_DISABLE_DIGEST_AUTH )
option ( CURL_DISABLE_KERBEROS_AUTH "disables Kerberos authentication" OFF )
mark_as_advanced ( CURL_DISABLE_KERBEROS_AUTH )
option ( CURL_DISABLE_NEGOTIATE_AUTH "disables negotiate authentication" OFF )
mark_as_advanced ( CURL_DISABLE_NEGOTIATE_AUTH )
option ( CURL_DISABLE_AWS "disables AWS-SIG4" OFF )
mark_as_advanced ( CURL_DISABLE_AWS )
2009-06-09 21:29:16 +04:00
option ( CURL_DISABLE_DICT "disables DICT" OFF )
mark_as_advanced ( CURL_DISABLE_DICT )
2021-08-24 21:27:39 +03:00
option ( CURL_DISABLE_DOH "disables DNS-over-HTTPS" OFF )
mark_as_advanced ( CURL_DISABLE_DOH )
2009-06-09 21:29:16 +04:00
option ( CURL_DISABLE_FILE "disables FILE" OFF )
mark_as_advanced ( CURL_DISABLE_FILE )
2022-11-15 19:50:22 +03:00
cmake_dependent_option ( CURL_DISABLE_FORM_API "disables form api" OFF
" N O T C U R L _ D I S A B L E _ M I M E " O N )
mark_as_advanced ( CURL_DISABLE_FORM_API )
2021-08-24 21:27:39 +03:00
option ( CURL_DISABLE_FTP "disables FTP" OFF )
mark_as_advanced ( CURL_DISABLE_FTP )
option ( CURL_DISABLE_GETOPTIONS "disables curl_easy_options API for existing options to curl_easy_setopt" OFF )
mark_as_advanced ( CURL_DISABLE_GETOPTIONS )
option ( CURL_DISABLE_GOPHER "disables Gopher" OFF )
mark_as_advanced ( CURL_DISABLE_GOPHER )
2023-11-18 00:42:54 +03:00
option ( CURL_DISABLE_HEADERS_API "disables headers-api support" OFF )
mark_as_advanced ( CURL_DISABLE_HEADERS_API )
2021-08-24 21:27:39 +03:00
option ( CURL_DISABLE_HSTS "disables HSTS support" OFF )
mark_as_advanced ( CURL_DISABLE_HSTS )
2009-06-09 21:29:16 +04:00
option ( CURL_DISABLE_HTTP "disables HTTP" OFF )
mark_as_advanced ( CURL_DISABLE_HTTP )
2021-08-24 21:27:39 +03:00
option ( CURL_DISABLE_HTTP_AUTH "disables all HTTP authentication methods" OFF )
mark_as_advanced ( CURL_DISABLE_HTTP_AUTH )
option ( CURL_DISABLE_IMAP "disables IMAP" OFF )
mark_as_advanced ( CURL_DISABLE_IMAP )
option ( CURL_DISABLE_LDAP "disables LDAP" OFF )
mark_as_advanced ( CURL_DISABLE_LDAP )
option ( CURL_DISABLE_LDAPS "disables LDAPS" OFF )
2009-06-09 21:29:16 +04:00
mark_as_advanced ( CURL_DISABLE_LDAPS )
2021-08-24 21:27:39 +03:00
option ( CURL_DISABLE_LIBCURL_OPTION "disables --libcurl option from the curl tool" OFF )
mark_as_advanced ( CURL_DISABLE_LIBCURL_OPTION )
option ( CURL_DISABLE_MIME "disables MIME support" OFF )
mark_as_advanced ( CURL_DISABLE_MIME )
option ( CURL_DISABLE_MQTT "disables MQTT" OFF )
2023-11-17 00:08:49 +03:00
mark_as_advanced ( CURL_DISABLE_BINDLOCAL )
option ( CURL_DISABLE_BINDLOCAL "disables local binding support" OFF )
2021-08-24 21:27:39 +03:00
mark_as_advanced ( CURL_DISABLE_MQTT )
option ( CURL_DISABLE_NETRC "disables netrc parser" OFF )
mark_as_advanced ( CURL_DISABLE_NETRC )
option ( CURL_DISABLE_NTLM "disables NTLM support" OFF )
mark_as_advanced ( CURL_DISABLE_NTLM )
option ( CURL_DISABLE_PARSEDATE "disables date parsing" OFF )
mark_as_advanced ( CURL_DISABLE_PARSEDATE )
option ( CURL_DISABLE_POP3 "disables POP3" OFF )
2014-08-15 15:51:08 +04:00
mark_as_advanced ( CURL_DISABLE_POP3 )
2021-08-24 21:27:39 +03:00
option ( CURL_DISABLE_PROGRESS_METER "disables built-in progress meter" OFF )
mark_as_advanced ( CURL_DISABLE_PROGRESS_METER )
option ( CURL_DISABLE_PROXY "disables proxy support" OFF )
mark_as_advanced ( CURL_DISABLE_PROXY )
option ( CURL_DISABLE_RTSP "disables RTSP" OFF )
mark_as_advanced ( CURL_DISABLE_RTSP )
option ( CURL_DISABLE_SHUFFLE_DNS "disables shuffle DNS feature" OFF )
mark_as_advanced ( CURL_DISABLE_SHUFFLE_DNS )
option ( CURL_DISABLE_SMB "disables SMB" OFF )
mark_as_advanced ( CURL_DISABLE_SMB )
option ( CURL_DISABLE_SMTP "disables SMTP" OFF )
2014-08-15 15:51:08 +04:00
mark_as_advanced ( CURL_DISABLE_SMTP )
2021-08-24 21:27:39 +03:00
option ( CURL_DISABLE_SOCKETPAIR "disables use of socketpair for curl_multi_poll" OFF )
mark_as_advanced ( CURL_DISABLE_SOCKETPAIR )
option ( CURL_DISABLE_TELNET "disables Telnet" OFF )
mark_as_advanced ( CURL_DISABLE_TELNET )
option ( CURL_DISABLE_TFTP "disables TFTP" OFF )
mark_as_advanced ( CURL_DISABLE_TFTP )
option ( CURL_DISABLE_VERBOSE_STRINGS "disables verbose strings" OFF )
mark_as_advanced ( CURL_DISABLE_VERBOSE_STRINGS )
2021-05-14 13:36:12 +03:00
2021-08-20 19:29:10 +03:00
# Corresponds to HTTP_ONLY in lib/curl_setup.h
2021-08-24 21:27:39 +03:00
option ( HTTP_ONLY "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF )
mark_as_advanced ( HTTP_ONLY )
2009-06-09 21:29:16 +04:00
if ( HTTP_ONLY )
2020-09-07 12:08:35 +03:00
set ( CURL_DISABLE_DICT ON )
set ( CURL_DISABLE_FILE ON )
2009-06-09 21:29:16 +04:00
set ( CURL_DISABLE_FTP ON )
2020-09-07 12:08:35 +03:00
set ( CURL_DISABLE_GOPHER ON )
set ( CURL_DISABLE_IMAP ON )
2009-06-09 21:29:16 +04:00
set ( CURL_DISABLE_LDAP ON )
2012-03-30 20:59:47 +04:00
set ( CURL_DISABLE_LDAPS ON )
2020-09-07 12:08:35 +03:00
set ( CURL_DISABLE_MQTT ON )
2014-08-15 15:51:08 +04:00
set ( CURL_DISABLE_POP3 ON )
2020-09-07 12:08:35 +03:00
set ( CURL_DISABLE_RTSP ON )
2019-12-14 01:23:11 +03:00
set ( CURL_DISABLE_SMB ON )
2014-08-15 15:51:08 +04:00
set ( CURL_DISABLE_SMTP ON )
2020-09-07 12:08:35 +03:00
set ( CURL_DISABLE_TELNET ON )
set ( CURL_DISABLE_TFTP ON )
2009-06-09 21:29:16 +04:00
endif ( )
2024-06-04 00:06:56 +03:00
if ( WINDOWS_STORE )
set ( CURL_DISABLE_TELNET ON ) # telnet code needs fixing to compile for UWP.
endif ( )
2014-10-13 13:19:36 +04:00
option ( ENABLE_IPV6 "Define if you want to enable IPv6 support" ON )
2009-06-09 21:29:16 +04:00
mark_as_advanced ( ENABLE_IPV6 )
2015-09-03 15:20:32 +03:00
if ( ENABLE_IPV6 AND NOT WIN32 )
2014-10-13 13:19:36 +04:00
include ( CheckStructHasMember )
check_struct_has_member ( "struct sockaddr_in6" sin6_addr "netinet/in.h"
H A V E _ S O C K A D D R _ I N 6 _ S I N 6 _ A D D R )
check_struct_has_member ( "struct sockaddr_in6" sin6_scope_id "netinet/in.h"
H A V E _ S O C K A D D R _ I N 6 _ S I N 6 _ S C O P E _ I D )
if ( NOT HAVE_SOCKADDR_IN6_SIN6_ADDR )
message ( WARNING "struct sockaddr_in6 not available, disabling IPv6 support" )
# Force the feature off as this name is used as guard macro...
set ( ENABLE_IPV6 OFF
C A C H E B O O L " D e f i n e i f y o u w a n t t o e n a b l e I P v 6 s u p p o r t " F O R C E )
endif ( )
2021-10-19 15:56:02 +03:00
2024-05-19 19:42:11 +03:00
if ( APPLE AND NOT ENABLE_ARES )
2023-09-20 04:36:39 +03:00
set ( use_core_foundation_and_core_services ON )
2021-10-19 15:56:02 +03:00
find_library ( SYSTEMCONFIGURATION_FRAMEWORK "SystemConfiguration" )
if ( NOT SYSTEMCONFIGURATION_FRAMEWORK )
message ( FATAL_ERROR "SystemConfiguration framework not found" )
endif ( )
list ( APPEND CURL_LIBS "-framework SystemConfiguration" )
endif ( )
2014-10-13 13:19:36 +04:00
endif ( )
2024-04-11 15:01:58 +03:00
if ( ENABLE_IPV6 )
set ( USE_IPV6 ON )
endif ( )
2009-06-09 21:29:16 +04:00
2017-09-26 10:42:12 +03:00
find_package ( Perl )
2024-01-24 15:25:15 +03:00
option ( BUILD_LIBCURL_DOCS "to build libcurl man pages" ON )
2024-03-27 12:56:24 +03:00
option ( BUILD_MISC_DOCS "to build misc man pages (e.g. curl-config and mk-ca-bundle)" ON )
2024-03-07 01:24:56 +03:00
option ( ENABLE_CURL_MANUAL "to build the man page for curl and enable its -M/--manual option" ON )
2024-01-24 15:25:15 +03:00
if ( ENABLE_CURL_MANUAL OR BUILD_LIBCURL_DOCS )
if ( PERL_FOUND )
2024-03-04 19:22:17 +03:00
set ( HAVE_MANUAL_TOOLS ON )
2024-01-24 15:25:15 +03:00
endif ( )
if ( NOT HAVE_MANUAL_TOOLS )
2024-03-04 19:22:17 +03:00
message ( WARNING "Perl not found. Will not build manuals." )
2024-01-21 18:38:09 +03:00
endif ( )
2014-10-12 13:27:07 +04:00
endif ( )
2009-04-02 17:14:53 +04:00
2017-07-02 02:02:12 +03:00
if ( CURL_STATIC_CRT )
2020-03-30 13:31:21 +03:00
set ( CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>" )
2017-07-02 02:02:12 +03:00
set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT" )
set ( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd" )
endif ( )
2009-04-02 17:14:53 +04:00
# Disable warnings on Borland to avoid changing 3rd party code.
2009-06-09 21:29:16 +04:00
if ( BORLAND )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-" )
2018-07-05 13:55:47 +03:00
endif ( )
2009-04-02 17:14:53 +04:00
# If we are on AIX, do the _ALL_SOURCE magic
2009-06-09 21:29:16 +04:00
if ( ${ CMAKE_SYSTEM_NAME } MATCHES AIX )
set ( _ALL_SOURCE 1 )
2018-07-05 13:55:47 +03:00
endif ( )
2009-04-02 17:14:53 +04:00
2023-03-19 10:07:51 +03:00
# If we are on Haiku, make sure that the network library is brought in.
2023-04-12 04:11:41 +03:00
if ( ${ CMAKE_SYSTEM_NAME } MATCHES Haiku )
2023-03-19 10:07:51 +03:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lnetwork" )
endif ( )
2009-04-02 17:14:53 +04:00
# Include all the necessary files for macros
2019-11-27 01:05:21 +03:00
include ( CMakePushCheckState )
2018-07-17 09:36:59 +03:00
include ( CheckFunctionExists )
include ( CheckIncludeFile )
include ( CheckIncludeFiles )
include ( CheckLibraryExists )
include ( CheckSymbolExists )
include ( CheckTypeSize )
include ( CheckCSourceCompiles )
2009-04-02 17:14:53 +04:00
# On windows preload settings
2009-06-09 21:29:16 +04:00
if ( WIN32 )
include ( ${ CMAKE_CURRENT_SOURCE_DIR } /CMake/Platforms/WindowsCache.cmake )
2018-07-05 13:55:47 +03:00
endif ( )
2009-04-02 17:14:53 +04:00
2014-11-06 03:32:45 +03:00
if ( ENABLE_THREADED_RESOLVER )
2016-08-08 09:37:29 +03:00
if ( WIN32 )
set ( USE_THREADS_WIN32 ON )
else ( )
2023-10-26 11:28:20 +03:00
find_package ( Threads REQUIRED )
2017-08-01 20:40:29 +03:00
set ( USE_THREADS_POSIX ${ CMAKE_USE_PTHREADS_INIT } )
set ( HAVE_PTHREAD_H ${ CMAKE_USE_PTHREADS_INIT } )
2023-10-26 11:28:20 +03:00
set ( CURL_LIBS ${ CURL_LIBS } ${ CMAKE_THREAD_LIBS_INIT } )
2014-11-06 03:32:45 +03:00
endif ( )
endif ( )
2009-04-02 17:14:53 +04:00
# Check for all needed libraries
2023-10-09 11:31:04 +03:00
check_library_exists ( "socket" "connect" "" HAVE_LIBSOCKET )
if ( HAVE_LIBSOCKET )
set ( CURL_LIBS "socket;${CURL_LIBS}" )
endif ( )
2009-06-09 21:29:16 +04:00
2014-11-06 03:32:43 +03:00
check_function_exists ( gethostname HAVE_GETHOSTNAME )
2012-03-30 20:59:47 +04:00
if ( WIN32 )
2023-11-11 21:38:02 +03:00
list ( APPEND CURL_LIBS "ws2_32" "bcrypt" )
2014-08-08 12:23:26 +04:00
endif ( )
2017-01-26 03:35:54 +03:00
# check SSL libraries
2021-10-04 03:58:28 +03:00
option ( CURL_ENABLE_SSL "Enable SSL support" ON )
2014-08-21 15:15:59 +04:00
2023-09-30 14:13:27 +03:00
if ( CURL_DEFAULT_SSL_BACKEND )
set ( valid_default_ssl_backend FALSE )
endif ( )
2017-01-26 03:05:07 +03:00
if ( APPLE )
2023-08-31 16:28:49 +03:00
cmake_dependent_option ( CURL_USE_SECTRANSP "Enable Apple OS native SSL/TLS" OFF CURL_ENABLE_SSL OFF )
2017-01-26 03:05:07 +03:00
endif ( )
2016-01-27 15:22:39 +03:00
if ( WIN32 )
2023-08-31 16:28:49 +03:00
cmake_dependent_option ( CURL_USE_SCHANNEL "Enable Windows native SSL/TLS" OFF CURL_ENABLE_SSL OFF )
2024-03-06 14:43:40 +03:00
option ( CURL_WINDOWS_SSPI "Enable SSPI on Windows" ${ CURL_USE_SCHANNEL } )
2016-01-27 15:22:39 +03:00
endif ( )
2021-11-22 19:39:46 +03:00
cmake_dependent_option ( CURL_USE_MBEDTLS "Enable mbedTLS for SSL/TLS" OFF CURL_ENABLE_SSL OFF )
cmake_dependent_option ( CURL_USE_BEARSSL "Enable BearSSL for SSL/TLS" OFF CURL_ENABLE_SSL OFF )
2023-08-31 16:28:49 +03:00
cmake_dependent_option ( CURL_USE_WOLFSSL "Enable wolfSSL for SSL/TLS" OFF CURL_ENABLE_SSL OFF )
2023-09-27 16:40:54 +03:00
cmake_dependent_option ( CURL_USE_GNUTLS "Enable GnuTLS for SSL/TLS" OFF CURL_ENABLE_SSL OFF )
2016-01-27 15:22:39 +03:00
2017-01-26 03:35:54 +03:00
set ( openssl_default ON )
2023-07-30 00:44:28 +03:00
if ( WIN32 OR CURL_USE_SECTRANSP OR CURL_USE_SCHANNEL OR CURL_USE_MBEDTLS OR CURL_USE_WOLFSSL )
2017-02-21 03:33:53 +03:00
set ( openssl_default OFF )
2017-01-26 03:35:54 +03:00
endif ( )
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
cmake_dependent_option ( CURL_USE_OPENSSL "Enable OpenSSL for SSL/TLS" ${ openssl_default } CURL_ENABLE_SSL OFF )
2021-01-11 14:00:36 +03:00
option ( CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG "Disable automatic loading of OpenSSL configuration" OFF )
2017-01-26 03:35:54 +03:00
2018-07-05 13:21:57 +03:00
count_true ( enabled_ssl_options_count
2021-11-22 19:39:46 +03:00
C U R L _ U S E _ S C H A N N E L
C U R L _ U S E _ S E C T R A N S P
C U R L _ U S E _ O P E N S S L
C U R L _ U S E _ M B E D T L S
C U R L _ U S E _ B E A R S S L
C U R L _ U S E _ W O L F S S L
2024-08-01 23:13:42 +03:00
C U R L _ U S E _ G N U T L S
2017-02-21 03:33:53 +03:00
)
2018-07-05 13:21:57 +03:00
if ( enabled_ssl_options_count GREATER "1" )
2018-06-17 19:26:44 +03:00
set ( CURL_WITH_MULTI_SSL ON )
2017-02-21 03:33:53 +03:00
endif ( )
2021-11-22 19:39:46 +03:00
if ( CURL_USE_SCHANNEL )
2017-01-26 03:35:54 +03:00
set ( SSL_ENABLED ON )
2024-05-19 19:49:42 +03:00
set ( USE_SCHANNEL ON ) # Windows native SSL/TLS support
set ( USE_WINDOWS_SSPI ON ) # CURL_USE_SCHANNEL implies CURL_WINDOWS_SSPI
2023-09-30 14:13:27 +03:00
if ( CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "schannel" )
set ( valid_default_ssl_backend TRUE )
endif ( )
2017-01-26 03:35:54 +03:00
endif ( )
if ( CURL_WINDOWS_SSPI )
set ( USE_WINDOWS_SSPI ON )
endif ( )
2021-11-22 19:39:46 +03:00
if ( CURL_USE_SECTRANSP )
2023-09-20 04:36:39 +03:00
set ( use_core_foundation_and_core_services ON )
2017-01-26 03:35:54 +03:00
2021-10-19 15:56:02 +03:00
find_library ( SECURITY_FRAMEWORK "Security" )
if ( NOT SECURITY_FRAMEWORK )
2024-04-16 11:10:11 +03:00
message ( FATAL_ERROR "Security framework not found" )
2021-05-24 17:38:40 +03:00
endif ( )
2021-06-16 03:12:49 +03:00
2021-10-19 15:56:02 +03:00
set ( SSL_ENABLED ON )
set ( USE_SECTRANSP ON )
list ( APPEND CURL_LIBS "-framework Security" )
2023-09-30 14:13:27 +03:00
if ( CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "secure-transport" )
set ( valid_default_ssl_backend TRUE )
endif ( )
2021-10-19 15:56:02 +03:00
endif ( )
2021-06-16 03:12:49 +03:00
2023-09-20 04:36:39 +03:00
if ( use_core_foundation_and_core_services )
2021-10-19 15:56:02 +03:00
find_library ( COREFOUNDATION_FRAMEWORK "CoreFoundation" )
2023-09-20 04:36:39 +03:00
find_library ( CORESERVICES_FRAMEWORK "CoreServices" )
2021-10-19 15:56:02 +03:00
if ( NOT COREFOUNDATION_FRAMEWORK )
2024-04-16 11:10:11 +03:00
message ( FATAL_ERROR "CoreFoundation framework not found" )
2021-06-16 03:12:49 +03:00
endif ( )
2023-09-20 04:36:39 +03:00
if ( NOT CORESERVICES_FRAMEWORK )
2024-04-16 11:10:11 +03:00
message ( FATAL_ERROR "CoreServices framework not found" )
2023-09-20 04:36:39 +03:00
endif ( )
2021-10-19 15:56:02 +03:00
2024-06-14 14:10:10 +03:00
list ( APPEND CURL_LIBS "-framework CoreFoundation" "-framework CoreServices" )
2021-05-24 17:38:40 +03:00
endif ( )
2021-11-22 19:39:46 +03:00
if ( CURL_USE_OPENSSL )
2017-01-26 03:35:54 +03:00
find_package ( OpenSSL REQUIRED )
set ( SSL_ENABLED ON )
set ( USE_OPENSSL ON )
2018-09-21 18:59:33 +03:00
# Depend on OpenSSL via imported targets if supported by the running
2024-05-19 19:49:42 +03:00
# version of CMake. This allows our dependents to get our dependencies
2018-09-21 18:59:33 +03:00
# transitively.
if ( NOT CMAKE_VERSION VERSION_LESS 3.4 )
list ( APPEND CURL_LIBS OpenSSL::SSL OpenSSL::Crypto )
else ( )
list ( APPEND CURL_LIBS ${ OPENSSL_LIBRARIES } )
include_directories ( ${ OPENSSL_INCLUDE_DIR } )
endif ( )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "openssl" )
2018-07-17 11:13:18 +03:00
2023-09-30 14:13:27 +03:00
if ( CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "openssl" )
set ( valid_default_ssl_backend TRUE )
endif ( )
2024-07-14 11:26:35 +03:00
set ( curl_ca_bundle_supported TRUE )
2023-09-30 14:13:27 +03:00
2017-01-26 03:35:54 +03:00
set ( CMAKE_REQUIRED_INCLUDES ${ OPENSSL_INCLUDE_DIR } )
2022-10-02 22:43:07 +03:00
if ( NOT DEFINED HAVE_BORINGSSL )
check_symbol_exists ( OPENSSL_IS_BORINGSSL "openssl/base.h" HAVE_BORINGSSL )
endif ( )
2023-01-18 19:54:30 +03:00
if ( NOT DEFINED HAVE_AWSLC )
check_symbol_exists ( OPENSSL_IS_AWSLC "openssl/base.h" HAVE_AWSLC )
endif ( )
2014-08-21 15:15:59 +04:00
endif ( )
2021-11-22 19:39:46 +03:00
if ( CURL_USE_MBEDTLS )
2017-01-26 03:41:40 +03:00
find_package ( MbedTLS REQUIRED )
set ( SSL_ENABLED ON )
set ( USE_MBEDTLS ON )
list ( APPEND CURL_LIBS ${ MBEDTLS_LIBRARIES } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "mbedtls" )
2017-06-05 02:02:56 +03:00
include_directories ( ${ MBEDTLS_INCLUDE_DIRS } )
2023-09-30 14:13:27 +03:00
if ( CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "mbedtls" )
set ( valid_default_ssl_backend TRUE )
endif ( )
2024-07-14 11:26:35 +03:00
set ( curl_ca_bundle_supported TRUE )
2017-01-26 03:41:40 +03:00
endif ( )
2021-11-22 19:39:46 +03:00
if ( CURL_USE_BEARSSL )
2019-11-08 07:17:18 +03:00
find_package ( BearSSL REQUIRED )
set ( SSL_ENABLED ON )
set ( USE_BEARSSL ON )
list ( APPEND CURL_LIBS ${ BEARSSL_LIBRARY } )
include_directories ( ${ BEARSSL_INCLUDE_DIRS } )
2023-09-30 14:13:27 +03:00
if ( CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "bearssl" )
set ( valid_default_ssl_backend TRUE )
endif ( )
2024-07-14 11:26:35 +03:00
set ( curl_ca_bundle_supported TRUE )
2019-11-08 07:17:18 +03:00
endif ( )
2021-11-22 19:39:46 +03:00
if ( CURL_USE_WOLFSSL )
2020-03-12 19:18:40 +03:00
find_package ( WolfSSL REQUIRED )
set ( SSL_ENABLED ON )
set ( USE_WOLFSSL ON )
list ( APPEND CURL_LIBS ${ WolfSSL_LIBRARIES } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "wolfssl" )
2020-03-12 19:18:40 +03:00
include_directories ( ${ WolfSSL_INCLUDE_DIRS } )
2023-09-30 14:13:27 +03:00
if ( CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "wolfssl" )
set ( valid_default_ssl_backend TRUE )
endif ( )
2024-07-14 11:26:35 +03:00
set ( curl_ca_bundle_supported TRUE )
2020-03-12 19:18:40 +03:00
endif ( )
2023-08-17 02:09:33 +03:00
if ( CURL_USE_GNUTLS )
2023-09-27 16:40:54 +03:00
find_package ( GnuTLS REQUIRED )
2024-07-27 12:47:56 +03:00
find_package ( nettle REQUIRED )
2023-09-27 16:40:54 +03:00
set ( SSL_ENABLED ON )
set ( USE_GNUTLS ON )
2024-07-27 12:47:56 +03:00
list ( APPEND CURL_LIBS ${ GNUTLS_LIBRARIES } ${ NETTLE_LIBRARIES } )
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "gnutls" "nettle" )
include_directories ( ${ GNUTLS_INCLUDE_DIRS } ${ NETTLE_INCLUDE_DIRS } )
2023-09-27 16:40:54 +03:00
2023-09-30 14:13:27 +03:00
if ( CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "gnutls" )
set ( valid_default_ssl_backend TRUE )
endif ( )
2024-07-14 11:26:35 +03:00
set ( curl_ca_bundle_supported TRUE )
2023-09-30 14:13:27 +03:00
2023-09-27 16:40:54 +03:00
if ( NOT DEFINED HAVE_GNUTLS_SRP AND NOT CURL_DISABLE_SRP )
cmake_push_check_state ( )
set ( CMAKE_REQUIRED_INCLUDES ${ GNUTLS_INCLUDE_DIRS } )
set ( CMAKE_REQUIRED_LIBRARIES ${ GNUTLS_LIBRARIES } )
check_symbol_exists ( gnutls_srp_verifier "gnutls/gnutls.h" HAVE_GNUTLS_SRP )
cmake_pop_check_state ( )
endif ( )
2023-08-17 02:09:33 +03:00
endif ( )
2023-09-30 14:13:27 +03:00
if ( CURL_DEFAULT_SSL_BACKEND AND NOT valid_default_ssl_backend )
message ( FATAL_ERROR "CURL_DEFAULT_SSL_BACKEND '${CURL_DEFAULT_SSL_BACKEND}' not enabled." )
endif ( )
cmake: picky-linker fixes for openssl, ZLIB, H3 and more
- fix HTTP/3 support detection with OpenSSL/quictls built with ZLIB.
(Requires curl be built with ZLIB option also.)
- fix HTTP/3 support detection with OpenSSL/quictls/LibreSSL and `ld`
linker on Windows.
- fix HTTP/3 support detection with wolfSSL to automatically add
`ws2_32` to the lib list on Windows. For all linkers.
- reposition ZLIB (and other compression) detection _after_ TLS
detection, but before calling HTTP/3-support detection via
`CheckQuicSupportInOpenSSL`.
May be a regression from ebef55a61df0094b9790710a42f63c48e7de3c13
May fix #10832 (Reported-by: Micah Snyder)
This also seems to fix an odd case, where OpenSSL/quictls is correctly
detected, but its header path is not set while compiling, breaking
build at `src/curl_ntlm_core.c`. Reason for this remains undiscovered.
- satisfy "picky" linkers such as `ld` with MinGW, that are highly
sensitive to lib order, by also adding brotli to the beginning of the
lib list.
- satisfy "picky" linkers by adding certain Windows systems libs to
the lib list for OpenSSL/LibreSSL. (Might need additional ones for
other forks, such as `pthread` for BoringSSL.)
Note: It'd make sense to _always_ add `ws2_32`, `crypt32` (except
Windows App targets perhaps?), `bcrypt` (except old-mingw!) on Windows
at this point. They are almost always required, and if some aren't,
they are ignored by the linker with no effect on final binaries.
Closes #10857
2023-03-30 11:55:20 +03:00
# Keep ZLIB detection after TLS detection,
2023-07-31 13:52:56 +03:00
# and before calling openssl_check_symbol_exists().
cmake: picky-linker fixes for openssl, ZLIB, H3 and more
- fix HTTP/3 support detection with OpenSSL/quictls built with ZLIB.
(Requires curl be built with ZLIB option also.)
- fix HTTP/3 support detection with OpenSSL/quictls/LibreSSL and `ld`
linker on Windows.
- fix HTTP/3 support detection with wolfSSL to automatically add
`ws2_32` to the lib list on Windows. For all linkers.
- reposition ZLIB (and other compression) detection _after_ TLS
detection, but before calling HTTP/3-support detection via
`CheckQuicSupportInOpenSSL`.
May be a regression from ebef55a61df0094b9790710a42f63c48e7de3c13
May fix #10832 (Reported-by: Micah Snyder)
This also seems to fix an odd case, where OpenSSL/quictls is correctly
detected, but its header path is not set while compiling, breaking
build at `src/curl_ntlm_core.c`. Reason for this remains undiscovered.
- satisfy "picky" linkers such as `ld` with MinGW, that are highly
sensitive to lib order, by also adding brotli to the beginning of the
lib list.
- satisfy "picky" linkers by adding certain Windows systems libs to
the lib list for OpenSSL/LibreSSL. (Might need additional ones for
other forks, such as `pthread` for BoringSSL.)
Note: It'd make sense to _always_ add `ws2_32`, `crypt32` (except
Windows App targets perhaps?), `bcrypt` (except old-mingw!) on Windows
at this point. They are almost always required, and if some aren't,
they are ignored by the linker with no effect on final binaries.
Closes #10857
2023-03-30 11:55:20 +03:00
set ( HAVE_LIBZ OFF )
set ( USE_ZLIB OFF )
optional_dependency ( ZLIB )
if ( ZLIB_FOUND )
set ( HAVE_LIBZ ON )
set ( USE_ZLIB ON )
# Depend on ZLIB via imported targets if supported by the running
# version of CMake. This allows our dependents to get our dependencies
# transitively.
if ( NOT CMAKE_VERSION VERSION_LESS 3.4 )
list ( APPEND CURL_LIBS ZLIB::ZLIB )
else ( )
list ( APPEND CURL_LIBS ${ ZLIB_LIBRARIES } )
include_directories ( ${ ZLIB_INCLUDE_DIRS } )
endif ( )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "zlib" )
cmake: picky-linker fixes for openssl, ZLIB, H3 and more
- fix HTTP/3 support detection with OpenSSL/quictls built with ZLIB.
(Requires curl be built with ZLIB option also.)
- fix HTTP/3 support detection with OpenSSL/quictls/LibreSSL and `ld`
linker on Windows.
- fix HTTP/3 support detection with wolfSSL to automatically add
`ws2_32` to the lib list on Windows. For all linkers.
- reposition ZLIB (and other compression) detection _after_ TLS
detection, but before calling HTTP/3-support detection via
`CheckQuicSupportInOpenSSL`.
May be a regression from ebef55a61df0094b9790710a42f63c48e7de3c13
May fix #10832 (Reported-by: Micah Snyder)
This also seems to fix an odd case, where OpenSSL/quictls is correctly
detected, but its header path is not set while compiling, breaking
build at `src/curl_ntlm_core.c`. Reason for this remains undiscovered.
- satisfy "picky" linkers such as `ld` with MinGW, that are highly
sensitive to lib order, by also adding brotli to the beginning of the
lib list.
- satisfy "picky" linkers by adding certain Windows systems libs to
the lib list for OpenSSL/LibreSSL. (Might need additional ones for
other forks, such as `pthread` for BoringSSL.)
Note: It'd make sense to _always_ add `ws2_32`, `crypt32` (except
Windows App targets perhaps?), `bcrypt` (except old-mingw!) on Windows
at this point. They are almost always required, and if some aren't,
they are ignored by the linker with no effect on final binaries.
Closes #10857
2023-03-30 11:55:20 +03:00
list ( APPEND CMAKE_REQUIRED_INCLUDES ${ ZLIB_INCLUDE_DIRS } )
endif ( )
option ( CURL_BROTLI "Set to ON to enable building curl with brotli support." OFF )
set ( HAVE_BROTLI OFF )
if ( CURL_BROTLI )
2023-06-22 22:30:43 +03:00
find_package ( Brotli REQUIRED )
cmake: picky-linker fixes for openssl, ZLIB, H3 and more
- fix HTTP/3 support detection with OpenSSL/quictls built with ZLIB.
(Requires curl be built with ZLIB option also.)
- fix HTTP/3 support detection with OpenSSL/quictls/LibreSSL and `ld`
linker on Windows.
- fix HTTP/3 support detection with wolfSSL to automatically add
`ws2_32` to the lib list on Windows. For all linkers.
- reposition ZLIB (and other compression) detection _after_ TLS
detection, but before calling HTTP/3-support detection via
`CheckQuicSupportInOpenSSL`.
May be a regression from ebef55a61df0094b9790710a42f63c48e7de3c13
May fix #10832 (Reported-by: Micah Snyder)
This also seems to fix an odd case, where OpenSSL/quictls is correctly
detected, but its header path is not set while compiling, breaking
build at `src/curl_ntlm_core.c`. Reason for this remains undiscovered.
- satisfy "picky" linkers such as `ld` with MinGW, that are highly
sensitive to lib order, by also adding brotli to the beginning of the
lib list.
- satisfy "picky" linkers by adding certain Windows systems libs to
the lib list for OpenSSL/LibreSSL. (Might need additional ones for
other forks, such as `pthread` for BoringSSL.)
Note: It'd make sense to _always_ add `ws2_32`, `crypt32` (except
Windows App targets perhaps?), `bcrypt` (except old-mingw!) on Windows
at this point. They are almost always required, and if some aren't,
they are ignored by the linker with no effect on final binaries.
Closes #10857
2023-03-30 11:55:20 +03:00
if ( BROTLI_FOUND )
set ( HAVE_BROTLI ON )
list ( APPEND CURL_LIBS ${ BROTLI_LIBRARIES } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libbrotlidec" )
cmake: picky-linker fixes for openssl, ZLIB, H3 and more
- fix HTTP/3 support detection with OpenSSL/quictls built with ZLIB.
(Requires curl be built with ZLIB option also.)
- fix HTTP/3 support detection with OpenSSL/quictls/LibreSSL and `ld`
linker on Windows.
- fix HTTP/3 support detection with wolfSSL to automatically add
`ws2_32` to the lib list on Windows. For all linkers.
- reposition ZLIB (and other compression) detection _after_ TLS
detection, but before calling HTTP/3-support detection via
`CheckQuicSupportInOpenSSL`.
May be a regression from ebef55a61df0094b9790710a42f63c48e7de3c13
May fix #10832 (Reported-by: Micah Snyder)
This also seems to fix an odd case, where OpenSSL/quictls is correctly
detected, but its header path is not set while compiling, breaking
build at `src/curl_ntlm_core.c`. Reason for this remains undiscovered.
- satisfy "picky" linkers such as `ld` with MinGW, that are highly
sensitive to lib order, by also adding brotli to the beginning of the
lib list.
- satisfy "picky" linkers by adding certain Windows systems libs to
the lib list for OpenSSL/LibreSSL. (Might need additional ones for
other forks, such as `pthread` for BoringSSL.)
Note: It'd make sense to _always_ add `ws2_32`, `crypt32` (except
Windows App targets perhaps?), `bcrypt` (except old-mingw!) on Windows
at this point. They are almost always required, and if some aren't,
they are ignored by the linker with no effect on final binaries.
Closes #10857
2023-03-30 11:55:20 +03:00
include_directories ( ${ BROTLI_INCLUDE_DIRS } )
list ( APPEND CMAKE_REQUIRED_INCLUDES ${ BROTLI_INCLUDE_DIRS } )
endif ( )
endif ( )
option ( CURL_ZSTD "Set to ON to enable building curl with zstd support." OFF )
set ( HAVE_ZSTD OFF )
if ( CURL_ZSTD )
find_package ( Zstd REQUIRED )
2023-10-26 02:37:48 +03:00
if ( Zstd_FOUND AND NOT Zstd_VERSION VERSION_LESS "1.0.0" )
cmake: picky-linker fixes for openssl, ZLIB, H3 and more
- fix HTTP/3 support detection with OpenSSL/quictls built with ZLIB.
(Requires curl be built with ZLIB option also.)
- fix HTTP/3 support detection with OpenSSL/quictls/LibreSSL and `ld`
linker on Windows.
- fix HTTP/3 support detection with wolfSSL to automatically add
`ws2_32` to the lib list on Windows. For all linkers.
- reposition ZLIB (and other compression) detection _after_ TLS
detection, but before calling HTTP/3-support detection via
`CheckQuicSupportInOpenSSL`.
May be a regression from ebef55a61df0094b9790710a42f63c48e7de3c13
May fix #10832 (Reported-by: Micah Snyder)
This also seems to fix an odd case, where OpenSSL/quictls is correctly
detected, but its header path is not set while compiling, breaking
build at `src/curl_ntlm_core.c`. Reason for this remains undiscovered.
- satisfy "picky" linkers such as `ld` with MinGW, that are highly
sensitive to lib order, by also adding brotli to the beginning of the
lib list.
- satisfy "picky" linkers by adding certain Windows systems libs to
the lib list for OpenSSL/LibreSSL. (Might need additional ones for
other forks, such as `pthread` for BoringSSL.)
Note: It'd make sense to _always_ add `ws2_32`, `crypt32` (except
Windows App targets perhaps?), `bcrypt` (except old-mingw!) on Windows
at this point. They are almost always required, and if some aren't,
they are ignored by the linker with no effect on final binaries.
Closes #10857
2023-03-30 11:55:20 +03:00
set ( HAVE_ZSTD ON )
list ( APPEND CURL_LIBS ${ Zstd_LIBRARIES } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libzstd" )
cmake: picky-linker fixes for openssl, ZLIB, H3 and more
- fix HTTP/3 support detection with OpenSSL/quictls built with ZLIB.
(Requires curl be built with ZLIB option also.)
- fix HTTP/3 support detection with OpenSSL/quictls/LibreSSL and `ld`
linker on Windows.
- fix HTTP/3 support detection with wolfSSL to automatically add
`ws2_32` to the lib list on Windows. For all linkers.
- reposition ZLIB (and other compression) detection _after_ TLS
detection, but before calling HTTP/3-support detection via
`CheckQuicSupportInOpenSSL`.
May be a regression from ebef55a61df0094b9790710a42f63c48e7de3c13
May fix #10832 (Reported-by: Micah Snyder)
This also seems to fix an odd case, where OpenSSL/quictls is correctly
detected, but its header path is not set while compiling, breaking
build at `src/curl_ntlm_core.c`. Reason for this remains undiscovered.
- satisfy "picky" linkers such as `ld` with MinGW, that are highly
sensitive to lib order, by also adding brotli to the beginning of the
lib list.
- satisfy "picky" linkers by adding certain Windows systems libs to
the lib list for OpenSSL/LibreSSL. (Might need additional ones for
other forks, such as `pthread` for BoringSSL.)
Note: It'd make sense to _always_ add `ws2_32`, `crypt32` (except
Windows App targets perhaps?), `bcrypt` (except old-mingw!) on Windows
at this point. They are almost always required, and if some aren't,
they are ignored by the linker with no effect on final binaries.
Closes #10857
2023-03-30 11:55:20 +03:00
include_directories ( ${ Zstd_INCLUDE_DIRS } )
2023-10-26 02:37:48 +03:00
else ( )
message ( WARNING "zstd v1.0.0 or newer is required, disabling zstd support." )
cmake: picky-linker fixes for openssl, ZLIB, H3 and more
- fix HTTP/3 support detection with OpenSSL/quictls built with ZLIB.
(Requires curl be built with ZLIB option also.)
- fix HTTP/3 support detection with OpenSSL/quictls/LibreSSL and `ld`
linker on Windows.
- fix HTTP/3 support detection with wolfSSL to automatically add
`ws2_32` to the lib list on Windows. For all linkers.
- reposition ZLIB (and other compression) detection _after_ TLS
detection, but before calling HTTP/3-support detection via
`CheckQuicSupportInOpenSSL`.
May be a regression from ebef55a61df0094b9790710a42f63c48e7de3c13
May fix #10832 (Reported-by: Micah Snyder)
This also seems to fix an odd case, where OpenSSL/quictls is correctly
detected, but its header path is not set while compiling, breaking
build at `src/curl_ntlm_core.c`. Reason for this remains undiscovered.
- satisfy "picky" linkers such as `ld` with MinGW, that are highly
sensitive to lib order, by also adding brotli to the beginning of the
lib list.
- satisfy "picky" linkers by adding certain Windows systems libs to
the lib list for OpenSSL/LibreSSL. (Might need additional ones for
other forks, such as `pthread` for BoringSSL.)
Note: It'd make sense to _always_ add `ws2_32`, `crypt32` (except
Windows App targets perhaps?), `bcrypt` (except old-mingw!) on Windows
at this point. They are almost always required, and if some aren't,
they are ignored by the linker with no effect on final binaries.
Closes #10857
2023-03-30 11:55:20 +03:00
endif ( )
endif ( )
2024-04-15 13:35:07 +03:00
# Check symbol in an OpenSSL-like TLS backend, or in EXTRA_LIBS depending on it.
macro ( openssl_check_symbol_exists SYMBOL FILES VARIABLE EXTRA_LIBS )
2023-07-31 13:52:56 +03:00
cmake_push_check_state ( )
if ( USE_OPENSSL )
set ( CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}" )
set ( CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}" )
if ( HAVE_LIBZ )
list ( APPEND CMAKE_REQUIRED_LIBRARIES "${ZLIB_LIBRARIES}" )
endif ( )
if ( WIN32 )
list ( APPEND CMAKE_REQUIRED_LIBRARIES "ws2_32" )
2023-08-08 14:00:36 +03:00
list ( APPEND CMAKE_REQUIRED_LIBRARIES "bcrypt" ) # for OpenSSL/LibreSSL
2023-07-31 13:52:56 +03:00
endif ( )
elseif ( USE_WOLFSSL )
set ( CMAKE_REQUIRED_INCLUDES "${WolfSSL_INCLUDE_DIRS}" )
set ( CMAKE_REQUIRED_LIBRARIES "${WolfSSL_LIBRARIES}" )
if ( HAVE_LIBZ )
list ( APPEND CMAKE_REQUIRED_INCLUDES "${ZLIB_INCLUDE_DIRS}" ) # Public wolfSSL headers require zlib headers
list ( APPEND CMAKE_REQUIRED_LIBRARIES "${ZLIB_LIBRARIES}" )
endif ( )
if ( WIN32 )
list ( APPEND CMAKE_REQUIRED_LIBRARIES "ws2_32" "crypt32" )
endif ( )
list ( APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_UINTPTR_T ) # to pull in stdint.h (as of wolfSSL v5.5.4)
endif ( )
2024-04-15 13:35:07 +03:00
if ( NOT "${EXTRA_LIBS}" STREQUAL "" )
list ( APPEND CMAKE_REQUIRED_LIBRARIES "${EXTRA_LIBS}" )
endif ( )
2023-07-31 13:52:56 +03:00
check_symbol_exists ( "${SYMBOL}" "${FILES}" "${VARIABLE}" )
cmake_pop_check_state ( )
endmacro ( )
2023-10-20 00:12:48 +03:00
# Ensure that the OpenSSL fork actually supports QUIC.
macro ( openssl_check_quic )
if ( NOT DEFINED HAVE_SSL_CTX_SET_QUIC_METHOD )
if ( USE_OPENSSL )
2024-04-15 13:35:07 +03:00
openssl_check_symbol_exists ( SSL_CTX_set_quic_method "openssl/ssl.h" HAVE_SSL_CTX_SET_QUIC_METHOD "" )
2023-10-20 00:12:48 +03:00
elseif ( USE_WOLFSSL )
2024-04-15 13:35:07 +03:00
openssl_check_symbol_exists ( wolfSSL_set_quic_method "wolfssl/options.h;wolfssl/openssl/ssl.h" HAVE_SSL_CTX_SET_QUIC_METHOD "" )
2023-10-20 00:12:48 +03:00
endif ( )
endif ( )
if ( NOT HAVE_SSL_CTX_SET_QUIC_METHOD )
message ( FATAL_ERROR "QUIC support is missing in OpenSSL fork. Try setting -DOPENSSL_ROOT_DIR" )
endif ( )
endmacro ( )
2024-06-30 12:37:06 +03:00
if ( USE_WOLFSSL )
openssl_check_symbol_exists ( wolfSSL_DES_ecb_encrypt "wolfssl/openssl/des.h" HAVE_WOLFSSL_DES_ECB_ENCRYPT "" )
openssl_check_symbol_exists ( wolfSSL_BIO_set_shutdown "wolfssl/ssl.h" HAVE_WOLFSSL_FULL_BIO "" )
endif ( )
2023-07-31 13:52:56 +03:00
if ( USE_OPENSSL OR USE_WOLFSSL )
if ( NOT DEFINED HAVE_SSL_SET0_WBIO )
2024-04-15 13:35:07 +03:00
openssl_check_symbol_exists ( SSL_set0_wbio "openssl/ssl.h" HAVE_SSL_SET0_WBIO "" )
2023-07-31 13:52:56 +03:00
endif ( )
2023-09-27 16:40:54 +03:00
if ( NOT DEFINED HAVE_OPENSSL_SRP AND NOT CURL_DISABLE_SRP )
2024-04-15 13:35:07 +03:00
openssl_check_symbol_exists ( SSL_CTX_set_srp_username "openssl/ssl.h" HAVE_OPENSSL_SRP "" )
2023-09-27 16:40:54 +03:00
endif ( )
2023-07-31 13:52:56 +03:00
endif ( )
2024-04-04 16:23:35 +03:00
option ( USE_HTTPSRR "Enable HTTPS RR support for ECH (experimental)" OFF )
option ( USE_ECH "Enable ECH support" OFF )
if ( USE_ECH )
if ( USE_OPENSSL OR USE_WOLFSSL )
2024-04-16 11:10:11 +03:00
# Be sure that the TLS library actually supports ECH.
2024-04-04 16:23:35 +03:00
if ( NOT DEFINED HAVE_ECH )
if ( USE_OPENSSL AND HAVE_BORINGSSL )
2024-04-16 11:10:11 +03:00
openssl_check_symbol_exists ( SSL_set1_ech_config_list "openssl/ssl.h" HAVE_ECH "" )
2024-04-04 16:23:35 +03:00
elseif ( USE_OPENSSL )
2024-04-16 11:10:11 +03:00
openssl_check_symbol_exists ( SSL_ech_set1_echconfig "openssl/ech.h" HAVE_ECH "" )
2024-04-04 16:23:35 +03:00
elseif ( USE_WOLFSSL )
2024-04-16 11:10:11 +03:00
openssl_check_symbol_exists ( wolfSSL_CTX_GenerateEchConfig "wolfssl/options.h;wolfssl/ssl.h" HAVE_ECH "" )
2024-04-04 16:23:35 +03:00
endif ( )
endif ( )
if ( NOT HAVE_ECH )
message ( FATAL_ERROR "ECH support missing in OpenSSL/BoringSSL/wolfSSL" )
else ( )
2024-04-16 11:10:11 +03:00
message ( STATUS "ECH enabled." )
2024-04-04 16:23:35 +03:00
endif ( )
else ( )
message ( FATAL_ERROR "ECH requires ECH-enablded OpenSSL, BoringSSL or wolfSSL" )
endif ( )
endif ( )
2023-08-31 16:28:49 +03:00
option ( USE_NGHTTP2 "Use nghttp2 library" OFF )
2016-07-21 12:28:54 +03:00
if ( USE_NGHTTP2 )
find_package ( NGHTTP2 REQUIRED )
include_directories ( ${ NGHTTP2_INCLUDE_DIRS } )
list ( APPEND CURL_LIBS ${ NGHTTP2_LIBRARIES } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libnghttp2" )
2016-07-21 12:28:54 +03:00
endif ( )
2020-05-09 00:13:46 +03:00
option ( USE_NGTCP2 "Use ngtcp2 and nghttp3 libraries for HTTP/3 support" OFF )
if ( USE_NGTCP2 )
2023-03-14 14:57:31 +03:00
if ( USE_OPENSSL OR USE_WOLFSSL )
if ( USE_WOLFSSL )
find_package ( NGTCP2 REQUIRED wolfSSL )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libngtcp2_crypto_wolfssl" )
2023-10-08 20:43:10 +03:00
elseif ( HAVE_BORINGSSL OR HAVE_AWSLC )
2022-06-29 01:33:25 +03:00
find_package ( NGTCP2 REQUIRED BoringSSL )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libngtcp2_crypto_boringssl" )
2022-06-29 01:33:25 +03:00
else ( )
2023-07-24 15:42:56 +03:00
find_package ( NGTCP2 REQUIRED quictls )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libngtcp2_crypto_quictls" )
2022-06-29 01:33:25 +03:00
endif ( )
2023-10-20 00:12:48 +03:00
openssl_check_quic ( )
2020-05-09 00:13:46 +03:00
elseif ( USE_GNUTLS )
find_package ( NGTCP2 REQUIRED GnuTLS )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libngtcp2_crypto_gnutls" )
2020-05-09 00:13:46 +03:00
else ( )
2023-03-14 14:57:31 +03:00
message ( FATAL_ERROR "ngtcp2 requires OpenSSL, wolfSSL or GnuTLS" )
2020-05-09 00:13:46 +03:00
endif ( )
set ( USE_NGTCP2 ON )
include_directories ( ${ NGTCP2_INCLUDE_DIRS } )
list ( APPEND CURL_LIBS ${ NGTCP2_LIBRARIES } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libngtcp2" )
2020-05-09 00:13:46 +03:00
find_package ( NGHTTP3 REQUIRED )
set ( USE_NGHTTP3 ON )
include_directories ( ${ NGHTTP3_INCLUDE_DIRS } )
list ( APPEND CURL_LIBS ${ NGHTTP3_LIBRARIES } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libnghttp3" )
2020-05-09 00:13:46 +03:00
endif ( )
option ( USE_QUICHE "Use quiche library for HTTP/3 support" OFF )
if ( USE_QUICHE )
if ( USE_NGTCP2 )
message ( FATAL_ERROR "Only one HTTP/3 backend can be selected!" )
endif ( )
find_package ( QUICHE REQUIRED )
2023-10-20 00:12:48 +03:00
if ( NOT HAVE_BORINGSSL )
message ( FATAL_ERROR "quiche requires BoringSSL" )
endif ( )
openssl_check_quic ( )
2020-05-09 00:13:46 +03:00
set ( USE_QUICHE ON )
include_directories ( ${ QUICHE_INCLUDE_DIRS } )
list ( APPEND CURL_LIBS ${ QUICHE_LIBRARIES } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "quiche" )
2022-10-02 22:43:07 +03:00
if ( NOT DEFINED HAVE_QUICHE_CONN_SET_QLOG_FD )
cmake_push_check_state ( )
set ( CMAKE_REQUIRED_INCLUDES "${QUICHE_INCLUDE_DIRS}" )
set ( CMAKE_REQUIRED_LIBRARIES "${QUICHE_LIBRARIES}" )
check_symbol_exists ( quiche_conn_set_qlog_fd "quiche.h" HAVE_QUICHE_CONN_SET_QLOG_FD )
cmake_pop_check_state ( )
endif ( )
2020-05-09 00:13:46 +03:00
endif ( )
2022-04-10 19:21:37 +03:00
option ( USE_MSH3 "Use msquic library for HTTP/3 support" OFF )
if ( USE_MSH3 )
if ( USE_NGTCP2 OR USE_QUICHE )
message ( FATAL_ERROR "Only one HTTP/3 backend can be selected!" )
endif ( )
set ( USE_MSH3 ON )
include_directories ( ${ MSH3_INCLUDE_DIRS } )
list ( APPEND CURL_LIBS ${ MSH3_LIBRARIES } )
2024-07-01 12:38:25 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libmsh3" )
2022-04-10 19:21:37 +03:00
endif ( )
2024-03-03 22:57:03 +03:00
option ( USE_OPENSSL_QUIC "Use openssl and nghttp3 libraries for HTTP/3 support" OFF )
if ( USE_OPENSSL_QUIC )
if ( USE_NGTCP2 OR USE_QUICHE OR USE_MSH3 )
message ( FATAL_ERROR "Only one HTTP/3 backend can be selected!" )
endif ( )
2024-06-26 16:45:33 +03:00
find_package ( OpenSSL 3.3.0 REQUIRED )
2024-03-03 22:57:03 +03:00
find_package ( NGHTTP3 REQUIRED )
set ( USE_NGHTTP3 ON )
include_directories ( ${ NGHTTP3_INCLUDE_DIRS } )
list ( APPEND CURL_LIBS ${ NGHTTP3_LIBRARIES } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libnghttp3" )
2024-03-03 22:57:03 +03:00
endif ( )
2024-02-09 00:45:55 +03:00
if ( USE_MBEDTLS OR
U S E _ B E A R S S L O R
U S E _ S E C T R A N S P )
message ( WARNING "A selected TLS library does not support TLS 1.3." )
endif ( )
2024-03-03 22:57:03 +03:00
if ( CURL_WITH_MULTI_SSL AND ( USE_NGTCP2 OR USE_QUICHE OR USE_MSH3 OR USE_OPENSSL_QUIC ) )
2024-01-26 18:59:33 +03:00
message ( FATAL_ERROR "MultiSSL cannot be enabled with HTTP/3 and vice versa." )
endif ( )
2023-09-27 16:40:54 +03:00
if ( NOT CURL_DISABLE_SRP AND ( HAVE_GNUTLS_SRP OR HAVE_OPENSSL_SRP ) )
set ( USE_TLS_SRP 1 )
endif ( )
2014-08-08 12:23:26 +04:00
if ( NOT CURL_DISABLE_LDAP )
2024-06-04 00:06:56 +03:00
if ( WIN32 AND NOT WINDOWS_STORE )
2015-01-18 23:25:37 +03:00
option ( USE_WIN32_LDAP "Use Windows LDAP implementation" ON )
if ( USE_WIN32_LDAP )
2023-08-08 12:41:20 +03:00
list ( APPEND CURL_LIBS "wldap32" )
if ( NOT CURL_DISABLE_LDAPS )
2023-03-05 22:55:14 +03:00
set ( HAVE_LDAP_SSL ON )
2014-08-08 12:23:26 +04:00
endif ( )
endif ( )
endif ( )
set ( CMAKE_LDAP_LIB "ldap" CACHE STRING "Name or full path to ldap library" )
set ( CMAKE_LBER_LIB "lber" CACHE STRING "Name or full path to lber library" )
# Now that we know, we're not using windows LDAP...
build: drop unused/redundant `HAVE_WINLDAP_H`
Sources did not use it. Autotools used it when checking for the
`winldap` library, which is redundant.
With CMake, detection was broken:
```
Run Build Command(s):/usr/local/Cellar/cmake/3.26.3/bin/cmake -E env VERBOSE=1 /usr/bin/make -f Makefile cmTC_2d8fe/fast && /Library/Developer/CommandLineTools/usr/bin/make -f CMakeFiles/cmTC_2d8fe.dir/build.make CMakeFiles/cmTC_2d8fe.dir/build
Building C object CMakeFiles/cmTC_2d8fe.dir/HAVE_WINLDAP_H.c.obj
/usr/local/opt/llvm/bin/clang --target=x86_64-w64-mingw32 --sysroot=/usr/local/opt/mingw-w64/toolchain-x86_64 -D_WINSOCKAPI_="" -I/my/quictls/x64-ucrt/usr/include -I/my/zlib/x64-ucrt/usr/include -I/my/brotli/x64-ucrt/usr/include -Wno-unused-command-line-argument -D_UCRT -DCURL_HIDDEN_SYMBOLS -DHAVE_SSL_SET0_WBIO -DHAS_ALPN -DNGHTTP2_STATICLIB -DNGHTTP3_STATICLIB -DNGTCP2_STATICLIB -DUSE_MANUAL=1 -fuse-ld=lld -Wl,-s -static-libgcc -lucrt -Wextra -Wall -pedantic -Wbad-function-cast -Wconversion -Winline -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wno-long-long -Wno-multichar -Wpointer-arith -Wshadow -Wsign-compare -Wundef -Wunused -Wwrite-strings -Wcast-align -Wdeclaration-after-statement -Wempty-body -Wendif-labels -Wfloat-equal -Wignored-qualifiers -Wno-format-nonliteral -Wno-sign-conversion -Wno-system-headers -Wstrict-prototypes -Wtype-limits -Wvla -Wshift-sign-overflow -Wshorten-64-to-32 -Wdouble-promotion -Wenum-conversion -Wunused-const-variable -Wcomma -Wmissing-variable-declarations -Wassign-enum -Wextra-semi-stmt -MD -MT CMakeFiles/cmTC_2d8fe.dir/HAVE_WINLDAP_H.c.obj -MF CMakeFiles/cmTC_2d8fe.dir/HAVE_WINLDAP_H.c.obj.d -o CMakeFiles/cmTC_2d8fe.dir/HAVE_WINLDAP_H.c.obj -c /my/curl/bld-cmake-llvm-x64-shared/CMakeFiles/CMakeScratch/TryCompile-3JP6dR/HAVE_WINLDAP_H.c
In file included from /my/curl/bld-cmake-llvm-x64-shared/CMakeFiles/CMakeScratch/TryCompile-3JP6dR/HAVE_WINLDAP_H.c:2:
In file included from /usr/local/opt/mingw-w64/toolchain-x86_64/x86_64-w64-mingw32/include/winldap.h:17:
In file included from /usr/local/opt/mingw-w64/toolchain-x86_64/x86_64-w64-mingw32/include/schnlsp.h:9:
In file included from /usr/local/opt/mingw-w64/toolchain-x86_64/x86_64-w64-mingw32/include/schannel.h:10:
/usr/local/opt/mingw-w64/toolchain-x86_64/x86_64-w64-mingw32/include/wincrypt.h:5041:254: error: unknown type name 'PSYSTEMTIME'
WINIMPM PCCERT_CONTEXT WINAPI CertCreateSelfSignCertificate (HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProvOrNCryptKey, PCERT_NAME_BLOB pSubjectIssuerBlob, DWORD dwFlags, PCRYPT_KEY_PROV_INFO pKeyProvInfo, PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm, PSYSTEMTIME pStartTime, PSYSTEMTIME pEndTime, PCERT_EXTENSIONS pExtensions);
^
/usr/local/opt/mingw-w64/toolchain-x86_64/x86_64-w64-mingw32/include/wincrypt.h:5041:278: error: unknown type name 'PSYSTEMTIME'
WINIMPM PCCERT_CONTEXT WINAPI CertCreateSelfSignCertificate (HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProvOrNCryptKey, PCERT_NAME_BLOB pSubjectIssuerBlob, DWORD dwFlags, PCRYPT_KEY_PROV_INFO pKeyProvInfo, PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm, PSYSTEMTIME pStartTime, PSYSTEMTIME pEndTime, PCERT_EXTENSIONS pExtensions);
^
2 errors generated.
make[1]: *** [CMakeFiles/cmTC_2d8fe.dir/HAVE_WINLDAP_H.c.obj] Error 1
make: *** [cmTC_2d8fe/fast] Error 2
exitCode: 2
```
Cherry-picked from #11095 88e4a21ff70ccef391cf99c8165281ff81374503
Reviewed-by: Daniel Stenberg
Closes #11245
2023-05-19 17:24:25 +03:00
if ( NOT USE_WIN32_LDAP )
2014-08-08 12:23:26 +04:00
# Check for LDAP
2014-08-21 15:15:59 +04:00
set ( CMAKE_REQUIRED_LIBRARIES ${ OPENSSL_LIBRARIES } )
2023-10-09 11:31:04 +03:00
check_library_exists ( "${CMAKE_LDAP_LIB}" "ldap_init" "" HAVE_LIBLDAP )
if ( HAVE_LIBLDAP )
check_library_exists ( "${CMAKE_LDAP_LIB};${CMAKE_LBER_LIB}" "ber_init" "" HAVE_LIBLBER )
else ( )
check_library_exists ( "${CMAKE_LBER_LIB}" "ber_init" "" HAVE_LIBLBER )
endif ( )
2014-08-08 12:23:26 +04:00
2016-06-14 17:11:48 +03:00
set ( CMAKE_REQUIRED_INCLUDES_BAK ${ CMAKE_REQUIRED_INCLUDES } )
set ( CMAKE_LDAP_INCLUDE_DIR "" CACHE STRING "Path to LDAP include directory" )
if ( CMAKE_LDAP_INCLUDE_DIR )
list ( APPEND CMAKE_REQUIRED_INCLUDES ${ CMAKE_LDAP_INCLUDE_DIR } )
2014-08-08 12:23:26 +04:00
endif ( )
2016-06-14 17:11:48 +03:00
check_include_file_concat ( "ldap.h" HAVE_LDAP_H )
check_include_file_concat ( "lber.h" HAVE_LBER_H )
if ( NOT HAVE_LDAP_H )
message ( STATUS "LDAP_H not found CURL_DISABLE_LDAP set ON" )
set ( CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE )
set ( CMAKE_REQUIRED_INCLUDES ${ CMAKE_REQUIRED_INCLUDES_BAK } ) #LDAP includes won't be used
elseif ( NOT HAVE_LIBLDAP )
message ( STATUS "LDAP library '${CMAKE_LDAP_LIB}' not found CURL_DISABLE_LDAP set ON" )
set ( CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE )
set ( CMAKE_REQUIRED_INCLUDES ${ CMAKE_REQUIRED_INCLUDES_BAK } ) #LDAP includes won't be used
2014-08-08 12:23:26 +04:00
else ( )
2016-06-14 17:11:48 +03:00
if ( CMAKE_LDAP_INCLUDE_DIR )
include_directories ( ${ CMAKE_LDAP_INCLUDE_DIR } )
endif ( )
set ( NEED_LBER_H ON )
set ( _HEADER_LIST )
2023-12-09 23:37:11 +03:00
if ( WIN32 )
2016-06-14 17:11:48 +03:00
list ( APPEND _HEADER_LIST "windows.h" )
endif ( )
if ( HAVE_SYS_TYPES_H )
list ( APPEND _HEADER_LIST "sys/types.h" )
endif ( )
list ( APPEND _HEADER_LIST "ldap.h" )
2023-10-02 12:57:14 +03:00
set ( _INCLUDE_STRING "" )
2016-06-14 17:11:48 +03:00
foreach ( _HEADER ${ _HEADER_LIST } )
set ( _INCLUDE_STRING "${_INCLUDE_STRING}#include <${_HEADER}>\n" )
endforeach ( )
2023-10-02 12:57:14 +03:00
list ( APPEND CMAKE_REQUIRED_DEFINITIONS -DLDAP_DEPRECATED=1 )
list ( APPEND CMAKE_REQUIRED_LIBRARIES ${ CMAKE_LDAP_LIB } )
2023-10-09 11:31:04 +03:00
set ( CURL_LIBS "${CMAKE_LDAP_LIB};${CURL_LIBS}" )
2023-10-02 12:57:14 +03:00
if ( HAVE_LIBLBER )
list ( APPEND CMAKE_REQUIRED_LIBRARIES ${ CMAKE_LBER_LIB } )
2023-10-09 11:31:04 +03:00
set ( CURL_LIBS "${CMAKE_LBER_LIB};${CURL_LIBS}" )
2023-10-02 12:57:14 +03:00
endif ( )
2023-10-03 01:56:02 +03:00
check_c_source_compiles ( "
2016-06-14 17:11:48 +03:00
$ { _ I N C L U D E _ S T R I N G }
i n t main ( int argc, char ** argv )
{
B e r V a l u e * b v p = N U L L ;
B e r E l e m e n t * b e p = ber_init ( bvp ) ;
ber_free ( bep, 1 ) ;
r e t u r n 0 ;
2023-10-03 01:56:02 +03:00
} " N O T _ N E E D _ L B E R _ H )
2016-06-14 17:11:48 +03:00
if ( NOT_NEED_LBER_H )
set ( NEED_LBER_H OFF )
else ( )
set ( CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DNEED_LBER_H" )
endif ( )
2023-10-02 12:57:14 +03:00
check_function_exists ( ldap_url_parse HAVE_LDAP_URL_PARSE )
2023-10-03 21:17:37 +03:00
check_function_exists ( ldap_init_fd HAVE_LDAP_INIT_FD )
2023-10-02 12:57:14 +03:00
unset ( CMAKE_REQUIRED_LIBRARIES )
check_include_file ( "ldap_ssl.h" HAVE_LDAP_SSL_H )
2023-10-03 21:17:37 +03:00
if ( HAVE_LDAP_INIT_FD )
set ( USE_OPENLDAP ON )
add_definitions ( "-DLDAP_DEPRECATED=1" )
endif ( )
2023-10-02 12:57:14 +03:00
if ( NOT CURL_DISABLE_LDAPS )
set ( HAVE_LDAP_SSL ON )
endif ( )
2014-08-08 12:23:26 +04:00
endif ( )
2012-03-30 20:59:47 +04:00
endif ( )
endif ( )
2014-08-08 12:23:26 +04:00
# No ldap, no ldaps.
if ( CURL_DISABLE_LDAP )
if ( NOT CURL_DISABLE_LDAPS )
message ( STATUS "LDAP needs to be enabled to support LDAPS" )
set ( CURL_DISABLE_LDAPS ON CACHE BOOL "" FORCE )
endif ( )
endif ( )
2012-03-30 20:59:47 +04:00
2022-05-26 18:52:57 +03:00
# Check for idn2
2020-12-22 23:31:03 +03:00
option ( USE_LIBIDN2 "Use libidn2 for IDN support" ON )
if ( USE_LIBIDN2 )
2023-10-09 11:31:04 +03:00
check_library_exists ( "idn2" "idn2_lookup_ul" "" HAVE_LIBIDN2 )
if ( HAVE_LIBIDN2 )
2024-07-09 13:11:16 +03:00
set ( LIBIDN2_LINK_LIBRARIES "idn2" )
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
check_include_file_concat ( "idn2.h" HAVE_IDN2_H )
2024-07-13 14:06:33 +03:00
endif ( )
if ( NOT HAVE_LIBIDN2 OR NOT HAVE_IDN2_H )
2024-07-09 13:11:16 +03:00
find_package ( PkgConfig QUIET )
pkg_check_modules ( LIBIDN2 "libidn2" )
if ( LIBIDN2_FOUND )
include_directories ( ${ LIBIDN2_INCLUDE_DIRS } )
set ( HAVE_LIBIDN2 ON )
set ( HAVE_IDN2_H ON )
endif ( )
endif ( )
2024-07-13 14:06:33 +03:00
if ( HAVE_LIBIDN2 AND HAVE_IDN2_H )
2024-07-09 13:11:16 +03:00
set ( CURL_LIBS "${LIBIDN2_LINK_LIBRARIES};${CURL_LIBS}" )
set ( LIBCURL_PC_REQUIRES_PRIVATE "libidn2;${LIBCURL_PC_REQUIRES_PRIVATE}" )
2023-10-09 11:31:04 +03:00
endif ( )
2022-05-26 18:52:57 +03:00
else ( )
set ( HAVE_LIBIDN2 OFF )
2020-12-22 23:31:03 +03:00
endif ( )
2009-04-02 17:14:53 +04:00
2021-03-29 07:58:17 +03:00
if ( WIN32 )
option ( USE_WIN32_IDN "Use WinIDN for IDN support" OFF )
if ( USE_WIN32_IDN )
2022-07-02 10:36:09 +03:00
list ( APPEND CURL_LIBS "normaliz" )
2021-03-29 07:58:17 +03:00
endif ( )
endif ( )
2024-03-31 12:55:27 +03:00
if ( APPLE )
option ( USE_APPLE_IDN "Use Apple built-in IDN support" OFF )
if ( USE_APPLE_IDN )
cmake_push_check_state ( )
set ( CMAKE_REQUIRED_LIBRARIES "icucore" )
check_symbol_exists ( "uidna_openUTS46" "unicode/uidna.h" HAVE_APPLE_IDN )
cmake_pop_check_state ( )
if ( HAVE_APPLE_IDN )
list ( APPEND CURL_LIBS "icucore" )
else ( )
set ( USE_APPLE_IDN OFF )
endif ( )
endif ( )
endif ( )
2024-05-19 19:49:42 +03:00
# libpsl
option ( CURL_USE_LIBPSL "Use libpsl" ON )
2022-05-19 16:29:54 +03:00
mark_as_advanced ( CURL_USE_LIBPSL )
set ( USE_LIBPSL OFF )
if ( CURL_USE_LIBPSL )
find_package ( LibPSL )
if ( LIBPSL_FOUND )
list ( APPEND CURL_LIBS ${ LIBPSL_LIBRARY } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libpsl" )
2022-05-19 16:29:54 +03:00
list ( APPEND CMAKE_REQUIRED_INCLUDES "${LIBPSL_INCLUDE_DIR}" )
include_directories ( "${LIBPSL_INCLUDE_DIR}" )
set ( USE_LIBPSL ON )
endif ( )
endif ( )
2024-05-19 19:49:42 +03:00
# libssh2
option ( CURL_USE_LIBSSH2 "Use libssh2" ON )
2021-11-22 19:39:46 +03:00
mark_as_advanced ( CURL_USE_LIBSSH2 )
2014-08-06 16:50:40 +04:00
set ( USE_LIBSSH2 OFF )
2021-11-22 19:39:46 +03:00
if ( CURL_USE_LIBSSH2 )
2014-08-06 16:50:40 +04:00
find_package ( LibSSH2 )
if ( LIBSSH2_FOUND )
list ( APPEND CURL_LIBS ${ LIBSSH2_LIBRARY } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libssh2" )
2015-09-16 18:33:23 +03:00
list ( APPEND CMAKE_REQUIRED_INCLUDES "${LIBSSH2_INCLUDE_DIR}" )
2014-08-22 19:02:59 +04:00
include_directories ( "${LIBSSH2_INCLUDE_DIR}" )
2014-08-06 16:50:40 +04:00
set ( USE_LIBSSH2 ON )
2018-07-05 13:55:47 +03:00
endif ( )
endif ( )
2014-08-06 16:50:40 +04:00
2020-05-10 17:23:30 +03:00
# libssh
2024-05-19 19:49:42 +03:00
option ( CURL_USE_LIBSSH "Use libssh" OFF )
2021-11-22 19:39:46 +03:00
mark_as_advanced ( CURL_USE_LIBSSH )
tidy-up: delete parallel/unused feature flags
Detecting headers and lib separately makes sense when headers come in
variations or with extra ones, but this wasn't the case here. These were
duplicate/parallel macros that we had to keep in sync with each other
for a working build. This patch leaves a single macro for each of these
dependencies:
- Rely on `HAVE_LIBZ`, delete parallel `HAVE_ZLIB_H`.
Also delete CMake logic making sure these two were in sync, along with
a toggle to turn off that logic, called `CURL_SPECIAL_LIBZ`.
Also delete stray `HAVE_ZLIB` defines.
There is also a `USE_ZLIB` variant in `lib/config-dos.h`. This patch
retains it for compatibility and deprecates it.
- Rely on `USE_LIBSSH2`, delete parallel `HAVE_LIBSSH2_H`.
Also delete `LIBSSH2_WIN32`, `LIBSSH2_LIBRARY` from
`winbuild/MakefileBuild.vc`, these have a role when building libssh2
itself. And `CURL_USE_LIBSSH`, which had no use at all.
Also delete stray `HAVE_LIBSSH2` defines.
- Rely on `USE_LIBSSH`, delete parallel `HAVE_LIBSSH_LIBSSH_H`.
Also delete `LIBSSH_WIN32`, `LIBSSH_LIBRARY` and `HAVE_LIBSSH` from
`winbuild/MakefileBuild.vc`, these were the result of copy-pasting the
libssh2 line, and were not having any use.
- Delete unused `HAVE_LIBPSL_H` and `HAVE_LIBPSL`.
Reviewed-by: Daniel Stenberg
Closes #9652
2022-10-06 18:30:13 +03:00
if ( NOT USE_LIBSSH2 AND CURL_USE_LIBSSH )
2024-07-16 13:48:13 +03:00
find_package ( libssh CONFIG QUIET )
2020-05-10 17:23:30 +03:00
if ( libssh_FOUND )
message ( STATUS "Found libssh ${libssh_VERSION}" )
2024-07-16 13:48:13 +03:00
else ( )
find_package ( PkgConfig QUIET )
pkg_check_modules ( LIBSSH "libssh" )
if ( LIBSSH_FOUND )
include_directories ( ${ LIBSSH_INCLUDE_DIRS } )
endif ( )
endif ( )
if ( libssh_FOUND OR LIBSSH_FOUND )
if ( NOT DEFINED LIBSSH_LINK_LIBRARIES )
set ( LIBSSH_LINK_LIBRARIES "ssh" ) # for find_package() with broken pkg-config (e.g. linux-old CI workflow)
endif ( )
list ( APPEND CURL_LIBS ${ LIBSSH_LINK_LIBRARIES } )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "libssh" )
2020-05-10 17:23:30 +03:00
set ( USE_LIBSSH ON )
endif ( )
endif ( )
2024-06-14 08:09:55 +03:00
option ( CURL_USE_GSASL "Use GSASL implementation" OFF )
mark_as_advanced ( CURL_USE_GSASL )
if ( CURL_USE_GSASL )
find_package ( PkgConfig REQUIRED )
pkg_check_modules ( GSASL REQUIRED libgsasl )
list ( APPEND CURL_LIBS ${ GSASL_LINK_LIBRARIES } )
set ( USE_GSASL ON )
endif ( )
2021-11-22 19:39:46 +03:00
option ( CURL_USE_GSSAPI "Use GSSAPI implementation (right now only Heimdal is supported with CMake build)" OFF )
mark_as_advanced ( CURL_USE_GSSAPI )
2014-09-25 17:03:00 +04:00
2021-11-22 19:39:46 +03:00
if ( CURL_USE_GSSAPI )
2014-09-25 17:03:00 +04:00
find_package ( GSS )
2015-08-10 14:09:58 +03:00
set ( HAVE_GSSAPI ${ GSS_FOUND } )
2014-09-25 17:03:00 +04:00
if ( GSS_FOUND )
message ( STATUS "Found ${GSS_FLAVOUR} GSSAPI version: \" ${ GSS_VERSION } \"")
2018-11-27 18:12:35 +03:00
list ( APPEND CMAKE_REQUIRED_INCLUDES ${ GSS_INCLUDE_DIR } )
2014-09-25 17:03:00 +04:00
check_include_file_concat ( "gssapi/gssapi.h" HAVE_GSSAPI_GSSAPI_H )
check_include_file_concat ( "gssapi/gssapi_generic.h" HAVE_GSSAPI_GSSAPI_GENERIC_H )
check_include_file_concat ( "gssapi/gssapi_krb5.h" HAVE_GSSAPI_GSSAPI_KRB5_H )
2023-11-07 03:25:18 +03:00
if ( NOT GSS_FLAVOUR STREQUAL "Heimdal" )
# MIT
2014-09-25 17:03:00 +04:00
set ( _INCLUDE_LIST "" )
if ( HAVE_GSSAPI_GSSAPI_H )
list ( APPEND _INCLUDE_LIST "gssapi/gssapi.h" )
endif ( )
if ( HAVE_GSSAPI_GSSAPI_GENERIC_H )
list ( APPEND _INCLUDE_LIST "gssapi/gssapi_generic.h" )
endif ( )
if ( HAVE_GSSAPI_GSSAPI_KRB5_H )
list ( APPEND _INCLUDE_LIST "gssapi/gssapi_krb5.h" )
endif ( )
string ( REPLACE ";" " " _COMPILER_FLAGS_STR "${GSS_COMPILER_FLAGS}" )
string ( REPLACE ";" " " _LINKER_FLAGS_STR "${GSS_LINKER_FLAGS}" )
foreach ( _dir ${ GSS_LINK_DIRECTORIES } )
set ( _LINKER_FLAGS_STR "${_LINKER_FLAGS_STR} -L\" ${ _dir } \"")
endforeach ( )
2022-10-02 22:43:07 +03:00
if ( NOT DEFINED HAVE_GSS_C_NT_HOSTBASED_SERVICE )
set ( CMAKE_REQUIRED_FLAGS "${_COMPILER_FLAGS_STR} ${_LINKER_FLAGS_STR}" )
set ( CMAKE_REQUIRED_LIBRARIES ${ GSS_LIBRARIES } )
check_symbol_exists ( "GSS_C_NT_HOSTBASED_SERVICE" ${ _INCLUDE_LIST } HAVE_GSS_C_NT_HOSTBASED_SERVICE )
unset ( CMAKE_REQUIRED_LIBRARIES )
endif ( )
2014-09-25 17:03:00 +04:00
if ( NOT HAVE_GSS_C_NT_HOSTBASED_SERVICE )
set ( HAVE_OLD_GSSMIT ON )
endif ( )
endif ( )
2018-11-27 18:12:35 +03:00
include_directories ( ${ GSS_INCLUDE_DIR } )
2014-09-25 17:03:00 +04:00
link_directories ( ${ GSS_LINK_DIRECTORIES } )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GSS_COMPILER_FLAGS}" )
2022-12-02 18:22:32 +03:00
string ( REPLACE ";" " " GSS_LINKER_FLAGS "${GSS_LINKER_FLAGS}" )
2014-09-25 17:03:00 +04:00
set ( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GSS_LINKER_FLAGS}" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GSS_LINKER_FLAGS}" )
list ( APPEND CURL_LIBS ${ GSS_LIBRARIES } )
2024-07-01 12:38:25 +03:00
if ( GSS_FLAVOUR STREQUAL "MIT" )
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "mit-krb5-gssapi" )
endif ( )
2014-09-25 17:03:00 +04:00
else ( )
message ( WARNING "GSSAPI support has been requested but no supporting libraries found. Skipping." )
endif ( )
endif ( )
2014-08-21 15:37:07 +04:00
2024-04-15 13:35:07 +03:00
option ( USE_LIBRTMP "Enable librtmp from rtmpdump" OFF )
if ( USE_LIBRTMP )
cmake_push_check_state ( )
set ( _extra_libs "rtmp" )
if ( WIN32 )
list ( APPEND _extra_libs "winmm" )
endif ( )
openssl_check_symbol_exists ( "RTMP_Init" "librtmp/rtmp.h" HAVE_LIBRTMP "${_extra_libs}" )
cmake_pop_check_state ( )
if ( HAVE_LIBRTMP )
list ( APPEND CURL_LIBS "rtmp" )
2024-06-08 01:41:24 +03:00
list ( APPEND LIBCURL_PC_REQUIRES_PRIVATE "librtmp" )
2024-04-15 13:35:07 +03:00
if ( WIN32 )
list ( APPEND CURL_LIBS "winmm" )
endif ( )
else ( )
message ( WARNING "librtmp requested, but not found or missing OpenSSL. Skipping." )
set ( USE_LIBRTMP OFF )
endif ( )
endif ( )
2014-12-26 23:45:21 +03:00
option ( ENABLE_UNIX_SOCKETS "Define if you want Unix domain sockets support" ON )
2014-11-28 01:59:25 +03:00
if ( ENABLE_UNIX_SOCKETS )
include ( CheckStructHasMember )
2021-06-04 10:03:30 +03:00
if ( WIN32 )
set ( USE_UNIX_SOCKETS ON )
else ( )
check_struct_has_member ( "struct sockaddr_un" sun_path "sys/un.h" USE_UNIX_SOCKETS )
endif ( )
2014-11-28 01:59:25 +03:00
else ( )
unset ( USE_UNIX_SOCKETS CACHE )
endif ( )
2017-05-01 23:15:15 +03:00
#
# CA handling
#
2024-07-14 11:26:35 +03:00
if ( curl_ca_bundle_supported )
set ( CURL_CA_BUNDLE "auto" CACHE STRING
" P a t h t o t h e C A b u n d l e . S e t ' n o n e ' t o d i s a b l e o r ' a u t o ' f o r a u t o - d e t e c t i o n . D e f a u l t s t o ' a u t o ' . " )
set ( CURL_CA_FALLBACK OFF CACHE BOOL
" S e t O N t o u s e b u i l t - i n C A s t o r e o f T L S b a c k e n d . D e f a u l t s t o O F F " )
set ( CURL_CA_PATH "auto" CACHE STRING
" L o c a t i o n o f d e f a u l t C A p a t h . S e t ' n o n e ' t o d i s a b l e o r ' a u t o ' f o r a u t o - d e t e c t i o n . D e f a u l t s t o ' a u t o ' . " )
if ( CURL_CA_BUNDLE STREQUAL "" )
message ( FATAL_ERROR "Invalid value of CURL_CA_BUNDLE. Use 'none', 'auto' or file path." )
elseif ( CURL_CA_BUNDLE STREQUAL "none" )
unset ( CURL_CA_BUNDLE CACHE )
elseif ( CURL_CA_BUNDLE STREQUAL "auto" )
unset ( CURL_CA_BUNDLE CACHE )
if ( NOT CMAKE_CROSSCOMPILING AND NOT WIN32 )
set ( CURL_CA_BUNDLE_AUTODETECT TRUE )
endif ( )
else ( )
set ( CURL_CA_BUNDLE_SET TRUE )
2023-03-05 22:51:52 +03:00
endif ( )
2017-05-01 23:15:15 +03:00
2024-07-14 11:26:35 +03:00
if ( CURL_CA_PATH STREQUAL "" )
message ( FATAL_ERROR "Invalid value of CURL_CA_PATH. Use 'none', 'auto' or directory path." )
elseif ( CURL_CA_PATH STREQUAL "none" )
unset ( CURL_CA_PATH CACHE )
elseif ( CURL_CA_PATH STREQUAL "auto" )
unset ( CURL_CA_PATH CACHE )
if ( NOT CMAKE_CROSSCOMPILING AND NOT WIN32 )
set ( CURL_CA_PATH_AUTODETECT TRUE )
endif ( )
else ( )
set ( CURL_CA_PATH_SET TRUE )
2018-07-17 09:36:59 +03:00
endif ( )
2017-05-02 01:12:55 +03:00
2024-07-14 11:26:35 +03:00
if ( CURL_CA_BUNDLE_SET AND CURL_CA_PATH_AUTODETECT )
# Skip auto-detection of unset CA path because CA bundle is set explicitly
elseif ( CURL_CA_PATH_SET AND CURL_CA_BUNDLE_AUTODETECT )
# Skip auto-detection of unset CA bundle because CA path is set explicitly
elseif ( CURL_CA_BUNDLE_AUTODETECT OR CURL_CA_PATH_AUTODETECT )
# First try auto-detecting a CA bundle, then a CA path
if ( CURL_CA_BUNDLE_AUTODETECT )
foreach ( SEARCH_CA_BUNDLE_PATH IN ITEMS
" / e t c / s s l / c e r t s / c a - c e r t i f i c a t e s . c r t "
" / e t c / p k i / t l s / c e r t s / c a - b u n d l e . c r t "
" / u s r / s h a r e / s s l / c e r t s / c a - b u n d l e . c r t "
" / u s r / l o c a l / s h a r e / c e r t s / c a - r o o t - n s s . c r t "
" / e t c / s s l / c e r t . p e m " )
if ( EXISTS "${SEARCH_CA_BUNDLE_PATH}" )
message ( STATUS "Found CA bundle: ${SEARCH_CA_BUNDLE_PATH}" )
set ( CURL_CA_BUNDLE "${SEARCH_CA_BUNDLE_PATH}" CACHE STRING
" P a t h t o t h e C A b u n d l e . S e t ' n o n e ' t o d i s a b l e o r ' a u t o ' f o r a u t o - d e t e c t i o n . D e f a u l t s t o ' a u t o ' . " )
set ( CURL_CA_BUNDLE_SET TRUE CACHE BOOL "Path to the CA bundle has been set" )
break ( )
endif ( )
endforeach ( )
2017-05-02 01:12:55 +03:00
endif ( )
2024-07-14 11:26:35 +03:00
if ( CURL_CA_PATH_AUTODETECT AND NOT CURL_CA_PATH_SET )
set ( SEARCH_CA_PATH "/etc/ssl/certs" )
file ( GLOB curl_ca_files_found "${SEARCH_CA_PATH}/[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f].0" )
if ( curl_ca_files_found )
unset ( curl_ca_files_found )
message ( STATUS "Found CA path: ${SEARCH_CA_PATH}" )
set ( CURL_CA_PATH "${SEARCH_CA_PATH}" CACHE STRING
" L o c a t i o n o f d e f a u l t C A p a t h . S e t ' n o n e ' t o d i s a b l e o r ' a u t o ' f o r a u t o - d e t e c t i o n . D e f a u l t s t o ' a u t o ' . " )
set ( CURL_CA_PATH_SET TRUE CACHE BOOL "Path to the CA bundle has been set" )
endif ( )
endif ( )
endif ( )
2017-05-01 23:15:15 +03:00
endif ( )
2009-04-02 17:14:53 +04:00
# Check for header files
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
if ( WIN32 )
2023-12-09 23:37:11 +03:00
set ( CURL_INCLUDES ${ CURL_INCLUDES } "winsock2.h" )
set ( CURL_INCLUDES ${ CURL_INCLUDES } "ws2tcpip.h" )
set ( CURL_INCLUDES ${ CURL_INCLUDES } "windows.h" )
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
endif ( )
if ( WIN32 )
# detect actual value of _WIN32_WINNT and store as HAVE_WIN32_WINNT
curl_internal_test ( HAVE_WIN32_WINNT )
if ( HAVE_WIN32_WINNT )
string ( REGEX MATCH ".*_WIN32_WINNT=0x[0-9a-fA-F]+" OUTPUT "${OUTPUT}" )
string ( REGEX REPLACE ".*_WIN32_WINNT=" "" OUTPUT "${OUTPUT}" )
string ( REGEX REPLACE "0x([0-9a-f][0-9a-f][0-9a-f])$" "0x0\\1" OUTPUT "${OUTPUT}" ) # pad to 4 digits
string ( TOLOWER "${OUTPUT}" HAVE_WIN32_WINNT )
message ( STATUS "Found _WIN32_WINNT=${HAVE_WIN32_WINNT}" )
endif ( )
# avoid storing HAVE_WIN32_WINNT in CMake cache
unset ( HAVE_WIN32_WINNT CACHE )
2023-10-28 13:52:23 +03:00
if ( HAVE_WIN32_WINNT )
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
if ( HAVE_WIN32_WINNT STRLESS "0x0501" )
2023-10-28 13:52:23 +03:00
# Windows XP is required for freeaddrinfo, getaddrinfo
message ( FATAL_ERROR "Building for Windows XP or newer is required." )
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
endif ( )
2023-10-28 13:52:23 +03:00
# pre-fill detection results based on target OS version
if ( MINGW OR MSVC )
if ( HAVE_WIN32_WINNT STRLESS "0x0600" )
set ( HAVE_INET_NTOP 0 )
set ( HAVE_INET_PTON 0 )
else ( ) # Windows Vista or newer
set ( HAVE_INET_NTOP 1 )
set ( HAVE_INET_PTON 1 )
endif ( )
unset ( HAVE_INET_NTOP CACHE )
unset ( HAVE_INET_PTON CACHE )
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
endif ( )
endif ( )
2018-07-05 13:55:47 +03:00
endif ( )
2009-06-09 21:29:16 +04:00
2024-06-01 21:26:11 +03:00
check_include_file_concat ( "sys/eventfd.h" HAVE_SYS_EVENTFD_H )
2009-06-09 21:29:16 +04:00
check_include_file_concat ( "sys/filio.h" HAVE_SYS_FILIO_H )
2023-09-30 13:35:26 +03:00
check_include_file_concat ( "sys/wait.h" HAVE_SYS_WAIT_H )
2009-06-09 21:29:16 +04:00
check_include_file_concat ( "sys/ioctl.h" HAVE_SYS_IOCTL_H )
check_include_file_concat ( "sys/param.h" HAVE_SYS_PARAM_H )
check_include_file_concat ( "sys/poll.h" HAVE_SYS_POLL_H )
check_include_file_concat ( "sys/resource.h" HAVE_SYS_RESOURCE_H )
check_include_file_concat ( "sys/select.h" HAVE_SYS_SELECT_H )
check_include_file_concat ( "sys/socket.h" HAVE_SYS_SOCKET_H )
check_include_file_concat ( "sys/sockio.h" HAVE_SYS_SOCKIO_H )
check_include_file_concat ( "sys/stat.h" HAVE_SYS_STAT_H )
check_include_file_concat ( "sys/time.h" HAVE_SYS_TIME_H )
check_include_file_concat ( "sys/types.h" HAVE_SYS_TYPES_H )
check_include_file_concat ( "sys/un.h" HAVE_SYS_UN_H )
check_include_file_concat ( "sys/utime.h" HAVE_SYS_UTIME_H )
2016-07-19 03:27:20 +03:00
check_include_file_concat ( "sys/xattr.h" HAVE_SYS_XATTR_H )
2009-06-09 21:29:16 +04:00
check_include_file_concat ( "arpa/inet.h" HAVE_ARPA_INET_H )
2024-03-16 14:39:01 +03:00
check_include_file_concat ( "dirent.h" HAVE_DIRENT_H )
2009-06-09 21:29:16 +04:00
check_include_file_concat ( "fcntl.h" HAVE_FCNTL_H )
check_include_file_concat ( "ifaddrs.h" HAVE_IFADDRS_H )
check_include_file_concat ( "io.h" HAVE_IO_H )
check_include_file_concat ( "libgen.h" HAVE_LIBGEN_H )
check_include_file_concat ( "locale.h" HAVE_LOCALE_H )
check_include_file_concat ( "net/if.h" HAVE_NET_IF_H )
check_include_file_concat ( "netdb.h" HAVE_NETDB_H )
check_include_file_concat ( "netinet/in.h" HAVE_NETINET_IN_H )
check_include_file_concat ( "netinet/tcp.h" HAVE_NETINET_TCP_H )
2023-09-30 13:35:26 +03:00
check_include_file_concat ( "netinet/udp.h" HAVE_NETINET_UDP_H )
2020-11-28 20:17:11 +03:00
check_include_file ( "linux/tcp.h" HAVE_LINUX_TCP_H )
2014-08-08 12:23:26 +04:00
2009-06-09 21:29:16 +04:00
check_include_file_concat ( "poll.h" HAVE_POLL_H )
check_include_file_concat ( "pwd.h" HAVE_PWD_H )
2022-08-14 22:05:40 +03:00
check_include_file_concat ( "stdatomic.h" HAVE_STDATOMIC_H )
2009-06-09 21:29:16 +04:00
check_include_file_concat ( "stdbool.h" HAVE_STDBOOL_H )
check_include_file_concat ( "strings.h" HAVE_STRINGS_H )
check_include_file_concat ( "stropts.h" HAVE_STROPTS_H )
check_include_file_concat ( "termio.h" HAVE_TERMIO_H )
check_include_file_concat ( "termios.h" HAVE_TERMIOS_H )
check_include_file_concat ( "unistd.h" HAVE_UNISTD_H )
check_include_file_concat ( "utime.h" HAVE_UTIME_H )
check_type_size ( size_t SIZEOF_SIZE_T )
check_type_size ( ssize_t SIZEOF_SSIZE_T )
check_type_size ( "long long" SIZEOF_LONG_LONG )
check_type_size ( "long" SIZEOF_LONG )
check_type_size ( "int" SIZEOF_INT )
check_type_size ( "__int64" SIZEOF___INT64 )
check_type_size ( "time_t" SIZEOF_TIME_T )
2023-09-28 19:29:42 +03:00
check_type_size ( "suseconds_t" SIZEOF_SUSECONDS_T )
2009-06-09 21:29:16 +04:00
if ( NOT HAVE_SIZEOF_SSIZE_T )
if ( SIZEOF_LONG EQUAL SIZEOF_SIZE_T )
set ( ssize_t long )
2018-07-05 13:55:47 +03:00
endif ( )
2009-06-09 21:29:16 +04:00
if ( NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T )
set ( ssize_t __int64 )
2018-07-05 13:55:47 +03:00
endif ( )
endif ( )
2016-08-08 07:25:03 +03:00
# off_t is sized later, after the HAVE_FILE_OFFSET_BITS test
2009-04-02 17:14:53 +04:00
2023-09-28 19:29:42 +03:00
if ( SIZEOF_LONG_LONG )
2009-06-09 21:29:16 +04:00
set ( HAVE_LONGLONG 1 )
2018-07-05 13:55:47 +03:00
endif ( )
2023-09-28 19:29:42 +03:00
if ( SIZEOF_SUSECONDS_T )
set ( HAVE_SUSECONDS_T 1 )
endif ( )
2009-04-02 17:14:53 +04:00
2022-06-22 12:35:46 +03:00
if ( NOT CMAKE_CROSSCOMPILING )
find_file ( RANDOM_FILE urandom /dev )
mark_as_advanced ( RANDOM_FILE )
endif ( )
2009-04-02 17:14:53 +04:00
# Check for some functions that are used
2023-08-07 22:50:11 +03:00
if ( WIN32 )
2014-09-25 17:03:00 +04:00
set ( CMAKE_REQUIRED_LIBRARIES ws2_32 )
elseif ( HAVE_LIBSOCKET )
set ( CMAKE_REQUIRED_LIBRARIES socket )
endif ( )
2023-09-27 14:37:43 +03:00
check_symbol_exists ( fnmatch "${CURL_INCLUDES};fnmatch.h" HAVE_FNMATCH )
2023-09-26 01:35:26 +03:00
check_symbol_exists ( basename "${CURL_INCLUDES};string.h" HAVE_BASENAME )
2024-03-16 14:39:01 +03:00
check_symbol_exists ( opendir "${CURL_INCLUDES};dirent.h" HAVE_OPENDIR )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( socket "${CURL_INCLUDES}" HAVE_SOCKET )
2023-09-27 14:37:43 +03:00
check_symbol_exists ( sched_yield "${CURL_INCLUDES};sched.h" HAVE_SCHED_YIELD )
2022-10-10 01:54:59 +03:00
check_symbol_exists ( socketpair "${CURL_INCLUDES}" HAVE_SOCKETPAIR )
2022-09-26 12:45:18 +03:00
check_symbol_exists ( recv "${CURL_INCLUDES}" HAVE_RECV )
check_symbol_exists ( send "${CURL_INCLUDES}" HAVE_SEND )
2023-01-03 01:25:15 +03:00
check_symbol_exists ( sendmsg "${CURL_INCLUDES}" HAVE_SENDMSG )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( select "${CURL_INCLUDES}" HAVE_SELECT )
2023-09-26 01:35:26 +03:00
check_symbol_exists ( strdup "${CURL_INCLUDES};string.h" HAVE_STRDUP )
check_symbol_exists ( strtok_r "${CURL_INCLUDES};string.h" HAVE_STRTOK_R )
check_symbol_exists ( strcasecmp "${CURL_INCLUDES};string.h" HAVE_STRCASECMP )
check_symbol_exists ( stricmp "${CURL_INCLUDES};string.h" HAVE_STRICMP )
check_symbol_exists ( strcmpi "${CURL_INCLUDES};string.h" HAVE_STRCMPI )
2023-09-26 01:35:26 +03:00
check_symbol_exists ( memrchr "${CURL_INCLUDES};string.h" HAVE_MEMRCHR )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( alarm "${CURL_INCLUDES}" HAVE_ALARM )
2023-09-27 14:37:43 +03:00
check_symbol_exists ( arc4random "${CURL_INCLUDES};stdlib.h" HAVE_ARC4RANDOM )
check_symbol_exists ( fcntl "${CURL_INCLUDES}" HAVE_FCNTL )
2021-05-04 12:03:30 +03:00
check_symbol_exists ( getppid "${CURL_INCLUDES}" HAVE_GETPPID )
check_symbol_exists ( utimes "${CURL_INCLUDES}" HAVE_UTIMES )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( gettimeofday "${CURL_INCLUDES}" HAVE_GETTIMEOFDAY )
check_symbol_exists ( closesocket "${CURL_INCLUDES}" HAVE_CLOSESOCKET )
2023-10-06 02:04:40 +03:00
check_symbol_exists ( sigsetjmp "${CURL_INCLUDES};setjmp.h" HAVE_SIGSETJMP )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( getpass_r "${CURL_INCLUDES}" HAVE_GETPASS_R )
check_symbol_exists ( getpwuid "${CURL_INCLUDES}" HAVE_GETPWUID )
2018-05-27 11:38:07 +03:00
check_symbol_exists ( getpwuid_r "${CURL_INCLUDES}" HAVE_GETPWUID_R )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( geteuid "${CURL_INCLUDES}" HAVE_GETEUID )
check_symbol_exists ( utime "${CURL_INCLUDES}" HAVE_UTIME )
2023-09-26 01:35:26 +03:00
check_symbol_exists ( gmtime_r "${CURL_INCLUDES};stdlib.h;time.h" HAVE_GMTIME_R )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( gethostbyname_r "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R )
2023-10-06 02:04:40 +03:00
check_symbol_exists ( signal "${CURL_INCLUDES};signal.h" HAVE_SIGNAL )
2023-09-26 01:35:26 +03:00
check_symbol_exists ( strtoll "${CURL_INCLUDES};stdlib.h" HAVE_STRTOLL )
check_symbol_exists ( strerror_r "${CURL_INCLUDES};stdlib.h;string.h" HAVE_STRERROR_R )
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
check_symbol_exists ( sigaction "signal.h" HAVE_SIGACTION )
2023-10-06 02:04:40 +03:00
check_symbol_exists ( siginterrupt "${CURL_INCLUDES};signal.h" HAVE_SIGINTERRUPT )
2023-09-26 01:35:26 +03:00
check_symbol_exists ( getaddrinfo "${CURL_INCLUDES};stdlib.h;string.h" HAVE_GETADDRINFO )
2023-09-26 01:35:26 +03:00
check_symbol_exists ( getifaddrs "${CURL_INCLUDES};stdlib.h" HAVE_GETIFADDRS )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( freeaddrinfo "${CURL_INCLUDES}" HAVE_FREEADDRINFO )
check_symbol_exists ( pipe "${CURL_INCLUDES}" HAVE_PIPE )
2024-06-01 21:26:11 +03:00
check_symbol_exists ( eventfd "${CURL_INCLUDES};sys/eventfd.h" HAVE_EVENTFD )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( ftruncate "${CURL_INCLUDES}" HAVE_FTRUNCATE )
2023-09-25 23:06:44 +03:00
check_symbol_exists ( _fseeki64 "${CURL_INCLUDES};stdio.h" HAVE__FSEEKI64 )
2019-05-05 18:08:22 +03:00
check_symbol_exists ( getpeername "${CURL_INCLUDES}" HAVE_GETPEERNAME )
check_symbol_exists ( getsockname "${CURL_INCLUDES}" HAVE_GETSOCKNAME )
2019-05-21 17:47:53 +03:00
check_symbol_exists ( if_nametoindex "${CURL_INCLUDES}" HAVE_IF_NAMETOINDEX )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( getrlimit "${CURL_INCLUDES}" HAVE_GETRLIMIT )
check_symbol_exists ( setlocale "${CURL_INCLUDES}" HAVE_SETLOCALE )
2017-11-10 22:46:41 +03:00
check_symbol_exists ( setmode "${CURL_INCLUDES}" HAVE_SETMODE )
2009-06-09 21:29:16 +04:00
check_symbol_exists ( setrlimit "${CURL_INCLUDES}" HAVE_SETRLIMIT )
2022-09-22 12:52:08 +03:00
if ( NOT MSVC OR ( MSVC_VERSION GREATER_EQUAL 1900 ) )
# earlier MSVC compilers had faulty snprintf implementations
2022-12-24 04:45:30 +03:00
check_symbol_exists ( snprintf "stdio.h" HAVE_SNPRINTF )
2022-09-22 12:52:08 +03:00
endif ( )
2017-10-30 15:12:41 +03:00
check_function_exists ( mach_absolute_time HAVE_MACH_ABSOLUTE_TIME )
2023-09-26 01:35:26 +03:00
check_symbol_exists ( inet_ntop "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_NTOP )
2022-10-11 10:42:16 +03:00
if ( MSVC AND ( MSVC_VERSION LESS_EQUAL 1600 ) )
set ( HAVE_INET_NTOP OFF )
endif ( )
2023-09-26 01:35:26 +03:00
check_symbol_exists ( inet_pton "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_PTON )
2009-04-02 17:14:53 +04:00
2016-07-19 03:27:20 +03:00
check_symbol_exists ( fsetxattr "${CURL_INCLUDES}" HAVE_FSETXATTR )
if ( HAVE_FSETXATTR )
foreach ( CURL_TEST HAVE_FSETXATTR_5 HAVE_FSETXATTR_6 )
2018-03-31 13:17:45 +03:00
curl_internal_test ( ${ CURL_TEST } )
2018-07-05 13:55:47 +03:00
endforeach ( )
endif ( )
2016-07-19 03:27:20 +03:00
2021-05-20 13:11:42 +03:00
set ( CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h" )
check_type_size ( "sa_family_t" SIZEOF_SA_FAMILY_T )
set ( HAVE_SA_FAMILY_T ${ HAVE_SIZEOF_SA_FAMILY_T } )
set ( CMAKE_EXTRA_INCLUDE_FILES "" )
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
if ( WIN32 )
2023-12-02 02:06:12 +03:00
set ( CMAKE_EXTRA_INCLUDE_FILES "winsock2.h" )
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
check_type_size ( "ADDRESS_FAMILY" SIZEOF_ADDRESS_FAMILY )
set ( HAVE_ADDRESS_FAMILY ${ HAVE_SIZEOF_ADDRESS_FAMILY } )
set ( CMAKE_EXTRA_INCLUDE_FILES "" )
2018-07-05 13:55:47 +03:00
endif ( )
2009-04-02 17:14:53 +04:00
# Do curl specific tests
2010-03-24 17:57:54 +03:00
foreach ( CURL_TEST
2009-04-02 17:14:53 +04:00
H A V E _ F C N T L _ O _ N O N B L O C K
H A V E _ I O C T L S O C K E T
H A V E _ I O C T L S O C K E T _ C A M E L
H A V E _ I O C T L S O C K E T _ C A M E L _ F I O N B I O
H A V E _ I O C T L S O C K E T _ F I O N B I O
H A V E _ I O C T L _ F I O N B I O
H A V E _ I O C T L _ S I O C G I F A D D R
H A V E _ S E T S O C K O P T _ S O _ N O N B L O C K
H A V E _ O _ N O N B L O C K
H A V E _ G E T H O S T B Y N A M E _ R _ 3
H A V E _ G E T H O S T B Y N A M E _ R _ 5
H A V E _ G E T H O S T B Y N A M E _ R _ 6
H A V E _ G E T H O S T B Y N A M E _ R _ 3 _ R E E N T R A N T
H A V E _ G E T H O S T B Y N A M E _ R _ 5 _ R E E N T R A N T
H A V E _ G E T H O S T B Y N A M E _ R _ 6 _ R E E N T R A N T
H A V E _ I N _ A D D R _ T
H A V E _ B O O L _ T
S T D C _ H E A D E R S
H A V E _ F I L E _ O F F S E T _ B I T S
2022-08-14 22:05:40 +03:00
H A V E _ A T O M I C
2009-04-02 17:14:53 +04:00
)
2009-06-09 21:29:16 +04:00
curl_internal_test ( ${ CURL_TEST } )
2018-07-05 13:55:47 +03:00
endforeach ( )
2016-08-08 07:25:03 +03:00
2009-06-09 21:29:16 +04:00
if ( HAVE_FILE_OFFSET_BITS )
set ( _FILE_OFFSET_BITS 64 )
2016-08-08 07:25:03 +03:00
set ( CMAKE_REQUIRED_FLAGS "-D_FILE_OFFSET_BITS=64" )
2018-07-05 13:55:47 +03:00
endif ( )
2016-08-08 07:25:03 +03:00
check_type_size ( "off_t" SIZEOF_OFF_T )
2017-08-12 16:54:06 +03:00
2024-04-02 20:42:08 +03:00
# fseeko may not exist with _FILE_OFFSET_BITS=64 but can exist with
# _FILE_OFFSET_BITS unset or 32 (e.g. Android ARMv7 with NDK 26b and API level < 24)
# so we need to test fseeko after testing for _FILE_OFFSET_BITS
check_symbol_exists ( fseeko "${CURL_INCLUDES};stdio.h" HAVE_FSEEKO )
if ( HAVE_FSEEKO )
set ( HAVE_DECL_FSEEKO 1 )
endif ( )
2017-08-12 16:54:06 +03:00
# include this header to get the type
set ( CMAKE_REQUIRED_INCLUDES "${CURL_SOURCE_DIR}/include" )
set ( CMAKE_EXTRA_INCLUDE_FILES "curl/system.h" )
check_type_size ( "curl_off_t" SIZEOF_CURL_OFF_T )
2023-03-28 17:46:03 +03:00
set ( CMAKE_EXTRA_INCLUDE_FILES "curl/curl.h" )
check_type_size ( "curl_socket_t" SIZEOF_CURL_SOCKET_T )
2017-08-12 16:54:06 +03:00
set ( CMAKE_EXTRA_INCLUDE_FILES "" )
2023-09-29 01:52:02 +03:00
if ( NOT WIN32 AND NOT CMAKE_CROSSCOMPILING )
# on not-Windows and not-crosscompiling, check for writable argv[]
include ( CheckCSourceRuns )
check_c_source_runs ( "
i n t main ( int argc, char **argv )
{
( v o i d ) a r g c ;
a r g v [ 0 ] [ 0 ] = ' ' ;
return ( argv[0][0] == ' ' ) ? 0 : 1 ;
} " H A V E _ W R I T A B L E _ A R G V )
endif ( )
2016-08-08 07:25:03 +03:00
set ( CMAKE_REQUIRED_FLAGS )
2022-09-09 16:11:14 +03:00
option ( ENABLE_WEBSOCKETS "Set to ON to enable EXPERIMENTAL websockets" OFF )
if ( ENABLE_WEBSOCKETS )
if ( ${ SIZEOF_CURL_OFF_T } GREATER "4" )
set ( USE_WEBSOCKETS ON )
else ( )
message ( WARNING "curl_off_t is too small to enable WebSockets" )
endif ( )
endif ( )
2010-03-24 17:57:54 +03:00
foreach ( CURL_TEST
2009-04-02 17:14:53 +04:00
H A V E _ G L I B C _ S T R E R R O R _ R
H A V E _ P O S I X _ S T R E R R O R _ R
)
2018-03-31 13:17:45 +03:00
curl_internal_test ( ${ CURL_TEST } )
2018-07-05 13:55:47 +03:00
endforeach ( )
2009-04-02 17:14:53 +04:00
# Check for reentrant
2009-06-09 21:29:16 +04:00
foreach ( CURL_TEST
2009-04-02 17:14:53 +04:00
H A V E _ G E T H O S T B Y N A M E _ R _ 3
H A V E _ G E T H O S T B Y N A M E _ R _ 5
2021-06-18 11:16:16 +03:00
H A V E _ G E T H O S T B Y N A M E _ R _ 6 )
2009-06-09 21:29:16 +04:00
if ( NOT ${ CURL_TEST } )
if ( ${ CURL_TEST } _REENTRANT )
set ( NEED_REENTRANT 1 )
2018-07-05 13:55:47 +03:00
endif ( )
endif ( )
endforeach ( )
2009-06-09 21:29:16 +04:00
if ( NEED_REENTRANT )
foreach ( CURL_TEST
2009-04-02 17:14:53 +04:00
H A V E _ G E T H O S T B Y N A M E _ R _ 3
H A V E _ G E T H O S T B Y N A M E _ R _ 5
H A V E _ G E T H O S T B Y N A M E _ R _ 6 )
2009-06-09 21:29:16 +04:00
set ( ${ CURL_TEST } 0 )
if ( ${ CURL_TEST } _REENTRANT )
set ( ${ CURL_TEST } 1 )
2018-07-05 13:55:47 +03:00
endif ( )
endforeach ( )
endif ( )
2009-06-09 21:29:16 +04:00
cmake: pre-fill rest of detection values for Windows
The goal of this patch is to avoid unnecessary feature detection work
when doing Windows builds with CMake. Do this by pre-filling well-known
detection results for Windows and specifically for mingw-w64 and MSVC
compilers. Also limit feature checks to platforms where the results are
actually used. Drop a few redundant ones. And some tidying up.
- pre-fill remaining detection values in Windows CMake builds.
Based on actual detection results observed in CI runs, preceding
similar work over libssh2 and matching up values with
`lib/config-win32.h`.
This brings down CMake configuration time from 58 to 14 seconds on the
same local machine.
On AppVeyor CI this translates to:
- 128 seconds -> 50 seconds VS2022 MSVC with OpenSSL (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/4gw66ecrjpy7necb#L296
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/8m4fwrr2fe249uo8#L186
- 62 seconds -> 16 seconds VS2017 MINGW (per CMake job):
https://ci.appveyor.com/project/curlorg/curl/builds/48208419/job/s1y8q5ivlcs7ub29?fullLog=true#L290
https://ci.appveyor.com/project/curlorg/curl/builds/48217440/job/pchpxyjsyc9kl13a?fullLog=true#L194
The formula is about 1-3 seconds delay for each detection. Almost all
of these trigger a full compile-link cycle behind the scenes, slow
even today, both cross and native, mingw-w64 and apparently MSVC too.
Enabling .map files or other custom build features slows it down
further. (Similar is expected for autotools configure.)
- stop detecting `idn2.h` if idn2 was deselected.
autotools does this.
- stop detecting `idn2.h` if idn2 was not found.
This deviates from autotools. Source code requires both header and
lib, so this is still correct, but faster.
- limit `ADDRESS_FAMILY` detection to Windows.
- normalize `HAVE_WIN32_WINNT` value to lowercase `0x0a12` format.
- pre-fill `HAVE_WIN32_WINNT`-dependent detection results.
Saving 4 (slow) feature-detections in most builds: `getaddrinfo`,
`freeaddrinfo`, `inet_ntop`, `inet_pton`
- fix pre-filled `HAVE_SYS_TIME_H`, `HAVE_SYS_PARAM_H`,
`HAVE_GETTIMEOFDAY` for mingw-w64.
Luckily this do not change build results, as `WIN32` took
priority over `HAVE_GETTIMEOFDAY` with the current source
code.
- limit `HAVE_CLOCK_GETTIME_MONOTONIC_RAW` and
`HAVE_CLOCK_GETTIME_MONOTONIC` detections to non-Windows.
We're not using these in the source code for Windows.
- reduce compiler warning noise in CMake internal logs:
- fix to include `winsock2.h` before `windows.h`.
Apply it to autotools test snippets too.
- delete previous `-D_WINSOCKAPI_=` hack that aimed to fix the above.
- cleanup `CMake/CurlTests.c` to emit less warnings.
- delete redundant `HAVE_MACRO_SIGSETJMP` feature check.
It was the same check as `HAVE_SIGSETJMP`.
- delete 'experimental' marking from `CURL_USE_OPENSSL`.
- show CMake version via `CMakeLists.txt`.
Credit to the `zlib-ng` project for the idea:
https://github.com/zlib-ng/zlib-ng/blob/61e181c8ae93dbf56040336179c9954078bd1399/CMakeLists.txt#L7
- make `CMake/CurlTests.c` pass `checksrc`.
- `CMake/WindowsCache.cmake` tidy-ups.
- replace `WIN32` guard with `_WIN32` in `CMake/CurlTests.c`.
Closes #12044
2023-10-06 02:38:59 +03:00
if ( NOT WIN32 )
# Check clock_gettime(CLOCK_MONOTONIC, x) support
curl_internal_test ( HAVE_CLOCK_GETTIME_MONOTONIC )
endif ( )
2018-10-04 21:31:23 +03:00
2024-07-06 04:57:51 +03:00
if ( APPLE )
# Check compiler support of __builtin_available()
curl_internal_test ( HAVE_BUILTIN_AVAILABLE )
endif ( )
2018-10-04 21:31:23 +03:00
2009-04-02 17:14:53 +04:00
# Some other minor tests
2009-06-09 21:29:16 +04:00
if ( NOT HAVE_IN_ADDR_T )
set ( in_addr_t "unsigned long" )
2018-07-05 13:55:47 +03:00
endif ( )
2009-04-02 17:14:53 +04:00
# Check for nonblocking
2009-06-09 21:29:16 +04:00
set ( HAVE_DISABLED_NONBLOCKING 1 )
2010-03-24 17:57:54 +03:00
if ( HAVE_FIONBIO OR
2024-05-19 19:49:42 +03:00
H A V E _ I O C T L S O C K E T O R
H A V E _ I O C T L S O C K E T _ C A S E O R
H A V E _ O _ N O N B L O C K )
2009-06-09 21:29:16 +04:00
set ( HAVE_DISABLED_NONBLOCKING )
2018-07-05 13:55:47 +03:00
endif ( )
2009-04-02 17:14:53 +04:00
2009-06-09 21:29:16 +04:00
if ( CMAKE_COMPILER_IS_GNUCC AND APPLE )
include ( CheckCCompilerFlag )
check_c_compiler_flag ( -Wno-long-double HAVE_C_FLAG_Wno_long_double )
if ( HAVE_C_FLAG_Wno_long_double )
2024-05-19 19:49:42 +03:00
# The Mac version of GCC warns about use of long double. Disable it.
2013-01-04 05:50:28 +04:00
get_source_file_property ( MPRINTF_COMPILE_FLAGS mprintf.c COMPILE_FLAGS )
2009-06-09 21:29:16 +04:00
if ( MPRINTF_COMPILE_FLAGS )
set ( MPRINTF_COMPILE_FLAGS "${MPRINTF_COMPILE_FLAGS} -Wno-long-double" )
2018-07-05 13:55:47 +03:00
else ( )
2009-06-09 21:29:16 +04:00
set ( MPRINTF_COMPILE_FLAGS "-Wno-long-double" )
2018-07-05 13:55:47 +03:00
endif ( )
2013-01-04 05:50:28 +04:00
set_source_files_properties ( mprintf.c PROPERTIES
2009-04-02 17:14:53 +04:00
C O M P I L E _ F L A G S $ { M P R I N T F _ C O M P I L E _ F L A G S } )
2018-07-05 13:55:47 +03:00
endif ( )
endif ( )
2009-04-02 17:14:53 +04:00
2009-06-09 21:29:16 +04:00
include ( CMake/OtherTests.cmake )
2009-04-02 17:14:53 +04:00
2009-06-09 21:29:16 +04:00
add_definitions ( -DHAVE_CONFIG_H )
2009-04-02 17:14:53 +04:00
2018-05-30 15:08:26 +03:00
# For Windows, all compilers used by CMake should support large files
2016-08-08 07:25:03 +03:00
if ( WIN32 )
set ( USE_WIN32_LARGE_FILES ON )
2018-05-30 15:08:26 +03:00
# Use the manifest embedded in the Windows Resource
set ( CMAKE_RC_FLAGS "${CMAKE_RC_FLAGS} -DCURL_EMBED_MANIFEST" )
2021-03-06 17:52:09 +03:00
2023-08-11 03:37:26 +03:00
# We use crypto functions that are not available for UWP apps
if ( NOT WINDOWS_STORE )
2021-03-06 17:52:09 +03:00
set ( USE_WIN32_CRYPTO ON )
endif ( )
# Link required libraries for USE_WIN32_CRYPTO or USE_SCHANNEL
if ( USE_WIN32_CRYPTO OR USE_SCHANNEL )
list ( APPEND CURL_LIBS "advapi32" "crypt32" )
endif ( )
2018-07-05 13:55:47 +03:00
endif ( )
2016-08-08 07:25:03 +03:00
2009-06-09 21:29:16 +04:00
if ( MSVC )
2018-05-30 15:08:26 +03:00
# Disable default manifest added by CMake
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO" )
2009-06-09 21:29:16 +04:00
add_definitions ( -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE )
2017-07-18 19:46:53 +03:00
if ( CMAKE_C_FLAGS MATCHES "/W[0-4]" )
string ( REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" )
2018-07-05 13:55:47 +03:00
else ( )
2017-07-18 19:46:53 +03:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4" )
2018-07-05 13:55:47 +03:00
endif ( )
2021-05-20 21:11:57 +03:00
# Use multithreaded compilation on VS 2008+
if ( MSVC_VERSION GREATER_EQUAL 1500 )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP" )
endif ( )
2018-07-05 13:55:47 +03:00
endif ( )
2009-04-02 17:14:53 +04:00
2018-03-22 16:34:49 +03:00
if ( CURL_WERROR )
if ( MSVC_VERSION )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX" )
else ( )
# this assumes clang or gcc style options
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror" )
endif ( )
2018-07-05 13:55:47 +03:00
endif ( )
2018-03-22 16:34:49 +03:00
2020-01-09 14:10:55 +03:00
if ( CURL_LTO )
if ( CMAKE_VERSION VERSION_LESS 3.9 )
message ( FATAL_ERROR "Requested LTO but your cmake version ${CMAKE_VERSION} is to old. You need at least 3.9" )
endif ( )
cmake_policy ( SET CMP0069 NEW )
include ( CheckIPOSupported )
check_ipo_supported ( RESULT CURL_HAS_LTO OUTPUT CURL_LTO_ERROR LANGUAGES C )
if ( CURL_HAS_LTO )
message ( STATUS "LTO supported and enabled" )
else ( )
message ( FATAL_ERROR "LTO was requested - but compiler doesn't support it\n${CURL_LTO_ERROR}" )
endif ( )
endif ( )
2024-05-19 19:49:42 +03:00
# Ugly (but functional) way to include "Makefile.inc" by transforming it
# (= regenerate it).
2018-10-30 17:45:46 +03:00
function ( transform_makefile_inc INPUT_FILE OUTPUT_FILE )
2024-07-31 12:53:31 +03:00
file ( STRINGS "${INPUT_FILE}" _makefile_inc_lines )
set ( MAKEFILE_INC_TEXT "" )
foreach ( _line IN LISTS _makefile_inc_lines )
if ( _line MATCHES "### USE SIMPLE LIST ASSIGMENTS ABOVE THIS LINE ###" )
break ( )
endif ( )
set ( MAKEFILE_INC_TEXT "${MAKEFILE_INC_TEXT}${_line}\n" )
endforeach ( )
2009-06-09 21:29:16 +04:00
string ( REPLACE "$(top_srcdir)" "\${CURL_SOURCE_DIR}" MAKEFILE_INC_TEXT ${ MAKEFILE_INC_TEXT } )
string ( REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${ MAKEFILE_INC_TEXT } )
2009-04-09 03:20:04 +04:00
2017-02-21 01:07:58 +03:00
string ( REGEX REPLACE "\\\\\n" "!π!α !" MAKEFILE_INC_TEXT ${ MAKEFILE_INC_TEXT } )
2010-10-12 19:27:56 +04:00
string ( REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${ MAKEFILE_INC_TEXT } )
2017-02-21 01:07:58 +03:00
string ( REPLACE "!π!α !" "\n" MAKEFILE_INC_TEXT ${ MAKEFILE_INC_TEXT } )
2009-04-09 03:20:04 +04:00
2024-05-19 19:49:42 +03:00
string ( REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${ MAKEFILE_INC_TEXT } ) # Replace $() with ${}
string ( REGEX REPLACE "@([a-zA-Z_][a-zA-Z0-9_]*)@" "\${\\1}" MAKEFILE_INC_TEXT ${ MAKEFILE_INC_TEXT } ) # Replace @@ with ${}, even if that may not be read by CMake scripts.
2009-06-09 21:29:16 +04:00
file ( WRITE ${ OUTPUT_FILE } ${ MAKEFILE_INC_TEXT } )
2020-05-27 23:36:22 +03:00
set_property ( DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${INPUT_FILE}" )
2009-06-09 21:29:16 +04:00
endfunction ( )
2009-04-07 02:45:17 +04:00
2018-07-18 02:31:51 +03:00
include ( GNUInstallDirs )
set ( CURL_INSTALL_CMAKE_DIR ${ CMAKE_INSTALL_LIBDIR } /cmake/ ${ PROJECT_NAME } )
set ( TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets" )
set ( generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated" )
set ( project_config "${generated_dir}/${PROJECT_NAME}Config.cmake" )
set ( version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake" )
2017-09-10 17:56:16 +03:00
2024-05-16 03:56:37 +03:00
cmake_dependent_option ( BUILD_TESTING "Build tests"
O N " P E R L _ F O U N D ; N O T C U R L _ D I S A B L E _ T E S T S "
O F F )
2024-01-24 15:25:15 +03:00
if ( HAVE_MANUAL_TOOLS )
2017-09-26 10:42:12 +03:00
add_subdirectory ( docs )
endif ( )
2009-06-09 21:29:16 +04:00
add_subdirectory ( lib )
2017-09-26 10:42:12 +03:00
2009-06-09 21:29:16 +04:00
if ( BUILD_CURL_EXE )
add_subdirectory ( src )
endif ( )
2016-06-16 13:53:50 +03:00
2024-04-28 01:11:38 +03:00
option ( BUILD_EXAMPLES "Build libcurl examples" OFF )
if ( BUILD_EXAMPLES )
add_subdirectory ( docs/examples )
endif ( )
2020-10-13 23:37:15 +03:00
if ( BUILD_TESTING )
2009-06-09 21:29:16 +04:00
add_subdirectory ( tests )
endif ( )
2009-04-02 17:14:53 +04:00
2024-07-31 12:53:31 +03:00
# Verify if all CMake include/input files are listed as distributable
if ( ENABLE_DIST_TEST )
# Get 'CMAKE_DIST' variable
transform_makefile_inc ( "Makefile.am" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.am.cmake" )
include ( ${ CMAKE_CURRENT_BINARY_DIR } /Makefile.am.cmake )
file ( GLOB_RECURSE curl_cmake_files_found RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / C M a k e / * . c m a k e "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / C M a k e / * . i n " )
foreach ( _item IN LISTS curl_cmake_files_found )
if ( NOT _item IN_LIST CMAKE_DIST )
message ( FATAL_ERROR "Source file missing from the Makefile.am CMAKE_DIST list: ${_item}" )
endif ( )
endforeach ( )
endif ( )
2023-11-07 00:19:00 +03:00
if ( NOT CURL_DISABLE_INSTALL )
2014-10-14 13:38:15 +04:00
2024-03-27 12:56:24 +03:00
install ( FILES "${PROJECT_SOURCE_DIR}/scripts/mk-ca-bundle.pl"
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ B I N D I R }
P E R M I S S I O N S
O W N E R _ R E A D O W N E R _ W R I T E O W N E R _ E X E C U T E
G R O U P _ R E A D G R O U P _ E X E C U T E
W O R L D _ R E A D W O R L D _ E X E C U T E )
2024-05-19 19:49:42 +03:00
# Helper to populate a list (_items) with a label when conditions
# (the remaining args) are satisfied
2023-11-07 00:19:00 +03:00
macro ( _add_if label )
# needs to be a macro to allow this indirection
if ( ${ ARGN } )
set ( _items ${ _items } "${label}" )
2020-06-04 12:28:01 +03:00
endif ( )
2023-11-07 00:19:00 +03:00
endmacro ( )
2024-06-30 12:37:06 +03:00
# NTLM support requires crypto functions from various SSL libs.
# These conditions must match those in lib/curl_setup.h.
if ( NOT CURL_DISABLE_NTLM AND
( U S E _ O P E N S S L O R
U S E _ M B E D T L S O R
U S E _ G N U T L S O R
U S E _ S E C T R A N S P O R
U S E _ W I N 3 2 _ C R Y P T O O R
( U S E _ W O L F S S L A N D H A V E _ W O L F S S L _ D E S _ E C B _ E N C R Y P T ) ) )
2023-11-07 00:19:00 +03:00
set ( use_curl_ntlm_core ON )
endif ( )
2024-07-02 01:11:29 +03:00
# Clear list and try to detect available protocols
set ( _items )
_add_if ( "HTTP" NOT CURL_DISABLE_HTTP )
_add_if ( "IPFS" NOT CURL_DISABLE_HTTP )
_add_if ( "IPNS" NOT CURL_DISABLE_HTTP )
_add_if ( "HTTPS" NOT CURL_DISABLE_HTTP AND SSL_ENABLED )
_add_if ( "FTP" NOT CURL_DISABLE_FTP )
_add_if ( "FTPS" NOT CURL_DISABLE_FTP AND SSL_ENABLED )
_add_if ( "FILE" NOT CURL_DISABLE_FILE )
_add_if ( "TELNET" NOT CURL_DISABLE_TELNET )
_add_if ( "LDAP" NOT CURL_DISABLE_LDAP )
# CURL_DISABLE_LDAP implies CURL_DISABLE_LDAPS
_add_if ( "LDAPS" NOT CURL_DISABLE_LDAPS AND
( ( U S E _ O P E N L D A P A N D S S L _ E N A B L E D ) O R
( N O T U S E _ O P E N L D A P A N D H A V E _ L D A P _ S S L ) ) )
_add_if ( "DICT" NOT CURL_DISABLE_DICT )
_add_if ( "TFTP" NOT CURL_DISABLE_TFTP )
_add_if ( "GOPHER" NOT CURL_DISABLE_GOPHER )
_add_if ( "GOPHERS" NOT CURL_DISABLE_GOPHER AND SSL_ENABLED )
_add_if ( "POP3" NOT CURL_DISABLE_POP3 )
_add_if ( "POP3S" NOT CURL_DISABLE_POP3 AND SSL_ENABLED )
_add_if ( "IMAP" NOT CURL_DISABLE_IMAP )
_add_if ( "IMAPS" NOT CURL_DISABLE_IMAP AND SSL_ENABLED )
_add_if ( "SMB" NOT CURL_DISABLE_SMB AND
u s e _ c u r l _ n t l m _ c o r e AND ( SIZEOF_CURL_OFF_T GREATER 4 ) )
_add_if ( "SMBS" NOT CURL_DISABLE_SMB AND SSL_ENABLED AND
u s e _ c u r l _ n t l m _ c o r e AND ( SIZEOF_CURL_OFF_T GREATER 4 ) )
_add_if ( "SMTP" NOT CURL_DISABLE_SMTP )
_add_if ( "SMTPS" NOT CURL_DISABLE_SMTP AND SSL_ENABLED )
_add_if ( "SCP" USE_LIBSSH2 OR USE_LIBSSH )
_add_if ( "SFTP" USE_LIBSSH2 OR USE_LIBSSH )
_add_if ( "RTSP" NOT CURL_DISABLE_RTSP )
_add_if ( "RTMP" USE_LIBRTMP )
_add_if ( "MQTT" NOT CURL_DISABLE_MQTT )
_add_if ( "WS" USE_WEBSOCKETS )
_add_if ( "WSS" USE_WEBSOCKETS AND SSL_ENABLED )
if ( _items )
list ( SORT _items )
endif ( )
string ( REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}" )
string ( TOLOWER "${SUPPORT_PROTOCOLS}" SUPPORT_PROTOCOLS_LOWER )
2024-07-07 20:29:08 +03:00
message ( STATUS "Protocols: ${SUPPORT_PROTOCOLS_LOWER}" )
2024-07-02 01:11:29 +03:00
2023-11-07 00:19:00 +03:00
# Clear list and try to detect available features
set ( _items )
_add_if ( "SSL" SSL_ENABLED )
_add_if ( "IPv6" ENABLE_IPV6 )
2023-11-16 01:31:44 +03:00
_add_if ( "UnixSockets" USE_UNIX_SOCKETS )
2023-11-07 00:19:00 +03:00
_add_if ( "libz" HAVE_LIBZ )
_add_if ( "brotli" HAVE_BROTLI )
2024-06-24 21:26:34 +03:00
_add_if ( "gsasl" USE_GSASL )
2023-11-07 00:19:00 +03:00
_add_if ( "zstd" HAVE_ZSTD )
_add_if ( "AsynchDNS" USE_ARES OR USE_THREADS_POSIX OR USE_THREADS_WIN32 )
2024-07-13 14:06:33 +03:00
_add_if ( "IDN" ( HAVE_LIBIDN2 AND HAVE_IDN2_H ) OR
U S E _ W I N 3 2 _ I D N O R
U S E _ A P P L E _ I D N )
2023-11-07 00:19:00 +03:00
_add_if ( "Largefile" ( SIZEOF_CURL_OFF_T GREATER 4 ) AND
( ( S I Z E O F _ O F F _ T G R E A T E R 4 ) O R U S E _ W I N 3 2 _ L A R G E _ F I L E S ) )
_add_if ( "SSPI" USE_WINDOWS_SSPI )
_add_if ( "GSS-API" HAVE_GSSAPI )
_add_if ( "alt-svc" NOT CURL_DISABLE_ALTSVC )
_add_if ( "HSTS" NOT CURL_DISABLE_HSTS )
_add_if ( "SPNEGO" NOT CURL_DISABLE_NEGOTIATE_AUTH AND
( H A V E _ G S S A P I O R U S E _ W I N D O W S _ S S P I ) )
_add_if ( "Kerberos" NOT CURL_DISABLE_KERBEROS_AUTH AND
( H A V E _ G S S A P I O R U S E _ W I N D O W S _ S S P I ) )
_add_if ( "NTLM" NOT ( CURL_DISABLE_NTLM ) AND
( u s e _ c u r l _ n t l m _ c o r e O R U S E _ W I N D O W S _ S S P I ) )
_add_if ( "TLS-SRP" USE_TLS_SRP )
_add_if ( "HTTP2" USE_NGHTTP2 )
2024-03-03 22:57:03 +03:00
_add_if ( "HTTP3" USE_NGTCP2 OR USE_QUICHE OR USE_OPENSSL_QUIC )
2023-11-07 00:19:00 +03:00
_add_if ( "MultiSSL" CURL_WITH_MULTI_SSL )
_add_if ( "HTTPS-proxy" SSL_ENABLED AND ( USE_OPENSSL OR USE_GNUTLS
O R U S E _ S C H A N N E L O R U S E _ R U S T L S O R U S E _ B E A R S S L O R
2024-06-30 12:37:06 +03:00
U S E _ M B E D T L S O R U S E _ S E C T R A N S P O R
( U S E _ W O L F S S L A N D H A V E _ W O L F S S L _ F U L L _ B I O ) ) )
2024-07-07 20:29:08 +03:00
_add_if ( "Unicode" ENABLE_UNICODE )
2023-11-07 00:19:00 +03:00
_add_if ( "threadsafe" HAVE_ATOMIC OR
( U S E _ T H R E A D S _ P O S I X A N D H A V E _ P T H R E A D _ H ) O R
( WIN32 A N D H A V E _ W I N 3 2 _ W I N N T G R E A T E R _ E Q U A L 0 x 6 0 0 ) )
2024-07-04 06:04:35 +03:00
_add_if ( "Debug" ENABLE_DEBUG )
_add_if ( "TrackMemory" ENABLE_CURLDEBUG )
_add_if ( "ECH" SSL_ENABLED AND HAVE_ECH )
2023-11-07 00:19:00 +03:00
_add_if ( "PSL" USE_LIBPSL )
2024-06-30 01:26:49 +03:00
if ( _items )
2024-07-01 01:39:03 +03:00
if ( NOT CMAKE_VERSION VERSION_LESS 3.13 )
list ( SORT _items CASE INSENSITIVE )
else ( )
list ( SORT _items )
endif ( )
2024-06-30 01:26:49 +03:00
endif ( )
2023-11-07 00:19:00 +03:00
string ( REPLACE ";" " " SUPPORT_FEATURES "${_items}" )
2024-07-07 20:29:08 +03:00
message ( STATUS "Features: ${SUPPORT_FEATURES}" )
2023-11-07 00:19:00 +03:00
# Clear list and collect SSL backends
set ( _items )
_add_if ( "Schannel" SSL_ENABLED AND USE_SCHANNEL )
_add_if ( "OpenSSL" SSL_ENABLED AND USE_OPENSSL )
_add_if ( "Secure Transport" SSL_ENABLED AND USE_SECTRANSP )
_add_if ( "mbedTLS" SSL_ENABLED AND USE_MBEDTLS )
_add_if ( "BearSSL" SSL_ENABLED AND USE_BEARSSL )
_add_if ( "wolfSSL" SSL_ENABLED AND USE_WOLFSSL )
_add_if ( "GnuTLS" SSL_ENABLED AND USE_GNUTLS )
if ( _items )
2024-07-07 20:29:08 +03:00
if ( NOT CMAKE_VERSION VERSION_LESS 3.13 )
list ( SORT _items CASE INSENSITIVE )
else ( )
list ( SORT _items )
endif ( )
2023-11-07 00:19:00 +03:00
endif ( )
string ( REPLACE ";" " " SSL_BACKENDS "${_items}" )
message ( STATUS "Enabled SSL backends: ${SSL_BACKENDS}" )
if ( CURL_DEFAULT_SSL_BACKEND )
message ( STATUS "Default SSL backend: ${CURL_DEFAULT_SSL_BACKEND}" )
endif ( )
# curl-config needs the following options to be set.
set ( CC "${CMAKE_C_COMPILER}" )
# TODO probably put a -D... options here?
set ( CONFIGURE_OPTIONS "" )
set ( CURLVERSION "${CURL_VERSION}" )
set ( exec_prefix "\${prefix}" )
set ( includedir "\${prefix}/include" )
set ( LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS}" )
set ( LIBCURL_LIBS "" )
set ( libdir "${CMAKE_INSTALL_PREFIX}/lib" )
2024-02-13 08:45:57 +03:00
# For processing full path libraries into -L and -l ld options,
# the directories that go with the -L option are cached, so they
# only get added once per such directory.
set ( _libcurl_libs_dirs )
# To avoid getting unnecessary -L options for known system directories,
# _libcurl_libs_dirs is seeded with them.
foreach ( _libdir ${ CMAKE_SYSTEM_PREFIX_PATH } )
if ( _libdir MATCHES "/$" )
set ( _libdir "${_libdir}lib" )
else ( )
set ( _libdir "${_libdir}/lib" )
endif ( )
if ( IS_DIRECTORY "${_libdir}" )
list ( APPEND _libcurl_libs_dirs "${_libdir}" )
endif ( )
if ( DEFINED CMAKE_LIBRARY_ARCHITECTURE )
set ( _libdir "${_libdir}/${CMAKE_LIBRARY_ARCHITECTURE}" )
if ( IS_DIRECTORY "${_libdir}" )
list ( APPEND _libcurl_libs_dirs "${_libdir}" )
endif ( )
endif ( )
endforeach ( )
2023-11-07 00:19:00 +03:00
foreach ( _lib ${ CMAKE_C_IMPLICIT_LINK_LIBRARIES } ${ CURL_LIBS } )
if ( TARGET "${_lib}" )
set ( _libname "${_lib}" )
get_target_property ( _imported "${_libname}" IMPORTED )
if ( NOT _imported )
# Reading the LOCATION property on non-imported target will error out.
# Assume the user won't need this information in the .pc file.
continue ( )
endif ( )
get_target_property ( _lib "${_libname}" LOCATION )
if ( NOT _lib )
message ( WARNING "Bad lib in library list: ${_libname}" )
continue ( )
endif ( )
2020-05-10 17:23:30 +03:00
endif ( )
2024-02-13 08:45:57 +03:00
if ( _lib MATCHES "^-" )
2023-11-07 00:19:00 +03:00
set ( LIBCURL_LIBS "${LIBCURL_LIBS} ${_lib}" )
2024-02-13 08:45:57 +03:00
elseif ( _lib MATCHES ".*/.*" )
# This gets a bit more complex, because we want to specify the
# directory separately, and only once per directory
string ( REGEX REPLACE "^(.*)/[^/]*$" "\\1" _libdir "${_lib}" )
string ( REGEX REPLACE "^.*/([^/.]*).*$" "\\1" _libname "${_lib}" )
if ( _libname MATCHES "^lib" )
list ( FIND _libcurl_libs_dirs "${_libdir}" _libdir_index )
if ( _libdir_index LESS 0 )
list ( APPEND _libcurl_libs_dirs "${_libdir}" )
set ( LIBCURL_LIBS "${LIBCURL_LIBS} -L${_libdir}" )
endif ( )
string ( REGEX REPLACE "^lib" "" _libname "${_libname}" )
set ( LIBCURL_LIBS "${LIBCURL_LIBS} -l${_libname}" )
else ( )
set ( LIBCURL_LIBS "${LIBCURL_LIBS} ${_lib}" )
endif ( )
2023-11-07 00:19:00 +03:00
else ( )
set ( LIBCURL_LIBS "${LIBCURL_LIBS} -l${_lib}" )
endif ( )
endforeach ( )
2024-06-08 01:41:24 +03:00
# Export a .pc file for client projects not using CMake
if ( LIBCURL_PC_REQUIRES_PRIVATE )
string ( REPLACE ";" "," LIBCURL_PC_REQUIRES_PRIVATE "${LIBCURL_PC_REQUIRES_PRIVATE}" )
endif ( )
2024-07-31 11:49:38 +03:00
set ( LIBCURL_PC_CFLAGS_PRIVATE "-DCURL_STATICLIB" )
2024-06-08 01:41:24 +03:00
# Merge pkg-config private fields into public ones when static-only
2023-11-07 00:19:00 +03:00
if ( BUILD_SHARED_LIBS )
set ( ENABLE_SHARED "yes" )
2024-06-08 01:41:24 +03:00
set ( LIBCURL_PC_REQUIRES "" )
2023-11-07 00:19:00 +03:00
set ( LIBCURL_NO_SHARED "" )
set ( CPPFLAG_CURL_STATICLIB "" )
2016-06-01 23:24:35 +03:00
else ( )
2023-11-07 00:19:00 +03:00
set ( ENABLE_SHARED "no" )
2024-06-08 01:41:24 +03:00
set ( LIBCURL_PC_REQUIRES "${LIBCURL_PC_REQUIRES_PRIVATE}" )
2023-11-07 00:19:00 +03:00
set ( LIBCURL_NO_SHARED "${LIBCURL_LIBS}" )
2024-07-31 11:49:38 +03:00
set ( CPPFLAG_CURL_STATICLIB "${LIBCURL_PC_CFLAGS_PRIVATE}" )
2016-06-01 23:24:35 +03:00
endif ( )
2023-11-07 00:19:00 +03:00
if ( BUILD_STATIC_LIBS )
set ( ENABLE_STATIC "yes" )
else ( )
set ( ENABLE_STATIC "no" )
endif ( )
# "a" (Linux) or "lib" (Windows)
string ( REPLACE "." "" libext "${CMAKE_STATIC_LIBRARY_SUFFIX}" )
set ( prefix "${CMAKE_INSTALL_PREFIX}" )
# Set this to "yes" to append all libraries on which -lcurl is dependent
set ( REQUIRE_LIB_DEPS "no" )
# SUPPORT_FEATURES
# SUPPORT_PROTOCOLS
set ( VERSIONNUM "${CURL_VERSION_NUM}" )
# Finally generate a "curl-config" matching this config
# Use:
# * ENABLE_SHARED
# * ENABLE_STATIC
configure_file ( "${CURL_SOURCE_DIR}/curl-config.in"
2024-05-19 19:49:42 +03:00
" $ { C U R L _ B I N A R Y _ D I R } / c u r l - c o n f i g " @ O N L Y )
2023-11-07 00:19:00 +03:00
install ( FILES "${CURL_BINARY_DIR}/curl-config"
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ B I N D I R }
P E R M I S S I O N S
O W N E R _ R E A D O W N E R _ W R I T E O W N E R _ E X E C U T E
G R O U P _ R E A D G R O U P _ E X E C U T E
W O R L D _ R E A D W O R L D _ E X E C U T E )
# Finally generate a pkg-config file matching this config
configure_file ( "${CURL_SOURCE_DIR}/libcurl.pc.in"
2024-05-19 19:49:42 +03:00
" $ { C U R L _ B I N A R Y _ D I R } / l i b c u r l . p c " @ O N L Y )
2023-11-07 00:19:00 +03:00
install ( FILES "${CURL_BINARY_DIR}/libcurl.pc"
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } / p k g c o n f i g )
# install headers
install ( DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/curl"
D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R }
F I L E S _ M A T C H I N G P A T T E R N " * . h " )
include ( CMakePackageConfigHelpers )
write_basic_package_version_file (
" $ { v e r s i o n _ c o n f i g } "
V E R S I O N $ { C U R L _ V E R S I O N }
C O M P A T I B I L I T Y S a m e M a j o r V e r s i o n
)
file ( READ "${version_config}" generated_version_config )
2024-05-19 19:49:42 +03:00
file ( WRITE "${version_config}" "
if ( NOT PACKAGE_FIND_VERSION_RANGE AND PACKAGE_FIND_VERSION_MAJOR STREQUAL \"7\")
# Version 8 satisfies version 7... requirements
set ( PACKAGE_FIND_VERSION_MAJOR 8 )
set ( PACKAGE_FIND_VERSION_COUNT 1 )
2023-11-07 00:19:00 +03:00
endif ( )
$ { g e n e r a t e d _ v e r s i o n _ c o n f i g } "
)
2017-09-10 17:56:16 +03:00
2023-11-07 00:19:00 +03:00
# Use:
# * TARGETS_EXPORT_NAME
# * PROJECT_NAME
configure_package_config_file ( CMake/curl-config.cmake.in
2024-05-19 19:49:42 +03:00
" $ { p r o j e c t _ c o n f i g } "
I N S T A L L _ D E S T I N A T I O N $ { C U R L _ I N S T A L L _ C M A K E _ D I R }
2024-06-05 23:35:48 +03:00
P A T H _ V A R S C M A K E _ I N S T A L L _ I N C L U D E D I R
2023-11-07 00:19:00 +03:00
)
if ( CURL_ENABLE_EXPORT_TARGET )
2024-05-19 19:49:42 +03:00
install ( EXPORT "${TARGETS_EXPORT_NAME}"
2023-11-07 00:19:00 +03:00
N A M E S P A C E " $ { P R O J E C T _ N A M E } : : "
D E S T I N A T I O N $ { C U R L _ I N S T A L L _ C M A K E _ D I R }
)
endif ( )
2018-07-18 02:31:51 +03:00
2024-05-19 19:49:42 +03:00
install ( FILES ${ version_config } ${ project_config }
2021-05-14 13:36:12 +03:00
D E S T I N A T I O N $ { C U R L _ I N S T A L L _ C M A K E _ D I R }
)
2017-09-10 17:56:16 +03:00
2023-11-07 00:19:00 +03:00
# Workaround for MSVS10 to avoid the Dialog Hell
# FIXME: This could be removed with future version of CMake.
if ( MSVC_VERSION EQUAL 1600 )
set ( CURL_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/CURL.sln" )
if ( EXISTS "${CURL_SLN_FILENAME}" )
file ( APPEND "${CURL_SLN_FILENAME}" "\n# This should be regenerated!\n" )
endif ( )
2013-02-05 01:35:09 +04:00
endif ( )
2017-07-11 02:17:15 +03:00
2023-11-07 00:19:00 +03:00
if ( NOT TARGET curl_uninstall )
configure_file (
2024-05-19 19:49:42 +03:00
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / C M a k e / c m a k e _ u n i n s t a l l . c m a k e . i n
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / C M a k e / c m a k e _ u n i n s t a l l . c m a k e
I M M E D I A T E @ O N L Y )
2017-07-11 02:17:15 +03:00
2023-11-07 00:19:00 +03:00
add_custom_target ( curl_uninstall
2024-05-19 19:49:42 +03:00
C O M M A N D $ { C M A K E _ C O M M A N D } - P
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / C M a k e / c m a k e _ u n i n s t a l l . c m a k e )
2023-11-07 00:19:00 +03:00
endif ( )
2017-07-11 02:17:15 +03:00
endif ( )