Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Kitware
GitHub Repository: Kitware/CMake
Path: blob/master/Utilities/cmcurl/CMakeLists.txt
4997 views
1
# Set curl options as needed for CMake build
2
if(WIN32)
3
set(_CURL_PREFILL ON)
4
else()
5
set(_CURL_PREFILL OFF)
6
endif()
7
set(BUILD_CURL_EXE OFF CACHE INTERNAL "No curl exe")
8
set(BUILD_SHARED_LIBS OFF)
9
set(BUILD_STATIC_LIBS ON)
10
set(BUILD_STATIC_CURL OFF)
11
set(CURL_CA_SEARCH_SAFE OFF)
12
set(CURL_USE_GSASL OFF)
13
set(CURL_USE_GSSAPI OFF)
14
set(CURL_USE_LIBBACKTRACE OFF)
15
set(CURL_USE_LIBPSL OFF)
16
set(CURL_USE_LIBSSH2 OFF)
17
set(CURL_USE_LIBSSH OFF)
18
set(CURL_USE_LIBUV OFF)
19
set(CURL_USE_MBEDTLS OFF)
20
set(CURL_USE_OPENSSL "${CMAKE_USE_OPENSSL}")
21
set(CURL_USE_PKGCONFIG OFF)
22
set(CURL_USE_SCHANNEL OFF)
23
set(CURL_USE_WOLFSSL OFF)
24
set(CURL_BROTLI "OFF" CACHE INTERNAL "Build curl with BROTLI support (AUTO, ON or OFF)")
25
set(CURL_DISABLE_ALTSVC ON)
26
set(CURL_DISABLE_AWS OFF)
27
set(CURL_DISABLE_BASIC_AUTH OFF)
28
set(CURL_DISABLE_BEARER_AUTH OFF)
29
set(CURL_DISABLE_BINDLOCAL OFF)
30
set(CURL_DISABLE_CA_SEARCH OFF)
31
set(CURL_DISABLE_COOKIES OFF CACHE INTERNAL "Do not disable curl cookie support")
32
set(CURL_DISABLE_DICT ON CACHE INTERNAL "Disable curl dict protocol?")
33
set(CURL_DISABLE_DIGEST_AUTH OFF)
34
set(CURL_DISABLE_DOH OFF)
35
set(CURL_DISABLE_FILE OFF CACHE INTERNAL "Disable curl file protocol?")
36
set(CURL_DISABLE_FORM_API OFF)
37
set(CURL_DISABLE_FTP OFF CACHE INTERNAL "Disable curl ftp protocol?")
38
set(CURL_DISABLE_GETOPTIONS OFF)
39
set(CURL_DISABLE_GOPHER ON CACHE INTERNAL "Disable curl gopher protocol?")
40
set(CURL_DISABLE_HEADERS_API OFF)
41
set(CURL_DISABLE_HSTS OFF)
42
set(CURL_DISABLE_HTTP_AUTH OFF)
43
set(CURL_DISABLE_HTTP OFF CACHE INTERNAL "Disable curl http protocol?")
44
set(CURL_DISABLE_IMAP ON CACHE INTERNAL "Disable curl imap protocol?")
45
set(CURL_DISABLE_INSTALL ON)
46
set(CURL_DISABLE_IPFS OFF)
47
set(CURL_DISABLE_KERBEROS_AUTH OFF)
48
set(CURL_DISABLE_LDAP ON CACHE INTERNAL "Disable curl ldap protocol?")
49
set(CURL_DISABLE_LDAPS ON CACHE INTERNAL "Disable curl ldaps protocol?")
50
set(CURL_DISABLE_LIBCURL_OPTION OFF)
51
set(CURL_DISABLE_MIME OFF)
52
set(CURL_DISABLE_MQTT ON)
53
set(CURL_DISABLE_NEGOTIATE_AUTH OFF)
54
set(CURL_DISABLE_NETRC OFF)
55
set(CURL_DISABLE_NTLM OFF)
56
set(CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG OFF)
57
set(CURL_DISABLE_PARSEDATE OFF)
58
set(CURL_DISABLE_POP3 ON CACHE INTERNAL "Disable curl pop3 protocol?")
59
set(CURL_DISABLE_PROGRESS_METER OFF)
60
set(CURL_DISABLE_PROXY OFF CACHE INTERNAL "Do not disable curl proxy")
61
set(CURL_DISABLE_RTSP ON CACHE INTERNAL "Disable curl rtsp protocol?")
62
set(CURL_DISABLE_SHA512_256 OFF)
63
set(CURL_DISABLE_SHUFFLE_DNS OFF)
64
set(CURL_DISABLE_SMB OFF)
65
set(CURL_DISABLE_SMTP ON CACHE INTERNAL "Disable curl smtp protocol?")
66
set(CURL_DISABLE_SOCKETPAIR OFF)
67
set(CURL_DISABLE_SRP OFF)
68
set(CURL_DISABLE_TELNET ON CACHE INTERNAL "Disable curl telnet protocol?")
69
set(CURL_DISABLE_TFTP ON CACHE INTERNAL "Disable curl tftp protocol?")
70
set(CURL_DISABLE_TYPECHECK ON)
71
set(CURL_DISABLE_VERBOSE_STRINGS OFF CACHE INTERNAL "Do not disable curl verbosity")
72
set(CURL_DISABLE_WEBSOCKETS ON)
73
set(CURL_ENABLE_EXPORT_TARGET OFF)
74
set(CURL_HIDDEN_SYMBOLS OFF CACHE INTERNAL "No curl hidden symbols")
75
set(CURL_LTO OFF CACHE INTERNAL "Turn on compiler Link Time Optimizations")
76
set(CURL_STATIC_CRT OFF CACHE INTERNAL "Set to ON to build libcurl with static CRT on Windows (/MT).")
77
set(CURL_WERROR OFF CACHE INTERNAL "Turn compiler warnings into errors")
78
set(CURL_ZLIB "AUTO" CACHE INTERNAL "Build curl with ZLIB support (AUTO, ON or OFF)")
79
set(CURL_ZSTD "OFF" CACHE INTERNAL "Build curl with ZSTD support (AUTO, ON or OFF)")
80
set(ENABLE_ARES OFF CACHE INTERNAL "No curl c-ares support")
81
set(ENABLE_CURLDEBUG OFF CACHE INTERNAL "No curl TrackMemory features")
82
set(ENABLE_DEBUG OFF CACHE INTERNAL "No curl debug features")
83
set(ENABLE_IPV6 ON CACHE INTERNAL "Enable curl IPv6 support detection")
84
set(ENABLE_THREADED_RESOLVER OFF CACHE INTERNAL "No curl POSIX threaded DNS lookup")
85
set(ENABLE_UNICODE OFF)
86
set(ENABLE_UNIX_SOCKETS OFF CACHE INTERNAL "No curl Unix domain sockets support")
87
set(HAVE_ATOMIC 0)
88
set(HAVE_BORINGSSL 0) # we do not need this info
89
set(HAVE_RECV 1)
90
set(HAVE_SEND 1)
91
set(HAVE_STDATOMIC_H 0)
92
set(HAVE_STRCASECMP 0) # we do not vendor the code that uses this
93
set(HAVE_WIN32_WINNT 0) # we do not need this info
94
set(HTTP_ONLY OFF CACHE INTERNAL "Curl is not http-only")
95
set(PICKY_COMPILER OFF)
96
set(SHARE_LIB_OBJECT OFF)
97
set(USE_APPLE_IDN OFF)
98
set(USE_APPLE_SECTRUST OFF)
99
set(USE_ECH OFF)
100
set(USE_HTTPSRR OFF)
101
set(USE_LIBIDN2 ON)
102
set(USE_LIBRTMP OFF)
103
set(USE_NGHTTP2 ON)
104
set(USE_NGTCP2 OFF)
105
set(USE_OPENSSL_QUIC OFF)
106
set(USE_QUICHE OFF)
107
set(USE_SSLS_EXPORT OFF)
108
set(USE_WIN32_IDN OFF)
109
set(USE_WIN32_LDAP OFF CACHE INTERNAL "No curl Windows LDAP")
110
if(CURL_USE_OPENSSL)
111
if(APPLE)
112
set(USE_APPLE_SECTRUST ON)
113
endif()
114
elseif(WIN32)
115
set(CURL_USE_SCHANNEL ON)
116
set(CURL_WINDOWS_SSPI ON)
117
endif()
118
119
# Windows Vista and above have inet_pton, but this will link on
120
# older versions and then the executable will fail to launch at
121
# runtime on older versions because no DLL provides the symbol.
122
if(WIN32)
123
set(HAVE_INET_PTON 0 CACHE INTERNAL "Do not use inet_pton")
124
endif()
125
126
# Starting with OSX 10.11 there is an unrelated libnetwork library which will
127
# be picked up during curl configuration. Linking against this library is
128
# unnecessary and breaks backward compatibility of the resulting binaries
129
# because libnetwork is unavailable on older OSX versions.
130
if(APPLE)
131
set(HAVE_LIBNETWORK 0 CACHE INTERNAL "Do not use libnetwork")
132
endif(APPLE)
133
134
# Disable warnings to avoid changing 3rd party code.
135
if(CMAKE_C_COMPILER_ID MATCHES
136
"^(GNU|LCC|Clang|AppleClang|IBMClang|XLClang|XL|VisualAge|SunPro|HP|Intel|IntelLLVM|NVHPC)$")
137
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
138
elseif(CMAKE_C_COMPILER_ID STREQUAL "PathScale")
139
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -woffall")
140
endif()
141
142
# Activate POSIX APIs.
143
if(CMAKE_SYSTEM_NAME MATCHES "^(AIX|OS400)$")
144
add_definitions(-D_ALL_SOURCE)
145
endif()
146
if(CMAKE_SYSTEM_NAME MATCHES "^(Linux)$")
147
add_definitions(-D_DEFAULT_SOURCE -D_BSD_SOURCE)
148
endif()
149
if(CMAKE_SYSTEM_NAME MATCHES "^(SunOS)$")
150
add_definitions(-D__EXTENSIONS__)
151
endif()
152
if(NOT CMAKE_SYSTEM_NAME MATCHES "BSD|Darwin|Windows")
153
add_definitions(-D_XOPEN_SOURCE=600)
154
endif()
155
156
#***************************************************************************
157
# _ _ ____ _
158
# Project ___| | | | _ \| |
159
# / __| | | | |_) | |
160
# | (__| |_| | _ <| |___
161
# \___|\___/|_| \_\_____|
162
#
163
# Copyright (C) Daniel Stenberg, <[email protected]>, et al.
164
#
165
# This software is licensed as described in the file COPYING, which
166
# you should have received as part of this distribution. The terms
167
# are also available at https://curl.se/docs/copyright.html.
168
#
169
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
170
# copies of the Software, and permit persons to whom the Software is
171
# furnished to do so, under the terms of the COPYING file.
172
#
173
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
174
# KIND, either express or implied.
175
#
176
# SPDX-License-Identifier: curl
177
#
178
###########################################################################
179
180
if(0) # XXX(cmake): not needed for build within cmake
181
cmake_minimum_required(VERSION 3.7...3.16 FATAL_ERROR)
182
message(STATUS "Using CMake version ${CMAKE_VERSION}")
183
184
# Collect command-line arguments for buildinfo.txt.
185
# Must reside at the top of the script to work as expected.
186
set(_cmake_args "")
187
if(NOT "$ENV{CURL_BUILDINFO}$ENV{CURL_CI}$ENV{CI}" STREQUAL "")
188
get_cmake_property(_cache_vars CACHE_VARIABLES)
189
foreach(_cache_var IN ITEMS ${_cache_vars})
190
get_property(_cache_var_helpstring CACHE ${_cache_var} PROPERTY HELPSTRING)
191
if(_cache_var_helpstring STREQUAL "No help, variable specified on the command line.")
192
get_property(_cache_var_type CACHE ${_cache_var} PROPERTY TYPE)
193
get_property(_cache_var_value CACHE ${_cache_var} PROPERTY VALUE)
194
if(_cache_var_type STREQUAL "UNINITIALIZED")
195
set(_cache_var_type)
196
else()
197
set(_cache_var_type ":${_cache_var_type}")
198
endif()
199
string(APPEND _cmake_args " -D${_cache_var}${_cache_var_type}=\"${_cache_var_value}\"")
200
endif()
201
endforeach()
202
endif()
203
endif() # XXX(cmake): end
204
205
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH})
206
include(Utilities)
207
include(Macros)
208
include(CMakeDependentOption)
209
include(CheckCCompilerFlag)
210
211
file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/curl/curlver.h" _curl_version_h_contents REGEX "#define LIBCURL_VERSION( |_NUM )")
212
string(REGEX MATCH "#define LIBCURL_VERSION \"[^\"]*" _curl_version ${_curl_version_h_contents})
213
string(REGEX REPLACE "[^\"]+\"" "" _curl_version ${_curl_version})
214
string(REGEX MATCH "#define LIBCURL_VERSION_NUM 0x[0-9a-fA-F]+" _curl_version_num ${_curl_version_h_contents})
215
string(REGEX REPLACE "[^0]+0x" "" _curl_version_num ${_curl_version_num})
216
unset(_curl_version_h_contents)
217
218
if(0) # XXX(cmake): not needed for build within cmake
219
message(STATUS "curl version=[${_curl_version}]")
220
endif() # XXX(cmake): end
221
222
# XXX(cmake): Set these as normal variables to suppress cache entries.
223
set(CMAKE_PROJECT_VERSION 0)
224
set(CMAKE_PROJECT_VERSION_MAJOR 0)
225
set(CMAKE_PROJECT_VERSION_MINOR 0)
226
set(CMAKE_PROJECT_VERSION_PATCH 0)
227
set(CMAKE_PROJECT_VERSION_TWEAK 0)
228
229
string(REGEX REPLACE "([0-9]+\.[0-9]+\.[0-9]+).+" "\\1" _curl_version_sem "${_curl_version}")
230
project(CURL
231
VERSION "${_curl_version_sem}"
232
LANGUAGES C)
233
234
# CMake does not recognize some targets accurately. Touch up configuration manually as a workaround.
235
if(WINDOWS_STORE AND MINGW) # MinGW UWP build
236
# CMake (as of v3.31.2) gets confused and applies the MSVC rc.exe command-line
237
# template to windres. Reset it to the windres template as in 'Modules/Platform/Windows-windres.cmake':
238
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> -O coff <DEFINES> <INCLUDES> <FLAGS> <SOURCE> <OBJECT>")
239
elseif(DOS AND CMAKE_C_COMPILER_ID STREQUAL "GNU") # DJGPP
240
set(CMAKE_STATIC_LIBRARY_PREFIX "lib")
241
set(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
242
set(CMAKE_FIND_LIBRARY_PREFIXES "lib")
243
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
244
endif()
245
246
# Fill platform level variable when using CMake's built-in Android configuration
247
if(ANDROID AND NOT DEFINED ANDROID_PLATFORM_LEVEL AND NOT CMAKE_SYSTEM_VERSION EQUAL 1)
248
set(ANDROID_PLATFORM_LEVEL "${CMAKE_SYSTEM_VERSION}")
249
endif()
250
251
set(_target_flags "")
252
if(APPLE)
253
string(APPEND _target_flags " APPLE")
254
endif()
255
if(UNIX)
256
string(APPEND _target_flags " UNIX")
257
endif()
258
if(BSD)
259
string(APPEND _target_flags " BSD")
260
endif()
261
if(ANDROID)
262
string(APPEND _target_flags " ANDROID-${ANDROID_PLATFORM_LEVEL}")
263
endif()
264
if(WIN32)
265
string(APPEND _target_flags " WIN32")
266
endif()
267
if(WINDOWS_STORE)
268
string(APPEND _target_flags " UWP")
269
endif()
270
if(CYGWIN)
271
string(APPEND _target_flags " CYGWIN")
272
endif()
273
if(DOS)
274
string(APPEND _target_flags " DOS")
275
endif()
276
if(AMIGA)
277
string(APPEND _target_flags " AMIGA")
278
endif()
279
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
280
string(APPEND _target_flags " GCC")
281
endif()
282
if(CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
283
string(APPEND _target_flags " APPLE-CLANG")
284
elseif(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND MSVC)
285
string(APPEND _target_flags " CLANG-CL")
286
elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
287
string(APPEND _target_flags " LLVM-CLANG")
288
endif()
289
if(MINGW)
290
string(APPEND _target_flags " MINGW")
291
endif()
292
if(MSVC)
293
string(APPEND _target_flags " MSVC-${MSVC_VERSION}")
294
endif()
295
if(VCPKG_TOOLCHAIN)
296
string(APPEND _target_flags " VCPKG")
297
endif()
298
if(CMAKE_CROSSCOMPILING)
299
string(APPEND _target_flags " CROSS")
300
endif()
301
if(0) # XXX(cmake): not needed for build within cmake
302
message(STATUS "CMake platform flags:${_target_flags}")
303
endif() # XXX(cmake): end
304
305
if(CMAKE_CROSSCOMPILING)
306
message(STATUS "Cross-compiling: "
307
"${CMAKE_HOST_SYSTEM_NAME}/${CMAKE_HOST_SYSTEM_PROCESSOR} -> "
308
"${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}")
309
endif()
310
311
if(CMAKE_C_COMPILER_TARGET)
312
set(CURL_OS "\"${CMAKE_C_COMPILER_TARGET}\"")
313
else()
314
set(CURL_OS "\"${CMAKE_SYSTEM_NAME}\"")
315
endif()
316
317
set(LIB_NAME "libcurl")
318
set(EXE_NAME "curl")
319
320
set_property(DIRECTORY APPEND PROPERTY INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/include")
321
322
if(NOT DEFINED CMAKE_UNITY_BUILD_BATCH_SIZE)
323
set(CMAKE_UNITY_BUILD_BATCH_SIZE 0)
324
endif()
325
326
# Having CMAKE_TRY_COMPILE_TARGET_TYPE set to STATIC_LIBRARY breaks certain
327
# 'check_function_exists()' detections (possibly more), by detecting
328
# non-existing features. This happens by default when using 'ios.toolchain.cmake'.
329
# Work it around by setting this value to `EXECUTABLE`.
330
if(CMAKE_TRY_COMPILE_TARGET_TYPE STREQUAL "STATIC_LIBRARY")
331
message(STATUS "CMAKE_TRY_COMPILE_TARGET_TYPE was found set to STATIC_LIBRARY. "
332
"Overriding with EXECUTABLE for feature detections to work.")
333
set(_cmake_try_compile_target_type_save ${CMAKE_TRY_COMPILE_TARGET_TYPE})
334
set(CMAKE_TRY_COMPILE_TARGET_TYPE "EXECUTABLE")
335
endif()
336
337
option(CURL_WERROR "Turn compiler warnings into errors" OFF)
338
option(PICKY_COMPILER "Enable picky compiler options" ON)
339
option(BUILD_CURL_EXE "Build curl executable" ON)
340
get_property(_has_shared GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
341
option(BUILD_SHARED_LIBS "Build shared libraries" ${_has_shared})
342
option(BUILD_STATIC_LIBS "Build static libraries" OFF)
343
option(BUILD_STATIC_CURL "Build curl executable with static libcurl" OFF)
344
option(ENABLE_ARES "Enable c-ares support" OFF)
345
option(CURL_DISABLE_INSTALL "Disable installation targets" OFF)
346
347
if(WIN32)
348
option(ENABLE_UNICODE "Use the Unicode version of the Windows API functions" OFF)
349
if(WINDOWS_STORE)
350
set(ENABLE_UNICODE ON)
351
endif()
352
if(ENABLE_UNICODE)
353
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "UNICODE" "_UNICODE")
354
if(MINGW)
355
set_property(DIRECTORY APPEND PROPERTY COMPILE_OPTIONS "-municode")
356
endif()
357
endif()
358
359
if(0) # XXX(cmake): not needed for build within cmake
360
# Apply to all feature checks
361
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-DWIN32_LEAN_AND_MEAN")
362
if(MSVC)
363
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_CRT_NONSTDC_NO_DEPRECATE") # for strdup() detection
364
endif()
365
366
set(CURL_TARGET_WINDOWS_VERSION "" CACHE STRING "Minimum target Windows version as hex string")
367
if(CURL_TARGET_WINDOWS_VERSION)
368
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION}")
369
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_WIN32_WINNT=${CURL_TARGET_WINDOWS_VERSION}") # Apply to all feature checks
370
endif()
371
endif() # XXX(cmake): end
372
373
# Detect actual value of _WIN32_WINNT and store as HAVE_WIN32_WINNT
374
curl_internal_test(HAVE_WIN32_WINNT)
375
if(HAVE_WIN32_WINNT)
376
string(REGEX MATCH "_WIN32_WINNT=0x[0-9a-fA-F]+" CURL_TEST_OUTPUT "${CURL_TEST_OUTPUT}")
377
string(REGEX REPLACE "_WIN32_WINNT=" "" CURL_TEST_OUTPUT "${CURL_TEST_OUTPUT}")
378
string(REGEX REPLACE "0x([0-9a-f][0-9a-f][0-9a-f])$" "0x0\\1" CURL_TEST_OUTPUT "${CURL_TEST_OUTPUT}") # pad to 4 digits
379
string(TOLOWER "${CURL_TEST_OUTPUT}" HAVE_WIN32_WINNT)
380
message(STATUS "Found _WIN32_WINNT=${HAVE_WIN32_WINNT}")
381
endif()
382
unset(HAVE_WIN32_WINNT CACHE) # Avoid storing in CMake cache
383
384
if(MINGW)
385
# Detect __MINGW64_VERSION_MAJOR, __MINGW64_VERSION_MINOR and store as MINGW64_VERSION
386
curl_internal_test(MINGW64_VERSION)
387
if(MINGW64_VERSION)
388
string(REGEX MATCH "MINGW64_VERSION=[0-9]+\.[0-9]+" CURL_TEST_OUTPUT "${CURL_TEST_OUTPUT}")
389
string(REGEX REPLACE "MINGW64_VERSION=" "" MINGW64_VERSION "${CURL_TEST_OUTPUT}")
390
if(MINGW64_VERSION)
391
message(STATUS "Found MINGW64_VERSION=${MINGW64_VERSION}")
392
if(MINGW64_VERSION VERSION_LESS 3.0)
393
message(FATAL_ERROR "mingw-w64 3.0 or upper is required")
394
endif()
395
endif()
396
endif()
397
unset(MINGW64_VERSION CACHE) # Avoid storing in CMake cache
398
endif()
399
elseif(DOS)
400
set(BUILD_SHARED_LIBS OFF)
401
set(BUILD_STATIC_LIBS ON)
402
endif()
403
option(CURL_LTO "Enable compiler Link Time Optimizations" OFF)
404
405
if(0) # XXX(cmake): not needed for build within cmake
406
if(NOT DOS AND NOT AMIGA)
407
# if c-ares is used, default the threaded resolver to OFF
408
if(ENABLE_ARES)
409
set(_enable_threaded_resolver_default OFF)
410
else()
411
set(_enable_threaded_resolver_default ON)
412
endif()
413
option(ENABLE_THREADED_RESOLVER "Enable threaded DNS lookup" ${_enable_threaded_resolver_default})
414
endif()
415
416
include(PickyWarnings)
417
endif() # XXX(cmake): end
418
419
if(CYGWIN OR CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "GNU")
420
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "_GNU_SOURCE") # Required for accept4(), pipe2(), sendmmsg()
421
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE") # Apply to all feature checks
422
endif()
423
424
option(ENABLE_DEBUG "Enable curl debug features (for developing curl itself)" OFF)
425
if(ENABLE_DEBUG)
426
message(WARNING "This curl build is Debug-enabled and insecure, do not use in production.")
427
endif()
428
option(ENABLE_CURLDEBUG "Enable TrackMemory debug feature" ${ENABLE_DEBUG})
429
430
set(CURL_DEBUG_MACROS "")
431
if(ENABLE_DEBUG)
432
list(APPEND CURL_DEBUG_MACROS "DEBUGBUILD")
433
endif()
434
if(ENABLE_CURLDEBUG)
435
list(APPEND CURL_DEBUG_MACROS "CURLDEBUG")
436
endif()
437
438
if(0) # XXX(cmake): not needed for build within cmake
439
option(CURL_CLANG_TIDY "Run the build through clang-tidy" OFF)
440
if(CURL_CLANG_TIDY)
441
set(CMAKE_UNITY_BUILD OFF) # clang-tidy is not looking into #included sources, thus not compatible with unity builds.
442
set(CURL_DISABLE_TYPECHECK ON) # to improve performance and avoid potential interference.
443
set(_tidy_checks "")
444
list(APPEND _tidy_checks "-clang-analyzer-security.insecureAPI.bzero") # for FD_ZERO() (seen on macOS)
445
list(APPEND _tidy_checks "-clang-analyzer-optin.performance.Padding")
446
list(APPEND _tidy_checks "-clang-analyzer-security.ArrayBound") # false positives with clang-tidy v21.1.0
447
list(APPEND _tidy_checks "-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling")
448
string(REPLACE ";" "," _tidy_checks "${_tidy_checks}")
449
find_program(CLANG_TIDY NAMES "clang-tidy" REQUIRED)
450
set(CMAKE_C_CLANG_TIDY "${CLANG_TIDY}" "-checks=${_tidy_checks}" "-quiet")
451
unset(_tidy_checks)
452
if(CURL_WERROR)
453
list(APPEND CMAKE_C_CLANG_TIDY "--warnings-as-errors=*")
454
endif()
455
if(CURL_CLANG_TIDYFLAGS)
456
list(APPEND CMAKE_C_CLANG_TIDY ${CURL_CLANG_TIDYFLAGS})
457
endif()
458
endif()
459
460
option(CURL_CODE_COVERAGE "Enable code coverage build options" OFF)
461
if(CURL_CODE_COVERAGE)
462
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
463
set(CURL_COVERAGE_MACROS "NDEBUG")
464
set(CURL_COVERAGE_CFLAGS "-O0" "-g" "-fprofile-arcs")
465
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.1)
466
list(APPEND CURL_COVERAGE_CFLAGS "--coverage")
467
else()
468
list(APPEND CURL_COVERAGE_CFLAGS "-ftest-coverage")
469
endif()
470
set(CURL_COVERAGE_LIBS "gcov")
471
elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
472
set(CURL_COVERAGE_MACROS "NDEBUG")
473
set(CURL_COVERAGE_CFLAGS "-O0" "-g" "-fprofile-instr-generate" "-fcoverage-mapping")
474
set(CURL_COVERAGE_LDFLAGS "-fprofile-instr-generate" "-fcoverage-mapping")
475
else()
476
set(CURL_CODE_COVERAGE OFF)
477
endif()
478
endif()
479
480
# For debug libs and exes, add "-d" postfix
481
if(NOT DEFINED CMAKE_DEBUG_POSTFIX)
482
set(CMAKE_DEBUG_POSTFIX "-d")
483
endif()
484
endif() # XXX(cmake): end
485
486
set(LIB_STATIC "libcurl_static")
487
set(LIB_SHARED "libcurl_shared")
488
489
if(NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS)
490
set(BUILD_STATIC_LIBS ON)
491
endif()
492
if(NOT BUILD_STATIC_CURL AND NOT BUILD_SHARED_LIBS)
493
set(BUILD_STATIC_CURL ON)
494
elseif(BUILD_STATIC_CURL AND NOT BUILD_STATIC_LIBS)
495
set(BUILD_STATIC_CURL OFF)
496
endif()
497
498
# Lib flavour selected for curl tool
499
if(BUILD_STATIC_CURL)
500
set(LIB_SELECTED_FOR_EXE ${LIB_STATIC})
501
else()
502
set(LIB_SELECTED_FOR_EXE ${LIB_SHARED})
503
endif()
504
505
# Lib flavour selected for example and test programs.
506
if(BUILD_SHARED_LIBS)
507
set(LIB_SELECTED ${LIB_SHARED})
508
else()
509
set(LIB_SELECTED ${LIB_STATIC})
510
endif()
511
512
if(WIN32)
513
option(CURL_STATIC_CRT "Build libcurl with static CRT with MSVC (/MT)" OFF)
514
if(CURL_STATIC_CRT AND MSVC)
515
if(MSVC_VERSION GREATER_EQUAL 1900 OR BUILD_STATIC_CURL OR NOT BUILD_CURL_EXE)
516
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
517
set_property(DIRECTORY APPEND PROPERTY COMPILE_OPTIONS "$<$<CONFIG:Release>:-MT>")
518
set_property(DIRECTORY APPEND PROPERTY COMPILE_OPTIONS "$<$<CONFIG:Debug>:-MTd>")
519
else()
520
message(WARNING "Static CRT requires UCRT, static libcurl or no curl executable.")
521
endif()
522
endif()
523
endif()
524
525
# Override to force-disable or force-enable the use of pkg-config.
526
if((UNIX AND NOT ANDROID AND (NOT APPLE OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")) OR
527
VCPKG_TOOLCHAIN OR
528
(MINGW AND NOT CMAKE_CROSSCOMPILING))
529
set(_curl_use_pkgconfig_default ON)
530
else()
531
set(_curl_use_pkgconfig_default OFF)
532
endif()
533
option(CURL_USE_PKGCONFIG "Enable pkg-config to detect dependencies" ${_curl_use_pkgconfig_default})
534
535
# Initialize variables collecting system and dependency libs.
536
set(CURL_NETWORK_AND_TIME_LIBS "")
537
set(CURL_LIBS "")
538
539
if(ENABLE_ARES)
540
set(USE_ARES 1)
541
find_package(Cares REQUIRED)
542
list(APPEND CURL_LIBS CURL::cares)
543
endif()
544
545
if(0) # XXX(cmake): not needed for build within cmake
546
include(CurlSymbolHiding)
547
endif() # XXX(cmake): end
548
549
option(CURL_ENABLE_EXPORT_TARGET "Enable CMake export target" ON)
550
mark_as_advanced(CURL_ENABLE_EXPORT_TARGET)
551
552
option(CURL_DISABLE_ALTSVC "Disable alt-svc support" OFF)
553
mark_as_advanced(CURL_DISABLE_ALTSVC)
554
option(CURL_DISABLE_SRP "Disable TLS-SRP support" OFF)
555
mark_as_advanced(CURL_DISABLE_SRP)
556
option(CURL_DISABLE_COOKIES "Disable cookies support" OFF)
557
mark_as_advanced(CURL_DISABLE_COOKIES)
558
option(CURL_DISABLE_BASIC_AUTH "Disable Basic authentication" OFF)
559
mark_as_advanced(CURL_DISABLE_BASIC_AUTH)
560
option(CURL_DISABLE_BEARER_AUTH "Disable Bearer authentication" OFF)
561
mark_as_advanced(CURL_DISABLE_BEARER_AUTH)
562
option(CURL_DISABLE_DIGEST_AUTH "Disable Digest authentication" OFF)
563
mark_as_advanced(CURL_DISABLE_DIGEST_AUTH)
564
option(CURL_DISABLE_KERBEROS_AUTH "Disable Kerberos authentication" OFF)
565
mark_as_advanced(CURL_DISABLE_KERBEROS_AUTH)
566
option(CURL_DISABLE_NEGOTIATE_AUTH "Disable negotiate authentication" OFF)
567
mark_as_advanced(CURL_DISABLE_NEGOTIATE_AUTH)
568
option(CURL_DISABLE_AWS "Disable aws-sigv4" OFF)
569
mark_as_advanced(CURL_DISABLE_AWS)
570
option(CURL_DISABLE_DICT "Disable DICT" OFF)
571
mark_as_advanced(CURL_DISABLE_DICT)
572
option(CURL_DISABLE_DOH "Disable DNS-over-HTTPS" OFF)
573
mark_as_advanced(CURL_DISABLE_DOH)
574
option(CURL_DISABLE_FILE "Disable FILE" OFF)
575
mark_as_advanced(CURL_DISABLE_FILE)
576
option(CURL_DISABLE_FTP "Disable FTP" OFF)
577
mark_as_advanced(CURL_DISABLE_FTP)
578
option(CURL_DISABLE_GETOPTIONS "Disable curl_easy_options API for existing options to curl_easy_setopt" OFF)
579
mark_as_advanced(CURL_DISABLE_GETOPTIONS)
580
option(CURL_DISABLE_GOPHER "Disable Gopher" OFF)
581
mark_as_advanced(CURL_DISABLE_GOPHER)
582
option(CURL_DISABLE_HEADERS_API "Disable headers-api support" OFF)
583
mark_as_advanced(CURL_DISABLE_HEADERS_API)
584
option(CURL_DISABLE_HSTS "Disable HSTS support" OFF)
585
mark_as_advanced(CURL_DISABLE_HSTS)
586
option(CURL_DISABLE_HTTP "Disable HTTP" OFF)
587
mark_as_advanced(CURL_DISABLE_HTTP)
588
option(CURL_DISABLE_HTTP_AUTH "Disable all HTTP authentication methods" OFF)
589
mark_as_advanced(CURL_DISABLE_HTTP_AUTH)
590
option(CURL_DISABLE_IMAP "Disable IMAP" OFF)
591
mark_as_advanced(CURL_DISABLE_IMAP)
592
option(CURL_DISABLE_LDAP "Disable LDAP" OFF)
593
mark_as_advanced(CURL_DISABLE_LDAP)
594
option(CURL_DISABLE_LDAPS "Disable LDAPS" ${CURL_DISABLE_LDAP})
595
mark_as_advanced(CURL_DISABLE_LDAPS)
596
option(CURL_DISABLE_LIBCURL_OPTION "Disable --libcurl option from the curl tool" OFF)
597
mark_as_advanced(CURL_DISABLE_LIBCURL_OPTION)
598
option(CURL_DISABLE_MIME "Disable MIME support" OFF)
599
mark_as_advanced(CURL_DISABLE_MIME)
600
if(0) # XXX(cmake): not needed for build within cmake
601
cmake_dependent_option(CURL_DISABLE_FORM_API "Disable form-api"
602
OFF "NOT CURL_DISABLE_MIME"
603
ON)
604
mark_as_advanced(CURL_DISABLE_FORM_API)
605
endif() # XXX(cmake): end
606
option(CURL_DISABLE_MQTT "Disable MQTT" OFF)
607
mark_as_advanced(CURL_DISABLE_MQTT)
608
option(CURL_DISABLE_BINDLOCAL "Disable local binding support" OFF)
609
mark_as_advanced(CURL_DISABLE_BINDLOCAL)
610
option(CURL_DISABLE_NETRC "Disable netrc parser" OFF)
611
mark_as_advanced(CURL_DISABLE_NETRC)
612
option(CURL_DISABLE_NTLM "Disable NTLM support" OFF)
613
mark_as_advanced(CURL_DISABLE_NTLM)
614
option(CURL_DISABLE_PARSEDATE "Disable date parsing" OFF)
615
mark_as_advanced(CURL_DISABLE_PARSEDATE)
616
option(CURL_DISABLE_POP3 "Disable POP3" OFF)
617
mark_as_advanced(CURL_DISABLE_POP3)
618
option(CURL_DISABLE_PROGRESS_METER "Disable built-in progress meter" OFF)
619
mark_as_advanced(CURL_DISABLE_PROGRESS_METER)
620
option(CURL_DISABLE_PROXY "Disable proxy support" OFF)
621
mark_as_advanced(CURL_DISABLE_PROXY)
622
option(CURL_DISABLE_IPFS "Disable IPFS" OFF)
623
mark_as_advanced(CURL_DISABLE_IPFS)
624
option(CURL_DISABLE_RTSP "Disable RTSP" OFF)
625
mark_as_advanced(CURL_DISABLE_RTSP)
626
option(CURL_DISABLE_SHA512_256 "Disable SHA-512/256 hash algorithm" OFF)
627
mark_as_advanced(CURL_DISABLE_SHA512_256)
628
option(CURL_DISABLE_SHUFFLE_DNS "Disable shuffle DNS feature" OFF)
629
mark_as_advanced(CURL_DISABLE_SHUFFLE_DNS)
630
option(CURL_DISABLE_SMB "Disable SMB" OFF)
631
mark_as_advanced(CURL_DISABLE_SMB)
632
option(CURL_DISABLE_SMTP "Disable SMTP" OFF)
633
mark_as_advanced(CURL_DISABLE_SMTP)
634
option(CURL_DISABLE_SOCKETPAIR "Disable use of socketpair for curl_multi_poll()" OFF)
635
mark_as_advanced(CURL_DISABLE_SOCKETPAIR)
636
option(CURL_DISABLE_WEBSOCKETS "Disable WebSocket" OFF)
637
mark_as_advanced(CURL_DISABLE_WEBSOCKETS)
638
option(CURL_DISABLE_TELNET "Disable Telnet" OFF)
639
mark_as_advanced(CURL_DISABLE_TELNET)
640
option(CURL_DISABLE_TFTP "Disable TFTP" OFF)
641
mark_as_advanced(CURL_DISABLE_TFTP)
642
option(CURL_DISABLE_TYPECHECK "Disable curl_easy_setopt()/curl_easy_getinfo() type checking" OFF)
643
mark_as_advanced(CURL_DISABLE_TYPECHECK)
644
option(CURL_DISABLE_VERBOSE_STRINGS "Disable verbose strings" OFF)
645
mark_as_advanced(CURL_DISABLE_VERBOSE_STRINGS)
646
647
if(CURL_DISABLE_HTTP)
648
set(CURL_DISABLE_ALTSVC ON)
649
set(CURL_DISABLE_HSTS ON)
650
set(CURL_DISABLE_IPFS ON)
651
set(CURL_DISABLE_RTSP ON)
652
set(CURL_DISABLE_WEBSOCKETS ON)
653
endif()
654
655
# Corresponds to HTTP_ONLY in lib/curl_setup.h
656
option(HTTP_ONLY "Disable all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF)
657
mark_as_advanced(HTTP_ONLY)
658
659
if(HTTP_ONLY)
660
set(CURL_DISABLE_DICT ON)
661
set(CURL_DISABLE_FILE ON)
662
set(CURL_DISABLE_FTP ON)
663
set(CURL_DISABLE_GOPHER ON)
664
set(CURL_DISABLE_IMAP ON)
665
set(CURL_DISABLE_IPFS ON)
666
set(CURL_DISABLE_LDAP ON)
667
set(CURL_DISABLE_LDAPS ON)
668
set(CURL_DISABLE_MQTT ON)
669
set(CURL_DISABLE_POP3 ON)
670
set(CURL_DISABLE_RTSP ON)
671
set(CURL_DISABLE_SMB ON)
672
set(CURL_DISABLE_SMTP ON)
673
set(CURL_DISABLE_TELNET ON)
674
set(CURL_DISABLE_TFTP ON)
675
endif()
676
677
if(WINDOWS_STORE)
678
set(CURL_DISABLE_TELNET ON) # telnet code needs fixing to compile for UWP.
679
endif()
680
681
if(0) # XXX(cmake): not needed for build within cmake
682
find_package(Perl)
683
684
if(PERL_EXECUTABLE)
685
add_custom_target(curl-ca-bundle
686
COMMENT "Generating a fresh ca-bundle.crt" VERBATIM USES_TERMINAL
687
COMMAND "${PERL_EXECUTABLE}" "${PROJECT_SOURCE_DIR}/scripts/mk-ca-bundle.pl" -b -l -u "lib/ca-bundle.crt"
688
DEPENDS "${PROJECT_SOURCE_DIR}/scripts/mk-ca-bundle.pl"
689
)
690
add_custom_target(curl-ca-firefox
691
COMMENT "Generating a fresh ca-bundle.crt" VERBATIM USES_TERMINAL
692
COMMAND "${PERL_EXECUTABLE}" "${PROJECT_SOURCE_DIR}/scripts/firefox-db2pem.sh" "lib/ca-bundle.crt"
693
DEPENDS "${PROJECT_SOURCE_DIR}/scripts/firefox-db2pem.sh"
694
)
695
endif()
696
697
option(BUILD_LIBCURL_DOCS "Build libcurl man pages" ON)
698
option(BUILD_MISC_DOCS "Build misc man pages (e.g. curl-config and mk-ca-bundle)" ON)
699
option(ENABLE_CURL_MANUAL "Build the man page for curl and enable its -M/--manual option" ON)
700
701
if((ENABLE_CURL_MANUAL OR BUILD_LIBCURL_DOCS) AND NOT Perl_FOUND)
702
message(WARNING "Perl not found. Will not build manuals.")
703
endif()
704
endif() # XXX(cmake): end
705
706
# If we are on AIX, do the _ALL_SOURCE magic
707
if(CMAKE_SYSTEM_NAME STREQUAL "AIX")
708
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "_ALL_SOURCE")
709
endif()
710
711
# If we are on Haiku, make sure that the network library is brought in.
712
if(CMAKE_SYSTEM_NAME STREQUAL "Haiku")
713
list(APPEND CURL_NETWORK_AND_TIME_LIBS "network")
714
elseif(AMIGA)
715
list(APPEND CURL_NETWORK_AND_TIME_LIBS "net" "m" "atomic")
716
list(APPEND CMAKE_REQUIRED_LIBRARIES "net" "m" "atomic")
717
endif()
718
719
# Include all the necessary files for macros
720
include(CMakePushCheckState)
721
include(CheckFunctionExists)
722
include(CheckIncludeFile)
723
include(CheckIncludeFiles)
724
include(CheckLibraryExists)
725
include(CheckSymbolExists)
726
include(CheckTypeSize)
727
include(CheckCSourceCompiles)
728
729
option(_CURL_PREFILL "Fast-track known feature detection results (Windows, some Apple)" "${WIN32}")
730
if(_CURL_PREFILL)
731
if(WIN32)
732
include("${CMAKE_CURRENT_SOURCE_DIR}/CMake/win32-cache.cmake")
733
elseif(UNIX)
734
include("${CMAKE_CURRENT_SOURCE_DIR}/CMake/unix-cache.cmake")
735
if(0) # XXX(cmake): not needed for build within cmake
736
message(STATUS "Pre-filling feature detection results for UNIX")
737
endif() # XXX(cmake): end
738
endif()
739
elseif(WIN32)
740
if(0) # XXX(cmake): not needed for build within cmake
741
message(STATUS "Pre-filling feature detection results disabled.")
742
endif() # XXX(cmake): end
743
elseif(APPLE)
744
set(HAVE_EVENTFD 0)
745
set(HAVE_GETPASS_R 0)
746
set(HAVE_WRITABLE_ARGV 1)
747
set(HAVE_SENDMMSG 0)
748
endif()
749
750
if(AMIGA)
751
set(HAVE_GETADDRINFO 0) # Breaks the build when detected and used.
752
endif()
753
if(DOS OR AMIGA)
754
set(HAVE_TIME_T_UNSIGNED 1)
755
endif()
756
757
if(ENABLE_THREADED_RESOLVER)
758
if(WIN32)
759
set(USE_THREADS_WIN32 ON)
760
else()
761
find_package(Threads REQUIRED)
762
set(USE_THREADS_POSIX ${CMAKE_USE_PTHREADS_INIT})
763
set(HAVE_PTHREAD_H ${CMAKE_USE_PTHREADS_INIT})
764
list(APPEND CURL_NETWORK_AND_TIME_LIBS ${CMAKE_THREAD_LIBS_INIT})
765
endif()
766
endif()
767
768
# Check for all needed libraries
769
if(DOS)
770
if(WATT_ROOT)
771
set(USE_WATT32 ON)
772
# FIXME upstream: must specify the full path to avoid CMake converting "watt" to "watt.lib"
773
list(APPEND CURL_NETWORK_AND_TIME_LIBS "${WATT_ROOT}/lib/libwatt.a")
774
include_directories(SYSTEM "${WATT_ROOT}/inc")
775
list(APPEND CMAKE_REQUIRED_INCLUDES "${WATT_ROOT}/inc")
776
else()
777
message(FATAL_ERROR "Set WATT_ROOT variable to the absolute path to the root installation of Watt-32.")
778
endif()
779
elseif(AMIGA)
780
if(AMISSL_INCLUDE_DIR AND AMISSL_STUBS_LIBRARY AND AMISSL_AUTO_LIBRARY)
781
set(USE_AMISSL ON)
782
list(APPEND CMAKE_REQUIRED_INCLUDES "${AMISSL_INCLUDE_DIR}")
783
list(APPEND CMAKE_REQUIRED_LIBRARIES "${AMISSL_STUBS_LIBRARY}" "${AMISSL_AUTO_LIBRARY}")
784
set(OPENSSL_INCLUDE_DIR "${AMISSL_INCLUDE_DIR}")
785
set(OPENSSL_SSL_LIBRARY "${AMISSL_STUBS_LIBRARY}")
786
set(OPENSSL_CRYPTO_LIBRARY "${AMISSL_AUTO_LIBRARY}")
787
set(CURL_USE_OPENSSL ON)
788
set(CURL_CA_FALLBACK ON CACHE BOOL "")
789
endif()
790
elseif(NOT WIN32 AND NOT APPLE)
791
check_library_exists("socket" "connect" "" HAVE_LIBSOCKET)
792
if(HAVE_LIBSOCKET)
793
set(CURL_NETWORK_AND_TIME_LIBS "socket" ${CURL_NETWORK_AND_TIME_LIBS})
794
endif()
795
endif()
796
797
option(ENABLE_IPV6 "Enable IPv6 support" ON)
798
mark_as_advanced(ENABLE_IPV6)
799
if(ENABLE_IPV6)
800
include(CheckStructHasMember)
801
if(WIN32)
802
check_struct_has_member("struct sockaddr_in6" "sin6_scope_id" "winsock2.h;ws2tcpip.h" HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
803
else()
804
check_struct_has_member("struct sockaddr_in6" "sin6_scope_id" "netinet/in.h" HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
805
check_struct_has_member("struct sockaddr_in6" "sin6_addr" "netinet/in.h" HAVE_SOCKADDR_IN6_SIN6_ADDR)
806
if(NOT HAVE_SOCKADDR_IN6_SIN6_ADDR)
807
if(NOT DOS AND NOT AMIGA)
808
message(WARNING "struct sockaddr_in6 not available, disabling IPv6 support")
809
endif()
810
set(ENABLE_IPV6 OFF CACHE BOOL "Enable IPv6 support" FORCE) # Force the feature off as we use this name as guard macro
811
endif()
812
813
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT ENABLE_ARES)
814
set(_use_core_foundation_and_core_services ON)
815
816
find_library(SYSTEMCONFIGURATION_FRAMEWORK NAMES "SystemConfiguration")
817
mark_as_advanced(SYSTEMCONFIGURATION_FRAMEWORK)
818
if(NOT SYSTEMCONFIGURATION_FRAMEWORK)
819
message(FATAL_ERROR "SystemConfiguration framework not found")
820
endif()
821
list(APPEND CURL_LIBS "-framework SystemConfiguration")
822
endif()
823
endif()
824
endif()
825
if(ENABLE_IPV6)
826
set(USE_IPV6 ON)
827
endif()
828
829
if(0) # XXX(cmake): not needed for build within cmake
830
# Check SSL libraries
831
option(CURL_ENABLE_SSL "Enable SSL support" ON)
832
833
if(CURL_DEFAULT_SSL_BACKEND)
834
set(_valid_default_ssl_backend FALSE)
835
endif()
836
837
if(WIN32)
838
cmake_dependent_option(CURL_USE_SCHANNEL "Enable Windows native SSL/TLS (Schannel)" OFF CURL_ENABLE_SSL OFF)
839
option(CURL_WINDOWS_SSPI "Enable SSPI on Windows" ${CURL_USE_SCHANNEL})
840
else()
841
set(CURL_USE_SCHANNEL OFF)
842
set(CURL_WINDOWS_SSPI OFF)
843
endif()
844
cmake_dependent_option(CURL_USE_MBEDTLS "Enable mbedTLS for SSL/TLS" OFF CURL_ENABLE_SSL OFF)
845
cmake_dependent_option(CURL_USE_WOLFSSL "Enable wolfSSL for SSL/TLS" OFF CURL_ENABLE_SSL OFF)
846
cmake_dependent_option(CURL_USE_GNUTLS "Enable GnuTLS for SSL/TLS" OFF CURL_ENABLE_SSL OFF)
847
cmake_dependent_option(CURL_USE_RUSTLS "Enable Rustls for SSL/TLS" OFF CURL_ENABLE_SSL OFF)
848
849
if(WIN32 OR
850
CURL_USE_SCHANNEL OR
851
CURL_USE_MBEDTLS OR
852
CURL_USE_WOLFSSL OR
853
CURL_USE_GNUTLS OR
854
CURL_USE_RUSTLS)
855
set(_openssl_default OFF)
856
else()
857
set(_openssl_default ON)
858
endif()
859
cmake_dependent_option(CURL_USE_OPENSSL "Enable OpenSSL for SSL/TLS" ${_openssl_default} CURL_ENABLE_SSL OFF)
860
option(USE_OPENSSL_QUIC "Use OpenSSL and nghttp3 libraries for HTTP/3 support" OFF)
861
if(USE_OPENSSL_QUIC AND NOT CURL_USE_OPENSSL)
862
message(WARNING "OpenSSL QUIC has been requested, but without enabling OpenSSL. Will not enable QUIC.")
863
set(USE_OPENSSL_QUIC OFF)
864
endif()
865
option(CURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG "Disable automatic loading of OpenSSL configuration" OFF)
866
endif() # XXX(cmake): end
867
868
curl_count_true(_enabled_ssl_options_count
869
CURL_USE_SCHANNEL
870
CURL_USE_OPENSSL
871
CURL_USE_MBEDTLS
872
CURL_USE_WOLFSSL
873
CURL_USE_GNUTLS
874
CURL_USE_RUSTLS
875
)
876
if(_enabled_ssl_options_count GREATER 1)
877
set(CURL_WITH_MULTI_SSL ON)
878
elseif(_enabled_ssl_options_count EQUAL 0)
879
set(CURL_DISABLE_HSTS ON)
880
endif()
881
882
if(CURL_USE_SCHANNEL)
883
if(WINDOWS_STORE)
884
message(FATAL_ERROR "UWP does not support Schannel.")
885
endif()
886
set(_ssl_enabled ON)
887
set(USE_SCHANNEL ON) # Windows native SSL/TLS support
888
set(USE_WINDOWS_SSPI ON) # CURL_USE_SCHANNEL requires CURL_WINDOWS_SSPI
889
890
if(CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "schannel")
891
set(_valid_default_ssl_backend TRUE)
892
endif()
893
endif()
894
if(CURL_WINDOWS_SSPI AND NOT WINDOWS_STORE)
895
set(USE_WINDOWS_SSPI ON)
896
endif()
897
898
if(APPLE)
899
option(USE_APPLE_SECTRUST "Use Apple OS-native certificate verification" OFF)
900
if(USE_APPLE_SECTRUST)
901
if(NOT CURL_USE_OPENSSL AND NOT CURL_USE_GNUTLS)
902
message(FATAL_ERROR "Apple SecTrust is only supported with Openssl/GnuTLS")
903
endif()
904
find_library(COREFOUNDATION_FRAMEWORK NAMES "Security")
905
mark_as_advanced(COREFOUNDATION_FRAMEWORK)
906
if(NOT COREFOUNDATION_FRAMEWORK)
907
message(FATAL_ERROR "Security framework not found")
908
endif()
909
list(APPEND CURL_LIBS "-framework Security")
910
911
set(_use_core_foundation_and_core_services ON)
912
message(STATUS "Apple OS-native certificate verification enabled")
913
endif()
914
else()
915
set(USE_APPLE_SECTRUST OFF)
916
endif()
917
918
if(_use_core_foundation_and_core_services)
919
find_library(COREFOUNDATION_FRAMEWORK NAMES "CoreFoundation")
920
mark_as_advanced(COREFOUNDATION_FRAMEWORK)
921
if(NOT COREFOUNDATION_FRAMEWORK)
922
message(FATAL_ERROR "CoreFoundation framework not found")
923
endif()
924
list(APPEND CURL_LIBS "-framework CoreFoundation")
925
926
find_library(CORESERVICES_FRAMEWORK NAMES "CoreServices")
927
mark_as_advanced(CORESERVICES_FRAMEWORK)
928
if(NOT CORESERVICES_FRAMEWORK)
929
message(FATAL_ERROR "CoreServices framework not found")
930
endif()
931
list(APPEND CURL_LIBS "-framework CoreServices")
932
endif()
933
934
if(CURL_USE_OPENSSL)
935
find_package(OpenSSL)
936
if(NOT OpenSSL_FOUND)
937
message(FATAL_ERROR
938
"Could not find OpenSSL. Install an OpenSSL development package or "
939
"configure CMake with -DCMAKE_USE_OPENSSL=OFF to build without OpenSSL.")
940
endif()
941
set(_ssl_enabled ON)
942
set(USE_OPENSSL ON)
943
944
# Depend on OpenSSL via imported targets. This allows our dependents to
945
# get our dependencies transitively.
946
list(APPEND CURL_LIBS OpenSSL::SSL OpenSSL::Crypto)
947
set_target_properties(OpenSSL::SSL PROPERTIES INTERFACE_LIBCURL_PC_MODULES "openssl")
948
949
if(CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "openssl")
950
set(_valid_default_ssl_backend TRUE)
951
endif()
952
set(_curl_ca_bundle_supported TRUE)
953
954
cmake_push_check_state()
955
list(APPEND CMAKE_REQUIRED_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
956
if(NOT DEFINED HAVE_BORINGSSL)
957
check_symbol_exists("OPENSSL_IS_BORINGSSL" "openssl/base.h" HAVE_BORINGSSL)
958
endif()
959
if(NOT DEFINED HAVE_AWSLC)
960
check_symbol_exists("OPENSSL_IS_AWSLC" "openssl/base.h" HAVE_AWSLC)
961
endif()
962
if(NOT DEFINED HAVE_LIBRESSL)
963
check_symbol_exists("LIBRESSL_VERSION_NUMBER" "openssl/opensslv.h" HAVE_LIBRESSL)
964
endif()
965
cmake_pop_check_state()
966
967
# Optionally build with a specific CA cert bundle.
968
if(CURL_CA_BUNDLE)
969
add_definitions(-DCURL_CA_BUNDLE="${CURL_CA_BUNDLE}")
970
endif()
971
# Optionally build with a specific CA cert dir.
972
if(CURL_CA_PATH)
973
add_definitions(-DCURL_CA_PATH="${CURL_CA_PATH}")
974
endif()
975
976
if(HAVE_BORINGSSL OR HAVE_AWSLC)
977
if(OPENSSL_USE_STATIC_LIBS AND CMAKE_C_COMPILER_ID MATCHES "Clang")
978
list(APPEND CURL_LIBS "stdc++")
979
list(APPEND CMAKE_REQUIRED_LIBRARIES "stdc++")
980
endif()
981
endif()
982
983
if(HAVE_BORINGSSL)
984
set(_openssl "BoringSSL")
985
elseif(HAVE_AWSLC)
986
set(_openssl "AWS-LC")
987
elseif(HAVE_LIBRESSL)
988
set(_openssl "LibreSSL")
989
elseif(USE_AMISSL)
990
set(_openssl "AmiSSL")
991
else()
992
set(_openssl "OpenSSL")
993
endif()
994
endif()
995
996
if(CURL_USE_MBEDTLS)
997
find_package(MbedTLS REQUIRED)
998
if(MBEDTLS_VERSION VERSION_LESS 3.2.0)
999
message(FATAL_ERROR "mbedTLS v3.2.0 or newer is required.")
1000
endif()
1001
set(_ssl_enabled ON)
1002
set(USE_MBEDTLS ON)
1003
list(APPEND CURL_LIBS CURL::mbedtls)
1004
1005
if(CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "mbedtls")
1006
set(_valid_default_ssl_backend TRUE)
1007
endif()
1008
set(_curl_ca_bundle_supported TRUE)
1009
1010
if(MBEDTLS_VERSION VERSION_GREATER_EQUAL 4.0.0)
1011
set(HAVE_MBEDTLS_DES_CRYPT_ECB 0) # pre-fill detection result
1012
endif()
1013
if(NOT DEFINED HAVE_MBEDTLS_DES_CRYPT_ECB)
1014
cmake_push_check_state()
1015
list(APPEND CMAKE_REQUIRED_LIBRARIES CURL::mbedtls)
1016
check_function_exists("mbedtls_des_crypt_ecb" HAVE_MBEDTLS_DES_CRYPT_ECB) # in mbedTLS <4
1017
cmake_pop_check_state()
1018
endif()
1019
endif()
1020
1021
if(CURL_USE_WOLFSSL)
1022
find_package(WolfSSL REQUIRED)
1023
set(_ssl_enabled ON)
1024
set(USE_WOLFSSL ON)
1025
list(APPEND CURL_LIBS CURL::wolfssl)
1026
1027
if(CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "wolfssl")
1028
set(_valid_default_ssl_backend TRUE)
1029
endif()
1030
set(_curl_ca_bundle_supported TRUE)
1031
endif()
1032
1033
if(CURL_USE_GNUTLS)
1034
find_package(GnuTLS REQUIRED)
1035
list(APPEND CURL_LIBS CURL::gnutls)
1036
find_package(Nettle REQUIRED)
1037
list(APPEND CURL_LIBS CURL::nettle)
1038
set(_ssl_enabled ON)
1039
set(USE_GNUTLS ON)
1040
1041
if(CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "gnutls")
1042
set(_valid_default_ssl_backend TRUE)
1043
endif()
1044
set(_curl_ca_bundle_supported TRUE)
1045
1046
if(NOT DEFINED HAVE_GNUTLS_SRP AND NOT CURL_DISABLE_SRP)
1047
cmake_push_check_state()
1048
list(APPEND CMAKE_REQUIRED_LIBRARIES CURL::gnutls)
1049
# In GnuTLS 3.8.0 (2023-02-10) and upper, this check always succeeds.
1050
# Detecting actual TLS-SRP support needs poking the API at runtime.
1051
check_symbol_exists("gnutls_srp_verifier" "gnutls/gnutls.h" HAVE_GNUTLS_SRP)
1052
cmake_pop_check_state()
1053
endif()
1054
endif()
1055
1056
if(CURL_USE_RUSTLS)
1057
find_package(Rustls REQUIRED)
1058
set(_ssl_enabled ON)
1059
set(USE_RUSTLS ON)
1060
list(APPEND CURL_LIBS CURL::rustls)
1061
1062
if(NOT DEFINED HAVE_RUSTLS_SUPPORTED_HPKE)
1063
if(RUSTLS_VERSION AND RUSTLS_VERSION VERSION_GREATER_EQUAL 0.15)
1064
set(HAVE_RUSTLS_SUPPORTED_HPKE TRUE)
1065
elseif(NOT RUSTLS_VERSION)
1066
cmake_push_check_state()
1067
list(APPEND CMAKE_REQUIRED_LIBRARIES CURL::rustls)
1068
check_symbol_exists("rustls_supported_hpke" "rustls.h" HAVE_RUSTLS_SUPPORTED_HPKE)
1069
cmake_pop_check_state()
1070
endif()
1071
endif()
1072
if(NOT HAVE_RUSTLS_SUPPORTED_HPKE)
1073
message(FATAL_ERROR "rustls-ffi library does not provide rustls_supported_hpke function. Required version is 0.15 or newer.")
1074
endif()
1075
1076
if(CURL_DEFAULT_SSL_BACKEND AND CURL_DEFAULT_SSL_BACKEND STREQUAL "rustls")
1077
set(_valid_default_ssl_backend TRUE)
1078
endif()
1079
set(_curl_ca_bundle_supported TRUE)
1080
endif()
1081
1082
if(CURL_DEFAULT_SSL_BACKEND AND NOT _valid_default_ssl_backend)
1083
message(FATAL_ERROR "CURL_DEFAULT_SSL_BACKEND '${CURL_DEFAULT_SSL_BACKEND}' not enabled.")
1084
endif()
1085
1086
# Keep ZLIB detection after TLS detection,
1087
# and before calling curl_openssl_check_exists().
1088
1089
set(HAVE_LIBZ OFF)
1090
curl_dependency_option(CURL_ZLIB ZLIB "ZLIB")
1091
if(ZLIB_FOUND)
1092
set(HAVE_LIBZ ON)
1093
# Depend on ZLIB via imported targets. This allows our dependents to
1094
# get our dependencies transitively.
1095
if(CMAKE_USE_SYSTEM_ZLIB)
1096
list(APPEND CURL_LIBS ZLIB::ZLIB)
1097
set_target_properties(ZLIB::ZLIB PROPERTIES INTERFACE_LIBCURL_PC_MODULES "zlib")
1098
else()
1099
list(APPEND CURL_LIBS cmzlib)
1100
endif()
1101
endif()
1102
1103
set(HAVE_BROTLI OFF)
1104
curl_dependency_option(CURL_BROTLI Brotli "brotli")
1105
if(BROTLI_FOUND)
1106
set(HAVE_BROTLI ON)
1107
list(APPEND CURL_LIBS CURL::brotli)
1108
endif()
1109
1110
set(HAVE_ZSTD OFF)
1111
curl_dependency_option(CURL_ZSTD Zstd "zstd")
1112
if(ZSTD_FOUND)
1113
if(ZSTD_VERSION VERSION_GREATER_EQUAL 1.0.0)
1114
set(HAVE_ZSTD ON)
1115
list(APPEND CURL_LIBS CURL::zstd)
1116
else()
1117
message(WARNING "zstd v1.0.0 or newer is required, disabling zstd support.")
1118
endif()
1119
endif()
1120
1121
# Check function in an OpenSSL-like TLS backend.
1122
macro(curl_openssl_check_exists)
1123
cmake_push_check_state()
1124
if(USE_OPENSSL)
1125
list(APPEND CMAKE_REQUIRED_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
1126
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-DOPENSSL_SUPPRESS_DEPRECATED") # for SSL_CTX_set_srp_username deprecated since 3.0.0
1127
if(HAVE_LIBZ)
1128
if(CMAKE_USE_SYSTEM_ZLIB)
1129
list(APPEND CMAKE_REQUIRED_LIBRARIES ZLIB::ZLIB)
1130
else()
1131
list(APPEND CMAKE_REQUIRED_LIBRARIES cmzlib)
1132
endif()
1133
endif()
1134
if(WIN32)
1135
list(APPEND CMAKE_REQUIRED_LIBRARIES "bcrypt") # for OpenSSL/LibreSSL
1136
endif()
1137
endif()
1138
if(USE_WOLFSSL)
1139
list(APPEND CMAKE_REQUIRED_LIBRARIES CURL::wolfssl)
1140
if(HAVE_LIBZ)
1141
list(APPEND CMAKE_REQUIRED_LIBRARIES ZLIB::ZLIB) # Public wolfSSL headers also require zlib headers
1142
endif()
1143
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-DHAVE_UINTPTR_T") # to pull in stdint.h (as of wolfSSL v5.5.4)
1144
endif()
1145
if(WIN32)
1146
list(APPEND CMAKE_REQUIRED_LIBRARIES "ws2_32" "crypt32") # for OpenSSL/wolfSSL
1147
endif()
1148
if(${ARGC} EQUAL 2)
1149
check_function_exists(${ARGN})
1150
else()
1151
check_symbol_exists(${ARGN}) # Uses CMAKE_REQUIRED_INCLUDES and CMAKE_REQUIRED_DEFINITIONS
1152
endif()
1153
cmake_pop_check_state()
1154
endmacro()
1155
1156
# Ensure that OpenSSL (or fork) or wolfSSL actually supports QUICTLS API.
1157
macro(curl_openssl_check_quic)
1158
if(USE_OPENSSL AND NOT USE_OPENSSL_QUIC)
1159
if(OPENSSL_VERSION VERSION_GREATER_EQUAL 3.5.0)
1160
if(NOT DEFINED HAVE_SSL_SET_QUIC_TLS_CBS)
1161
curl_openssl_check_exists("SSL_set_quic_tls_cbs" HAVE_SSL_SET_QUIC_TLS_CBS)
1162
endif()
1163
else()
1164
if(NOT DEFINED HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT)
1165
curl_openssl_check_exists("SSL_set_quic_use_legacy_codepoint" HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT)
1166
endif()
1167
endif()
1168
endif()
1169
if(USE_WOLFSSL AND NOT DEFINED HAVE_WOLFSSL_SET_QUIC_USE_LEGACY_CODEPOINT)
1170
curl_openssl_check_exists("wolfSSL_set_quic_use_legacy_codepoint" HAVE_WOLFSSL_SET_QUIC_USE_LEGACY_CODEPOINT)
1171
endif()
1172
if(NOT HAVE_SSL_SET_QUIC_TLS_CBS AND
1173
NOT HAVE_SSL_SET_QUIC_USE_LEGACY_CODEPOINT AND
1174
NOT HAVE_WOLFSSL_SET_QUIC_USE_LEGACY_CODEPOINT)
1175
message(FATAL_ERROR "QUICTLS API support is missing from OpenSSL/fork/wolfSSL. Try setting -DOPENSSL_ROOT_DIR")
1176
endif()
1177
endmacro()
1178
1179
if(USE_WOLFSSL)
1180
curl_openssl_check_exists("wolfSSL_get_peer_certificate" HAVE_WOLFSSL_GET_PEER_CERTIFICATE)
1181
curl_openssl_check_exists("wolfSSL_UseALPN" HAVE_WOLFSSL_USEALPN)
1182
curl_openssl_check_exists("wolfSSL_DES_ecb_encrypt" HAVE_WOLFSSL_DES_ECB_ENCRYPT)
1183
curl_openssl_check_exists("wolfSSL_BIO_new" HAVE_WOLFSSL_BIO_NEW)
1184
curl_openssl_check_exists("wolfSSL_BIO_set_shutdown" HAVE_WOLFSSL_BIO_SET_SHUTDOWN)
1185
endif()
1186
1187
if(USE_OPENSSL)
1188
if(NOT DEFINED HAVE_DES_ECB_ENCRYPT)
1189
curl_openssl_check_exists("DES_ecb_encrypt" "openssl/des.h" HAVE_DES_ECB_ENCRYPT)
1190
endif()
1191
if(NOT DEFINED HAVE_SSL_SET0_WBIO)
1192
curl_openssl_check_exists("SSL_set0_wbio" HAVE_SSL_SET0_WBIO)
1193
endif()
1194
if(NOT DEFINED HAVE_OPENSSL_SRP AND NOT CURL_DISABLE_SRP)
1195
curl_openssl_check_exists("SSL_CTX_set_srp_username" "openssl/ssl.h" HAVE_OPENSSL_SRP)
1196
endif()
1197
endif()
1198
1199
option(USE_HTTPSRR "Enable HTTPS RR support" OFF)
1200
option(USE_ECH "Enable ECH support" OFF)
1201
if(USE_ECH)
1202
if(USE_OPENSSL OR USE_WOLFSSL OR USE_RUSTLS)
1203
# Be sure that the TLS library actually supports ECH.
1204
if(USE_WOLFSSL)
1205
curl_openssl_check_exists("wolfSSL_CTX_GenerateEchConfig" HAVE_WOLFSSL_CTX_GENERATEECHCONFIG)
1206
endif()
1207
if(USE_OPENSSL)
1208
curl_openssl_check_exists("SSL_set1_ech_config_list" HAVE_SSL_SET1_ECH_CONFIG_LIST)
1209
endif()
1210
if(HAVE_WOLFSSL_CTX_GENERATEECHCONFIG OR
1211
HAVE_SSL_SET1_ECH_CONFIG_LIST OR
1212
USE_RUSTLS)
1213
set(HAVE_ECH 1)
1214
endif()
1215
if(NOT HAVE_ECH)
1216
message(FATAL_ERROR "ECH support missing in OpenSSL/BoringSSL/AWS-LC/wolfSSL/rustls-ffi")
1217
else()
1218
message(STATUS "ECH enabled")
1219
# ECH wants HTTPSRR
1220
set(USE_HTTPSRR ON)
1221
message(STATUS "HTTPSRR enabled")
1222
endif()
1223
else()
1224
message(FATAL_ERROR "ECH requires ECH-enabled OpenSSL, BoringSSL, AWS-LC, wolfSSL or rustls-ffi")
1225
endif()
1226
endif()
1227
1228
option(USE_SSLS_EXPORT "Enable SSL session export support" OFF)
1229
if(USE_SSLS_EXPORT)
1230
if(_ssl_enabled)
1231
message(STATUS "SSL export enabled.")
1232
else()
1233
message(WARNING "SSL session export requires SSL enabled")
1234
endif()
1235
endif()
1236
1237
option(USE_NGHTTP2 "Use nghttp2 library" ON)
1238
if(USE_NGHTTP2)
1239
find_package(NGHTTP2)
1240
if(NGHTTP2_FOUND)
1241
list(APPEND CURL_LIBS CURL::nghttp2)
1242
else()
1243
set(USE_NGHTTP2 OFF)
1244
endif()
1245
endif()
1246
1247
option(USE_NGTCP2 "Use ngtcp2 and nghttp3 libraries for HTTP/3 support" OFF)
1248
if(USE_NGTCP2)
1249
if(CURL_WITH_MULTI_SSL)
1250
message(FATAL_ERROR "MultiSSL cannot be enabled with HTTP/3 and vice versa.")
1251
elseif(USE_OPENSSL OR USE_WOLFSSL)
1252
if(USE_WOLFSSL)
1253
find_package(NGTCP2 REQUIRED COMPONENTS "wolfSSL")
1254
elseif(HAVE_BORINGSSL OR HAVE_AWSLC)
1255
find_package(NGTCP2 REQUIRED COMPONENTS "BoringSSL")
1256
elseif(OPENSSL_VERSION VERSION_GREATER_EQUAL 3.5.0 AND NOT USE_OPENSSL_QUIC)
1257
find_package(NGTCP2 REQUIRED COMPONENTS "ossl")
1258
if(NGTCP2_VERSION VERSION_LESS 1.12.0)
1259
message(FATAL_ERROR "ngtcp2 1.12.0 or upper required for OpenSSL")
1260
endif()
1261
set(OPENSSL_QUIC_API2 1)
1262
elseif(HAVE_LIBRESSL)
1263
find_package(NGTCP2 COMPONENTS "LibreSSL")
1264
if(NOT NGTCP2_FOUND)
1265
find_package(NGTCP2 REQUIRED COMPONENTS "quictls") # for ngtcp2 <1.15.0
1266
endif()
1267
else()
1268
find_package(NGTCP2 REQUIRED COMPONENTS "quictls")
1269
set(_openssl "quictls")
1270
endif()
1271
curl_openssl_check_quic()
1272
elseif(USE_GNUTLS)
1273
find_package(NGTCP2 REQUIRED "GnuTLS")
1274
else()
1275
message(FATAL_ERROR "ngtcp2 requires a supported TLS-backend")
1276
endif()
1277
list(APPEND CURL_LIBS CURL::ngtcp2)
1278
1279
find_package(NGHTTP3 REQUIRED)
1280
set(USE_NGHTTP3 ON)
1281
list(APPEND CURL_LIBS CURL::nghttp3)
1282
endif()
1283
1284
option(USE_QUICHE "Use quiche library for HTTP/3 support" OFF)
1285
if(USE_QUICHE)
1286
if(USE_NGTCP2)
1287
message(FATAL_ERROR "Only one HTTP/3 backend can be selected")
1288
elseif(CURL_WITH_MULTI_SSL)
1289
message(FATAL_ERROR "MultiSSL cannot be enabled with HTTP/3 and vice versa.")
1290
endif()
1291
find_package(Quiche REQUIRED)
1292
if(NOT HAVE_BORINGSSL)
1293
message(FATAL_ERROR "quiche requires BoringSSL")
1294
endif()
1295
curl_openssl_check_quic()
1296
list(APPEND CURL_LIBS CURL::quiche)
1297
if(NOT DEFINED HAVE_QUICHE_CONN_SET_QLOG_FD)
1298
cmake_push_check_state()
1299
list(APPEND CMAKE_REQUIRED_LIBRARIES CURL::quiche)
1300
check_symbol_exists("quiche_conn_set_qlog_fd" "quiche.h" HAVE_QUICHE_CONN_SET_QLOG_FD)
1301
cmake_pop_check_state()
1302
endif()
1303
endif()
1304
1305
if(USE_OPENSSL_QUIC)
1306
if(USE_NGTCP2 OR USE_QUICHE)
1307
message(FATAL_ERROR "Only one HTTP/3 backend can be selected")
1308
elseif(CURL_WITH_MULTI_SSL)
1309
message(FATAL_ERROR "MultiSSL cannot be enabled with HTTP/3 and vice versa.")
1310
endif()
1311
find_package(OpenSSL 3.3.0 REQUIRED)
1312
1313
find_package(NGHTTP3 REQUIRED)
1314
set(USE_NGHTTP3 ON)
1315
list(APPEND CURL_LIBS CURL::nghttp3)
1316
endif()
1317
1318
if(NOT CURL_DISABLE_SRP AND (HAVE_GNUTLS_SRP OR HAVE_OPENSSL_SRP))
1319
set(USE_TLS_SRP 1)
1320
endif()
1321
1322
if(NOT CURL_DISABLE_LDAP)
1323
if(WIN32 AND NOT WINDOWS_STORE)
1324
option(USE_WIN32_LDAP "Use Windows LDAP implementation" ON)
1325
if(USE_WIN32_LDAP)
1326
list(APPEND CURL_LIBS "wldap32")
1327
if(NOT CURL_DISABLE_LDAPS)
1328
set(HAVE_LDAP_SSL ON)
1329
endif()
1330
endif()
1331
endif()
1332
1333
# Now that we know, we are not using Windows LDAP...
1334
if(NOT USE_WIN32_LDAP)
1335
# Check for LDAP
1336
cmake_push_check_state()
1337
if(USE_OPENSSL)
1338
list(APPEND CMAKE_REQUIRED_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
1339
endif()
1340
find_package(LDAP)
1341
if(LDAP_FOUND)
1342
set(HAVE_LBER_H 1)
1343
set(CURL_LIBS CURL::ldap ${CURL_LIBS})
1344
1345
# LDAP feature checks
1346
1347
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-DLDAP_DEPRECATED=1")
1348
list(APPEND CMAKE_REQUIRED_LIBRARIES CURL::ldap)
1349
1350
check_function_exists("ldap_url_parse" HAVE_LDAP_URL_PARSE)
1351
check_function_exists("ldap_init_fd" HAVE_LDAP_INIT_FD)
1352
1353
check_include_file("ldap_ssl.h" HAVE_LDAP_SSL_H)
1354
1355
if(HAVE_LDAP_INIT_FD)
1356
set(USE_OPENLDAP ON)
1357
endif()
1358
if(NOT CURL_DISABLE_LDAPS)
1359
set(HAVE_LDAP_SSL ON)
1360
endif()
1361
else()
1362
message(STATUS "LDAP not found. CURL_DISABLE_LDAP set ON")
1363
set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
1364
endif()
1365
cmake_pop_check_state()
1366
endif()
1367
endif()
1368
1369
# No ldap, no ldaps.
1370
if(CURL_DISABLE_LDAP)
1371
if(NOT CURL_DISABLE_LDAPS)
1372
message(STATUS "LDAP needs to be enabled to support LDAPS")
1373
set(CURL_DISABLE_LDAPS ON CACHE BOOL "" FORCE)
1374
endif()
1375
endif()
1376
1377
if(WIN32)
1378
option(USE_WIN32_IDN "Use WinIDN for IDN support" OFF)
1379
if(USE_WIN32_IDN)
1380
list(APPEND CURL_LIBS "normaliz")
1381
endif()
1382
else()
1383
set(USE_WIN32_IDN OFF)
1384
endif()
1385
1386
if(APPLE)
1387
option(USE_APPLE_IDN "Use Apple built-in IDN support" OFF)
1388
if(USE_APPLE_IDN)
1389
cmake_push_check_state()
1390
list(APPEND CMAKE_REQUIRED_LIBRARIES "icucore")
1391
check_symbol_exists("uidna_openUTS46" "unicode/uidna.h" HAVE_APPLE_IDN)
1392
cmake_pop_check_state()
1393
if(HAVE_APPLE_IDN)
1394
list(APPEND CURL_LIBS "icucore" "iconv")
1395
else()
1396
set(USE_APPLE_IDN OFF)
1397
endif()
1398
endif()
1399
else()
1400
set(USE_APPLE_IDN OFF)
1401
endif()
1402
1403
# Check for libidn2
1404
option(USE_LIBIDN2 "Use libidn2 for IDN support" ON)
1405
set(HAVE_IDN2_H OFF)
1406
set(HAVE_LIBIDN2 OFF)
1407
if(USE_LIBIDN2 AND NOT USE_APPLE_IDN AND NOT USE_WIN32_IDN)
1408
find_package(Libidn2 QUIET)
1409
if(LIBIDN2_FOUND)
1410
set(CURL_LIBS CURL::libidn2 ${CURL_LIBS})
1411
set(HAVE_IDN2_H 1)
1412
set(HAVE_LIBIDN2 1)
1413
endif()
1414
endif()
1415
1416
# libpsl
1417
option(CURL_USE_LIBPSL "Use libpsl" ON)
1418
mark_as_advanced(CURL_USE_LIBPSL)
1419
set(USE_LIBPSL OFF)
1420
if(CURL_USE_LIBPSL)
1421
find_package(Libpsl REQUIRED)
1422
list(APPEND CURL_LIBS CURL::libpsl)
1423
set(USE_LIBPSL ON)
1424
endif()
1425
1426
# libssh2
1427
option(CURL_USE_LIBSSH2 "Use libssh2" ON)
1428
mark_as_advanced(CURL_USE_LIBSSH2)
1429
set(USE_LIBSSH2 OFF)
1430
if(CURL_USE_LIBSSH2)
1431
find_package(Libssh2)
1432
if(LIBSSH2_FOUND)
1433
set(CURL_LIBS CURL::libssh2 ${CURL_LIBS}) # keep it before TLS-crypto, compression
1434
set(USE_LIBSSH2 ON)
1435
endif()
1436
endif()
1437
1438
# libssh
1439
option(CURL_USE_LIBSSH "Use libssh" OFF)
1440
mark_as_advanced(CURL_USE_LIBSSH)
1441
if(NOT USE_LIBSSH2 AND CURL_USE_LIBSSH)
1442
find_package(Libssh REQUIRED)
1443
set(CURL_LIBS CURL::libssh ${CURL_LIBS}) # keep it before TLS-crypto, compression
1444
set(USE_LIBSSH ON)
1445
endif()
1446
1447
option(CURL_USE_GSASL "Use libgsasl" OFF)
1448
mark_as_advanced(CURL_USE_GSASL)
1449
if(CURL_USE_GSASL)
1450
find_package(Libgsasl REQUIRED)
1451
list(APPEND CURL_LIBS CURL::libgsasl)
1452
set(USE_GSASL ON)
1453
endif()
1454
1455
option(CURL_USE_GSSAPI "Use GSSAPI implementation" OFF)
1456
mark_as_advanced(CURL_USE_GSSAPI)
1457
1458
if(CURL_USE_GSSAPI)
1459
find_package(GSS)
1460
1461
set(HAVE_GSSAPI ${GSS_FOUND})
1462
if(GSS_FOUND)
1463
list(APPEND CURL_LIBS CURL::gss)
1464
1465
get_target_property(_gss_flavour CURL::gss INTERFACE_CURL_GSS_FLAVOUR)
1466
if(_gss_flavour STREQUAL "GNU")
1467
set(HAVE_GSSGNU 1)
1468
elseif(GSS_VERSION) # MIT
1469
set(CURL_KRB5_VERSION "\"${GSS_VERSION}\"")
1470
endif()
1471
else()
1472
message(WARNING "GSSAPI has been requested, but no supporting libraries found. Skipping.")
1473
endif()
1474
endif()
1475
1476
# libbacktrace
1477
option(CURL_USE_LIBBACKTRACE "Use libbacktrace. Requires build with TrackMemory and DWARF debug information." OFF)
1478
if(CURL_USE_LIBBACKTRACE)
1479
if(NOT ENABLE_CURLDEBUG)
1480
message(FATAL_ERROR "libbacktrace requires TrackMemory enabled")
1481
endif()
1482
if(NOT CMAKE_BUILD_TYPE MATCHES "(Debug|RelWithDebInfo)")
1483
message(FATAL_ERROR "libbacktrace requires debug information")
1484
endif()
1485
find_package(Libbacktrace REQUIRED)
1486
list(APPEND CURL_LIBS CURL::libbacktrace)
1487
set(USE_BACKTRACE ON)
1488
endif()
1489
1490
# libuv
1491
option(CURL_USE_LIBUV "Use libuv for event-based tests" OFF)
1492
if(CURL_USE_LIBUV)
1493
if(NOT ENABLE_DEBUG)
1494
message(FATAL_ERROR "Using libuv without debug support enabled is useless")
1495
endif()
1496
find_package(Libuv REQUIRED)
1497
list(APPEND CURL_LIBS CURL::libuv)
1498
set(USE_LIBUV ON)
1499
set(HAVE_UV_H ON)
1500
endif()
1501
1502
option(USE_LIBRTMP "Enable librtmp from rtmpdump" OFF)
1503
if(USE_LIBRTMP)
1504
find_package(Librtmp REQUIRED)
1505
list(APPEND CURL_LIBS CURL::librtmp)
1506
endif()
1507
1508
option(ENABLE_UNIX_SOCKETS "Enable Unix domain sockets support" ON)
1509
if(ENABLE_UNIX_SOCKETS)
1510
if(WIN32 OR DOS)
1511
set(USE_UNIX_SOCKETS 1)
1512
else()
1513
include(CheckStructHasMember)
1514
check_struct_has_member("struct sockaddr_un" "sun_path" "sys/un.h" USE_UNIX_SOCKETS)
1515
endif()
1516
else()
1517
set(USE_UNIX_SOCKETS 0)
1518
unset(USE_UNIX_SOCKETS CACHE)
1519
endif()
1520
1521
if(0) # XXX(cmake): not needed for build within cmake
1522
#
1523
# CA handling
1524
#
1525
if(_curl_ca_bundle_supported)
1526
set(_ca_opt_desc "Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
1527
1528
set(CURL_CA_BUNDLE "auto" CACHE
1529
STRING "Absolute path to the CA bundle. ${_ca_opt_desc}")
1530
set(CURL_CA_FALLBACK OFF CACHE
1531
BOOL "Use built-in CA store of OpenSSL. Defaults to OFF")
1532
set(CURL_CA_PATH "auto" CACHE
1533
STRING "Absolute path to a directory containing CA certificates stored individually. ${_ca_opt_desc}")
1534
set(CURL_CA_EMBED "" CACHE
1535
STRING "Absolute path to the CA bundle to embed in the curl tool.")
1536
1537
if(CURL_CA_FALLBACK AND NOT CURL_USE_OPENSSL)
1538
message(FATAL_ERROR "CURL_CA_FALLBACK only works with OpenSSL.")
1539
endif()
1540
1541
if(CURL_CA_BUNDLE STREQUAL "")
1542
message(FATAL_ERROR "Invalid value of CURL_CA_BUNDLE. Use 'none', 'auto' or file path.")
1543
elseif(CURL_CA_BUNDLE STREQUAL "none")
1544
unset(CURL_CA_BUNDLE CACHE)
1545
elseif(CURL_CA_BUNDLE STREQUAL "auto")
1546
unset(CURL_CA_BUNDLE CACHE)
1547
if(NOT CMAKE_CROSSCOMPILING AND NOT WIN32 AND NOT USE_APPLE_SECTRUST)
1548
set(_curl_ca_bundle_autodetect TRUE)
1549
endif()
1550
else()
1551
set(CURL_CA_BUNDLE_SET TRUE)
1552
endif()
1553
mark_as_advanced(CURL_CA_BUNDLE_SET)
1554
1555
if(CURL_CA_PATH STREQUAL "")
1556
message(FATAL_ERROR "Invalid value of CURL_CA_PATH. Use 'none', 'auto' or directory path.")
1557
elseif(CURL_CA_PATH STREQUAL "none")
1558
unset(CURL_CA_PATH CACHE)
1559
elseif(CURL_CA_PATH STREQUAL "auto")
1560
unset(CURL_CA_PATH CACHE)
1561
if(NOT CMAKE_CROSSCOMPILING AND NOT WIN32 AND NOT USE_APPLE_SECTRUST)
1562
set(_curl_ca_path_autodetect TRUE)
1563
endif()
1564
else()
1565
set(CURL_CA_PATH_SET TRUE)
1566
endif()
1567
mark_as_advanced(CURL_CA_PATH_SET)
1568
1569
if(CURL_CA_BUNDLE_SET AND _curl_ca_path_autodetect)
1570
# Skip auto-detection of unset CA path because CA bundle is set explicitly
1571
elseif(CURL_CA_PATH_SET AND _curl_ca_bundle_autodetect)
1572
# Skip auto-detection of unset CA bundle because CA path is set explicitly
1573
elseif(_curl_ca_bundle_autodetect OR _curl_ca_path_autodetect)
1574
# First try auto-detecting a CA bundle, then a CA path
1575
1576
if(_curl_ca_bundle_autodetect)
1577
foreach(_search_ca_bundle_path IN ITEMS
1578
"/etc/ssl/certs/ca-certificates.crt"
1579
"/etc/pki/tls/certs/ca-bundle.crt"
1580
"/usr/share/ssl/certs/ca-bundle.crt"
1581
"/usr/local/share/certs/ca-root-nss.crt"
1582
"/etc/ssl/cert.pem")
1583
if(EXISTS "${_search_ca_bundle_path}")
1584
message(STATUS "Found CA bundle: ${_search_ca_bundle_path}")
1585
set(CURL_CA_BUNDLE "${_search_ca_bundle_path}" CACHE
1586
STRING "Absolute path to the CA bundle. ${_ca_opt_desc}")
1587
set(CURL_CA_BUNDLE_SET TRUE CACHE BOOL "Absolute path to the CA bundle has been set")
1588
break()
1589
endif()
1590
endforeach()
1591
endif()
1592
1593
if(_curl_ca_path_autodetect AND NOT CURL_CA_PATH_SET)
1594
set(_search_ca_path "/etc/ssl/certs")
1595
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")
1596
if(_curl_ca_files_found)
1597
unset(_curl_ca_files_found)
1598
message(STATUS "Found CA path: ${_search_ca_path}")
1599
set(CURL_CA_PATH "${_search_ca_path}" CACHE
1600
STRING "Absolute path to a directory containing CA certificates stored individually. ${_ca_opt_desc}")
1601
set(CURL_CA_PATH_SET TRUE CACHE BOOL "Absolute path to the CA bundle has been set")
1602
endif()
1603
endif()
1604
endif()
1605
1606
set(CURL_CA_EMBED_SET FALSE)
1607
if(BUILD_CURL_EXE AND NOT CURL_CA_EMBED STREQUAL "")
1608
if(EXISTS "${CURL_CA_EMBED}")
1609
set(CURL_CA_EMBED_SET TRUE)
1610
message(STATUS "Found CA bundle to embed: ${CURL_CA_EMBED}")
1611
else()
1612
message(FATAL_ERROR "CA bundle to embed is missing: '${CURL_CA_EMBED}'")
1613
endif()
1614
endif()
1615
endif()
1616
endif() # XXX(cmake): end
1617
1618
if(WIN32)
1619
option(CURL_DISABLE_CA_SEARCH "Disable unsafe CA bundle search in PATH on Windows" OFF)
1620
option(CURL_CA_SEARCH_SAFE "Enable safe CA bundle search (within the curl tool directory) on Windows" OFF)
1621
endif()
1622
1623
# Check for header files
1624
if(WIN32)
1625
list(APPEND CURL_INCLUDES "winsock2.h")
1626
list(APPEND CURL_INCLUDES "ws2tcpip.h")
1627
1628
if(HAVE_WIN32_WINNT AND HAVE_WIN32_WINNT LESS 0x0501)
1629
# Windows XP is required for freeaddrinfo, getaddrinfo
1630
message(FATAL_ERROR "Building for Windows XP or newer is required.")
1631
endif()
1632
1633
# Pre-fill detection results based on target OS version
1634
if(_CURL_PREFILL)
1635
if(NOT HAVE_WIN32_WINNT OR HAVE_WIN32_WINNT LESS 0x0600 OR # older than Windows Vista
1636
WINDOWS_STORE)
1637
set(HAVE_IF_NAMETOINDEX 0)
1638
unset(HAVE_IF_NAMETOINDEX CACHE)
1639
elseif(MSVC OR MINGW)
1640
set(HAVE_IF_NAMETOINDEX 1)
1641
unset(HAVE_IF_NAMETOINDEX CACHE)
1642
endif()
1643
endif()
1644
endif()
1645
1646
if(NOT WIN32)
1647
list(APPEND CURL_INCLUDES "sys/socket.h")
1648
endif()
1649
if(NOT WIN32 OR MINGW)
1650
list(APPEND CURL_INCLUDES "sys/time.h")
1651
endif()
1652
1653
# Detect headers
1654
1655
# Use check_include_file_concat_curl() for headers required by subsequent
1656
# check_include_file_concat_curl() or check_symbol_exists() detections.
1657
# Order for these is significant.
1658
check_include_file("sys/eventfd.h" HAVE_SYS_EVENTFD_H)
1659
check_include_file("sys/filio.h" HAVE_SYS_FILIO_H)
1660
check_include_file("sys/ioctl.h" HAVE_SYS_IOCTL_H)
1661
check_include_file("sys/param.h" HAVE_SYS_PARAM_H)
1662
check_include_file("sys/poll.h" HAVE_SYS_POLL_H)
1663
check_include_file("sys/resource.h" HAVE_SYS_RESOURCE_H)
1664
check_include_file_concat_curl("sys/select.h" HAVE_SYS_SELECT_H)
1665
check_include_file("sys/sockio.h" HAVE_SYS_SOCKIO_H)
1666
check_include_file_concat_curl("sys/types.h" HAVE_SYS_TYPES_H)
1667
check_include_file("sys/un.h" HAVE_SYS_UN_H)
1668
check_include_file_concat_curl("sys/utime.h" HAVE_SYS_UTIME_H) # sys/types.h (AmigaOS)
1669
1670
check_include_file_concat_curl("arpa/inet.h" HAVE_ARPA_INET_H)
1671
check_include_file("dirent.h" HAVE_DIRENT_H)
1672
check_include_file("fcntl.h" HAVE_FCNTL_H)
1673
check_include_file_concat_curl("ifaddrs.h" HAVE_IFADDRS_H)
1674
check_include_file("io.h" HAVE_IO_H)
1675
check_include_file_concat_curl("libgen.h" HAVE_LIBGEN_H)
1676
check_include_file("linux/tcp.h" HAVE_LINUX_TCP_H)
1677
check_include_file("locale.h" HAVE_LOCALE_H)
1678
check_include_file_concat_curl("net/if.h" HAVE_NET_IF_H) # sys/select.h (e.g. MS-DOS/Watt-32)
1679
check_include_file_concat_curl("netdb.h" HAVE_NETDB_H)
1680
check_include_file_concat_curl("netinet/in.h" HAVE_NETINET_IN_H)
1681
check_include_file("netinet/in6.h" HAVE_NETINET_IN6_H)
1682
check_include_file_concat_curl("netinet/tcp.h" HAVE_NETINET_TCP_H) # sys/types.h (e.g. Cygwin) netinet/in.h
1683
check_include_file_concat_curl("netinet/udp.h" HAVE_NETINET_UDP_H) # sys/types.h (e.g. Cygwin)
1684
check_include_file("poll.h" HAVE_POLL_H)
1685
check_include_file("pwd.h" HAVE_PWD_H)
1686
check_include_file("stdatomic.h" HAVE_STDATOMIC_H)
1687
check_include_file("stdbool.h" HAVE_STDBOOL_H)
1688
check_include_file("stdint.h" HAVE_STDINT_H)
1689
check_include_file("strings.h" HAVE_STRINGS_H)
1690
check_include_file("stropts.h" HAVE_STROPTS_H)
1691
check_include_file("termio.h" HAVE_TERMIO_H)
1692
check_include_file("termios.h" HAVE_TERMIOS_H)
1693
check_include_file_concat_curl("unistd.h" HAVE_UNISTD_H)
1694
check_include_file("utime.h" HAVE_UTIME_H)
1695
1696
if(AMIGA)
1697
check_include_file_concat_curl("proto/bsdsocket.h" HAVE_PROTO_BSDSOCKET_H)
1698
endif()
1699
1700
# Pass these detection results to curl_internal_test() for use in CurlTests.c
1701
# Add here all feature flags referenced from CurlTests.c
1702
foreach(_variable IN ITEMS
1703
HAVE_STDATOMIC_H
1704
HAVE_STDBOOL_H
1705
HAVE_STROPTS_H
1706
HAVE_SYS_IOCTL_H
1707
HAVE_SYS_TYPES_H
1708
HAVE_UNISTD_H
1709
)
1710
if(${_variable})
1711
string(APPEND CURL_TEST_DEFINES " -D${_variable}")
1712
endif()
1713
endforeach()
1714
1715
check_type_size("size_t" SIZEOF_SIZE_T)
1716
check_type_size("ssize_t" SIZEOF_SSIZE_T)
1717
check_type_size("time_t" SIZEOF_TIME_T)
1718
check_type_size("suseconds_t" SIZEOF_SUSECONDS_T)
1719
1720
if(SIZEOF_SUSECONDS_T)
1721
set(HAVE_SUSECONDS_T 1)
1722
endif()
1723
1724
# Check for some functions that are used
1725
1726
# Apply to all feature checks
1727
if(WIN32)
1728
list(APPEND CMAKE_REQUIRED_LIBRARIES "ws2_32")
1729
if(NOT WINDOWS_STORE)
1730
list(APPEND CMAKE_REQUIRED_LIBRARIES "iphlpapi")
1731
endif()
1732
elseif(HAVE_LIBSOCKET)
1733
list(APPEND CMAKE_REQUIRED_LIBRARIES "socket")
1734
elseif(HAVE_LIBNETWORK)
1735
list(APPEND CMAKE_REQUIRED_LIBRARIES "network")
1736
elseif(DOS)
1737
list(APPEND CMAKE_REQUIRED_LIBRARIES "${WATT_ROOT}/lib/libwatt.a")
1738
endif()
1739
1740
check_function_exists("accept4" HAVE_ACCEPT4)
1741
check_function_exists("fnmatch" HAVE_FNMATCH)
1742
check_symbol_exists("basename" "${CURL_INCLUDES};string.h" HAVE_BASENAME) # libgen.h unistd.h
1743
check_symbol_exists("opendir" "dirent.h" HAVE_OPENDIR)
1744
check_function_exists("poll" HAVE_POLL) # poll.h
1745
check_symbol_exists("socket" "${CURL_INCLUDES}" HAVE_SOCKET) # winsock2.h sys/socket.h
1746
check_symbol_exists("socketpair" "${CURL_INCLUDES}" HAVE_SOCKETPAIR) # sys/socket.h
1747
check_symbol_exists("recv" "${CURL_INCLUDES}" HAVE_RECV) # proto/bsdsocket.h sys/types.h sys/socket.h
1748
check_symbol_exists("send" "${CURL_INCLUDES}" HAVE_SEND) # proto/bsdsocket.h sys/types.h sys/socket.h
1749
check_function_exists("sendmsg" HAVE_SENDMSG)
1750
check_function_exists("sendmmsg" HAVE_SENDMMSG)
1751
check_symbol_exists("select" "${CURL_INCLUDES}" HAVE_SELECT) # proto/bsdsocket.h sys/select.h sys/socket.h
1752
check_symbol_exists("strdup" "string.h" HAVE_STRDUP)
1753
check_symbol_exists("memrchr" "string.h" HAVE_MEMRCHR)
1754
check_symbol_exists("alarm" "unistd.h" HAVE_ALARM)
1755
check_symbol_exists("fcntl" "fcntl.h" HAVE_FCNTL)
1756
check_function_exists("getppid" HAVE_GETPPID)
1757
check_function_exists("utimes" HAVE_UTIMES)
1758
1759
check_function_exists("gettimeofday" HAVE_GETTIMEOFDAY) # sys/time.h
1760
check_symbol_exists("closesocket" "${CURL_INCLUDES}" HAVE_CLOSESOCKET) # winsock2.h
1761
check_symbol_exists("sigsetjmp" "setjmp.h" HAVE_SIGSETJMP)
1762
check_function_exists("getpass_r" HAVE_GETPASS_R)
1763
check_function_exists("getpwuid" HAVE_GETPWUID)
1764
check_function_exists("getpwuid_r" HAVE_GETPWUID_R)
1765
check_function_exists("geteuid" HAVE_GETEUID)
1766
check_function_exists("utime" HAVE_UTIME)
1767
check_symbol_exists("gmtime_r" "stdlib.h;time.h" HAVE_GMTIME_R)
1768
check_symbol_exists("localtime_r" "stdlib.h;time.h" HAVE_LOCALTIME_R)
1769
1770
check_symbol_exists("gethostbyname_r" "netdb.h" HAVE_GETHOSTBYNAME_R)
1771
check_symbol_exists("gethostname" "${CURL_INCLUDES}" HAVE_GETHOSTNAME) # winsock2.h unistd.h proto/bsdsocket.h
1772
1773
check_symbol_exists("signal" "signal.h" HAVE_SIGNAL)
1774
check_symbol_exists("strerror_r" "stdlib.h;string.h" HAVE_STRERROR_R)
1775
check_symbol_exists("sigaction" "signal.h" HAVE_SIGACTION)
1776
check_symbol_exists("siginterrupt" "signal.h" HAVE_SIGINTERRUPT)
1777
check_symbol_exists("getaddrinfo" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_GETADDRINFO) # ws2tcpip.h sys/socket.h netdb.h
1778
check_symbol_exists("getifaddrs" "${CURL_INCLUDES};stdlib.h" HAVE_GETIFADDRS) # ifaddrs.h
1779
check_symbol_exists("freeaddrinfo" "${CURL_INCLUDES}" HAVE_FREEADDRINFO) # ws2tcpip.h sys/socket.h netdb.h
1780
check_function_exists("pipe" HAVE_PIPE)
1781
check_function_exists("pipe2" HAVE_PIPE2)
1782
check_function_exists("eventfd" HAVE_EVENTFD)
1783
check_symbol_exists("ftruncate" "unistd.h" HAVE_FTRUNCATE)
1784
check_symbol_exists("getpeername" "${CURL_INCLUDES}" HAVE_GETPEERNAME) # winsock2.h unistd.h proto/bsdsocket.h
1785
check_symbol_exists("getsockname" "${CURL_INCLUDES}" HAVE_GETSOCKNAME) # winsock2.h unistd.h proto/bsdsocket.h
1786
check_function_exists("getrlimit" HAVE_GETRLIMIT)
1787
check_function_exists("setlocale" HAVE_SETLOCALE)
1788
check_function_exists("setrlimit" HAVE_SETRLIMIT)
1789
1790
if(WIN32)
1791
# include wincrypt.h as a workaround for mingw-w64 __MINGW64_VERSION_MAJOR <= 5 header bug */
1792
check_symbol_exists("if_nametoindex" "winsock2.h;wincrypt.h;iphlpapi.h" HAVE_IF_NAMETOINDEX) # Windows Vista+ non-UWP */
1793
else()
1794
check_function_exists("if_nametoindex" HAVE_IF_NAMETOINDEX) # net/if.h
1795
check_function_exists("realpath" HAVE_REALPATH)
1796
check_function_exists("sched_yield" HAVE_SCHED_YIELD)
1797
check_symbol_exists("strcasecmp" "string.h" HAVE_STRCASECMP)
1798
check_symbol_exists("stricmp" "string.h" HAVE_STRICMP)
1799
check_symbol_exists("strcmpi" "string.h" HAVE_STRCMPI)
1800
endif()
1801
1802
check_function_exists("setmode" HAVE_SETMODE)
1803
if(WIN32 OR CYGWIN)
1804
check_function_exists("_setmode" HAVE__SETMODE)
1805
endif()
1806
1807
if(AMIGA)
1808
check_symbol_exists("CloseSocket" "${CURL_INCLUDES}" HAVE_CLOSESOCKET_CAMEL) # sys/socket.h proto/bsdsocket.h
1809
endif()
1810
1811
if(NOT _ssl_enabled)
1812
check_symbol_exists("arc4random" "${CURL_INCLUDES};stdlib.h" HAVE_ARC4RANDOM)
1813
endif()
1814
1815
if(NOT MSVC)
1816
check_function_exists("snprintf" HAVE_SNPRINTF) # to match detection method in ./configure
1817
elseif(MSVC_VERSION GREATER_EQUAL 1900) # Earlier MSVC compilers had faulty snprintf implementations
1818
check_symbol_exists("snprintf" "stdio.h" HAVE_SNPRINTF) # snprintf may be a compatibility macro, not an exported function
1819
endif()
1820
if(APPLE)
1821
check_function_exists("mach_absolute_time" HAVE_MACH_ABSOLUTE_TIME)
1822
endif()
1823
if(NOT WIN32)
1824
check_symbol_exists("inet_ntop" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_NTOP) # arpa/inet.h netinet/in.h sys/socket.h
1825
check_symbol_exists("inet_pton" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_PTON) # arpa/inet.h netinet/in.h sys/socket.h
1826
endif()
1827
1828
check_symbol_exists("fsetxattr" "sys/xattr.h" HAVE_FSETXATTR)
1829
if(HAVE_FSETXATTR)
1830
curl_internal_test(HAVE_FSETXATTR_5)
1831
curl_internal_test(HAVE_FSETXATTR_6)
1832
endif()
1833
1834
cmake_push_check_state()
1835
if(NOT WIN32)
1836
list(APPEND CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h")
1837
check_type_size("sa_family_t" SIZEOF_SA_FAMILY_T)
1838
set(HAVE_SA_FAMILY_T ${HAVE_SIZEOF_SA_FAMILY_T})
1839
endif()
1840
cmake_pop_check_state()
1841
1842
# Do curl specific tests
1843
foreach(_curl_test IN ITEMS
1844
HAVE_FCNTL_O_NONBLOCK
1845
HAVE_IOCTLSOCKET
1846
HAVE_IOCTLSOCKET_CAMEL
1847
HAVE_IOCTLSOCKET_CAMEL_FIONBIO
1848
HAVE_IOCTLSOCKET_FIONBIO
1849
HAVE_IOCTL_FIONBIO
1850
HAVE_IOCTL_SIOCGIFADDR
1851
HAVE_SETSOCKOPT_SO_NONBLOCK
1852
HAVE_GETHOSTBYNAME_R_3
1853
HAVE_GETHOSTBYNAME_R_5
1854
HAVE_GETHOSTBYNAME_R_6
1855
HAVE_BOOL_T
1856
STDC_HEADERS
1857
HAVE_ATOMIC
1858
)
1859
curl_internal_test(${_curl_test})
1860
endforeach()
1861
1862
# Check for reentrant
1863
cmake_push_check_state()
1864
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_REENTRANT")
1865
foreach(_curl_test IN ITEMS
1866
HAVE_GETHOSTBYNAME_R_3
1867
HAVE_GETHOSTBYNAME_R_5
1868
HAVE_GETHOSTBYNAME_R_6)
1869
curl_internal_test(${_curl_test}_REENTRANT)
1870
if(NOT ${_curl_test} AND ${_curl_test}_REENTRANT)
1871
set(NEED_REENTRANT 1)
1872
endif()
1873
endforeach()
1874
cmake_pop_check_state()
1875
1876
if(NEED_REENTRANT)
1877
foreach(_curl_test IN ITEMS
1878
HAVE_GETHOSTBYNAME_R_3
1879
HAVE_GETHOSTBYNAME_R_5
1880
HAVE_GETHOSTBYNAME_R_6)
1881
set(${_curl_test} 0)
1882
if(${_curl_test}_REENTRANT)
1883
set(${_curl_test} 1)
1884
endif()
1885
endforeach()
1886
endif()
1887
1888
cmake_push_check_state()
1889
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_FILE_OFFSET_BITS=64")
1890
curl_internal_test(HAVE_FILE_OFFSET_BITS)
1891
cmake_pop_check_state()
1892
1893
cmake_push_check_state()
1894
if(HAVE_FILE_OFFSET_BITS)
1895
set(_FILE_OFFSET_BITS 64)
1896
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_FILE_OFFSET_BITS=64")
1897
endif()
1898
check_type_size("off_t" SIZEOF_OFF_T)
1899
1900
if(NOT WIN32)
1901
# fseeko may not exist with _FILE_OFFSET_BITS=64 but can exist with
1902
# _FILE_OFFSET_BITS unset or 32 (as in Android ARMv7 with NDK 26b and API level < 24)
1903
# so we need to test fseeko after testing for _FILE_OFFSET_BITS
1904
check_symbol_exists("fseeko" "${CURL_INCLUDES};stdio.h" HAVE_FSEEKO)
1905
1906
if(HAVE_FSEEKO)
1907
set(HAVE_DECL_FSEEKO 1)
1908
endif()
1909
endif()
1910
1911
# Include this header to get the type
1912
cmake_push_check_state()
1913
list(APPEND CMAKE_REQUIRED_INCLUDES "${PROJECT_SOURCE_DIR}/include")
1914
list(APPEND CMAKE_EXTRA_INCLUDE_FILES "curl/system.h")
1915
check_type_size("curl_off_t" SIZEOF_CURL_OFF_T)
1916
list(APPEND CMAKE_EXTRA_INCLUDE_FILES "curl/curl.h")
1917
check_type_size("curl_socket_t" SIZEOF_CURL_SOCKET_T)
1918
cmake_pop_check_state() # pop curl system headers
1919
cmake_pop_check_state() # pop -D_FILE_OFFSET_BITS=64
1920
1921
if(0) # XXX(cmake): not needed for build within cmake
1922
if(NOT WIN32 AND NOT CMAKE_CROSSCOMPILING)
1923
# On non-Windows and not cross-compiling, check for writable argv[]
1924
include(CheckCSourceRuns)
1925
check_c_source_runs("
1926
int main(int argc, char **argv)
1927
{
1928
(void)argc;
1929
argv[0][0] = ' ';
1930
return (argv[0][0] == ' ')?0:1;
1931
}" HAVE_WRITABLE_ARGV)
1932
endif()
1933
endif() # XXX(cmake): end
1934
1935
if(NOT CMAKE_CROSSCOMPILING)
1936
include(CheckCSourceRuns)
1937
check_c_source_runs("
1938
#include <time.h>
1939
int main(void) {
1940
time_t t = -1;
1941
return t < 0;
1942
}" HAVE_TIME_T_UNSIGNED)
1943
endif()
1944
1945
curl_internal_test(HAVE_GLIBC_STRERROR_R)
1946
curl_internal_test(HAVE_POSIX_STRERROR_R)
1947
1948
if(NOT WIN32)
1949
curl_internal_test(HAVE_CLOCK_GETTIME_MONOTONIC) # Check clock_gettime(CLOCK_MONOTONIC, x) support
1950
endif()
1951
1952
if(APPLE)
1953
curl_internal_test(HAVE_BUILTIN_AVAILABLE) # Check compiler support of __builtin_available()
1954
endif()
1955
1956
# Some other minor tests
1957
1958
if(_cmake_try_compile_target_type_save)
1959
set(CMAKE_TRY_COMPILE_TARGET_TYPE ${_cmake_try_compile_target_type_save})
1960
unset(_cmake_try_compile_target_type_save)
1961
endif()
1962
1963
include(CMake/OtherTests.cmake)
1964
1965
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "HAVE_CONFIG_H")
1966
1967
if(WIN32)
1968
list(APPEND CURL_NETWORK_AND_TIME_LIBS "ws2_32")
1969
if(NOT WINDOWS_STORE)
1970
list(APPEND CURL_NETWORK_AND_TIME_LIBS "iphlpapi")
1971
endif()
1972
list(APPEND CURL_LIBS "bcrypt")
1973
1974
# We use crypto functions that are not available for UWP apps
1975
if(NOT WINDOWS_STORE)
1976
set(USE_WIN32_CRYPTO ON)
1977
endif()
1978
1979
# Link required libraries for USE_WIN32_CRYPTO or USE_SCHANNEL
1980
if(USE_WIN32_CRYPTO OR USE_SCHANNEL)
1981
list(APPEND CURL_LIBS "advapi32" "crypt32")
1982
endif()
1983
if(USE_WINDOWS_SSPI)
1984
list(APPEND CURL_LIBS "secur32")
1985
endif()
1986
endif()
1987
1988
list(APPEND CURL_LIBS ${CURL_NETWORK_AND_TIME_LIBS})
1989
if(CURL_CODE_COVERAGE)
1990
list(APPEND CURL_LIBS ${CURL_COVERAGE_LIBS})
1991
endif()
1992
1993
if(0) # XXX(cmake): not needed for build within cmake
1994
# Hack to add some libraries to the end of the library list to make binutils ld
1995
# for GCC find symbols when linking statically. Necessary for libs detected via
1996
# CMake's built-in find modules, which CMake adds to the beginning of the lib
1997
# list on the linker command-line for some reason. This makes them appear
1998
# before dependencies detected via curl's custom Find modules, and breaks
1999
# linkers sensitive to lib order. There must be a better solution to this.
2000
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
2001
foreach(_lib IN ITEMS OpenSSL::Crypto ZLIB::ZLIB)
2002
if(TARGET "${_lib}")
2003
add_library(CURL::${_lib} INTERFACE IMPORTED)
2004
get_target_property(_libname "${_lib}" LOCATION)
2005
set_target_properties(${_lib} PROPERTIES INTERFACE_LINK_LIBRARIES "${_libname}")
2006
list(APPEND CURL_LIBS ${_lib})
2007
endif()
2008
endforeach()
2009
if(WIN32)
2010
add_library(CURL::win32_winsock INTERFACE IMPORTED)
2011
set_target_properties(CURL::win32_winsock PROPERTIES INTERFACE_LINK_LIBRARIES "ws2_32")
2012
list(APPEND CURL_LIBS CURL::win32_winsock)
2013
endif()
2014
endif()
2015
endif() # XXX(cmake): end
2016
2017
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") # MSVC but exclude clang-cl
2018
set_property(DIRECTORY APPEND PROPERTY COMPILE_OPTIONS "-MP") # Parallel compilation
2019
endif()
2020
2021
if(CURL_LTO)
2022
if(CMAKE_VERSION VERSION_LESS 3.9)
2023
message(FATAL_ERROR "LTO has been requested, but your cmake version ${CMAKE_VERSION} is to old. You need at least 3.9")
2024
endif()
2025
2026
cmake_policy(SET CMP0069 NEW)
2027
2028
include(CheckIPOSupported)
2029
check_ipo_supported(RESULT CURL_HAS_LTO OUTPUT _lto_error LANGUAGES C)
2030
if(CURL_HAS_LTO)
2031
message(STATUS "LTO supported and enabled")
2032
else()
2033
message(FATAL_ERROR "LTO has been requested, but the compiler does not support it\n${_lto_error}")
2034
endif()
2035
endif()
2036
2037
# Ugly (but functional) way to include "Makefile.inc" by transforming it
2038
# (= regenerate it).
2039
function(curl_transform_makefile_inc _input_file _output_file)
2040
file(READ ${_input_file} _makefile_inc_text)
2041
string(REPLACE "$(top_srcdir)" "\${PROJECT_SOURCE_DIR}" _makefile_inc_text ${_makefile_inc_text}) # cmake-lint: disable=W0106
2042
string(REPLACE "$(top_builddir)" "\${PROJECT_BINARY_DIR}" _makefile_inc_text ${_makefile_inc_text}) # cmake-lint: disable=W0106
2043
2044
string(REGEX REPLACE "\\\\\n" "!^!^!" _makefile_inc_text ${_makefile_inc_text})
2045
string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "set(\\1 \\2)" _makefile_inc_text ${_makefile_inc_text})
2046
string(REPLACE "!^!^!" "\n" _makefile_inc_text ${_makefile_inc_text})
2047
2048
# Replace $() with ${}
2049
string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" _makefile_inc_text ${_makefile_inc_text})
2050
# Replace @@ with ${}, even if that may not be read by CMake scripts.
2051
string(REGEX REPLACE "@([a-zA-Z_][a-zA-Z0-9_]*)@" "\${\\1}" _makefile_inc_text ${_makefile_inc_text})
2052
2053
file(WRITE ${_output_file} ${_makefile_inc_text})
2054
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${_input_file}")
2055
endfunction()
2056
2057
#-----------------------------------------------------------------------------
2058
# XXX(cmake): begin cmake-specific curl code
2059
add_subdirectory(lib)
2060
2061
add_executable(curltest curltest.c)
2062
target_link_libraries(curltest cmcurl)
2063
2064
if(BUILD_TESTING AND CMAKE_CURL_TEST_URL)
2065
add_test(curl curltest ${CMAKE_CURL_TEST_URL})
2066
endif()
2067
2068
install(FILES COPYING DESTINATION ${CMake_INSTALL_DOC_DIR}/cmcurl)
2069
2070
return() # The rest of this file is not needed for building within CMake.
2071
# XXX(cmake): end cmake-specific curl code
2072
#-----------------------------------------------------------------------------
2073
2074
include(GNUInstallDirs)
2075
2076
set(_install_cmake_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
2077
set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
2078
set(_generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated")
2079
set(_project_config "${_generated_dir}/${PROJECT_NAME}Config.cmake")
2080
set(_version_config "${_generated_dir}/${PROJECT_NAME}ConfigVersion.cmake")
2081
2082
option(BUILD_TESTING "Build tests" ON)
2083
if(BUILD_TESTING AND Perl_FOUND)
2084
set(CURL_BUILD_TESTING ON)
2085
else()
2086
set(CURL_BUILD_TESTING OFF)
2087
endif()
2088
2089
if(Perl_FOUND)
2090
set(CURL_MANPAGE "${PROJECT_BINARY_DIR}/docs/cmdline-opts/curl.1")
2091
set(CURL_ASCIIPAGE "${PROJECT_BINARY_DIR}/docs/cmdline-opts/curl.txt")
2092
add_subdirectory(docs)
2093
endif()
2094
2095
add_subdirectory(scripts) # for shell completions
2096
2097
add_subdirectory(lib)
2098
2099
if(BUILD_CURL_EXE)
2100
add_subdirectory(src)
2101
endif()
2102
2103
option(BUILD_EXAMPLES "Build libcurl examples" ON)
2104
if(BUILD_EXAMPLES)
2105
add_subdirectory(docs/examples)
2106
endif()
2107
2108
if(CURL_BUILD_TESTING)
2109
add_subdirectory(tests)
2110
endif()
2111
2112
# Helper to populate a list (_items) with a label when conditions
2113
# (the remaining args) are satisfied
2114
macro(curl_add_if _label)
2115
# Needs to be a macro to allow this indirection
2116
if(${ARGN})
2117
set(_items ${_items} "${_label}")
2118
endif()
2119
endmacro()
2120
2121
# NTLM support requires crypto functions from various SSL libs.
2122
# These conditions must match those in lib/curl_setup.h.
2123
if(NOT CURL_DISABLE_NTLM AND
2124
((USE_OPENSSL AND HAVE_DES_ECB_ENCRYPT) OR
2125
(USE_MBEDTLS AND HAVE_MBEDTLS_DES_CRYPT_ECB) OR
2126
USE_GNUTLS OR
2127
USE_WIN32_CRYPTO OR
2128
(USE_WOLFSSL AND HAVE_WOLFSSL_DES_ECB_ENCRYPT)))
2129
set(_use_curl_ntlm_core ON)
2130
endif()
2131
2132
# Clear list and try to detect available protocols
2133
set(_items "")
2134
curl_add_if("HTTP" NOT CURL_DISABLE_HTTP)
2135
curl_add_if("HTTPS" NOT CURL_DISABLE_HTTP AND _ssl_enabled)
2136
curl_add_if("FTP" NOT CURL_DISABLE_FTP)
2137
curl_add_if("FTPS" NOT CURL_DISABLE_FTP AND _ssl_enabled)
2138
curl_add_if("FILE" NOT CURL_DISABLE_FILE)
2139
curl_add_if("TELNET" NOT CURL_DISABLE_TELNET)
2140
curl_add_if("LDAP" NOT CURL_DISABLE_LDAP)
2141
# CURL_DISABLE_LDAP implies CURL_DISABLE_LDAPS
2142
curl_add_if("LDAPS" NOT CURL_DISABLE_LDAPS AND
2143
((USE_OPENLDAP AND _ssl_enabled) OR
2144
(NOT USE_OPENLDAP AND HAVE_LDAP_SSL)))
2145
curl_add_if("DICT" NOT CURL_DISABLE_DICT)
2146
curl_add_if("TFTP" NOT CURL_DISABLE_TFTP)
2147
curl_add_if("GOPHER" NOT CURL_DISABLE_GOPHER)
2148
curl_add_if("GOPHERS" NOT CURL_DISABLE_GOPHER AND _ssl_enabled)
2149
curl_add_if("POP3" NOT CURL_DISABLE_POP3)
2150
curl_add_if("POP3S" NOT CURL_DISABLE_POP3 AND _ssl_enabled)
2151
curl_add_if("IMAP" NOT CURL_DISABLE_IMAP)
2152
curl_add_if("IMAPS" NOT CURL_DISABLE_IMAP AND _ssl_enabled)
2153
curl_add_if("SMB" NOT CURL_DISABLE_SMB AND
2154
_use_curl_ntlm_core AND (SIZEOF_CURL_OFF_T GREATER 4))
2155
curl_add_if("SMBS" NOT CURL_DISABLE_SMB AND _ssl_enabled AND
2156
_use_curl_ntlm_core AND (SIZEOF_CURL_OFF_T GREATER 4))
2157
curl_add_if("SMTP" NOT CURL_DISABLE_SMTP)
2158
curl_add_if("SMTPS" NOT CURL_DISABLE_SMTP AND _ssl_enabled)
2159
curl_add_if("SCP" USE_LIBSSH2 OR USE_LIBSSH)
2160
curl_add_if("SFTP" USE_LIBSSH2 OR USE_LIBSSH)
2161
curl_add_if("IPFS" NOT CURL_DISABLE_IPFS)
2162
curl_add_if("IPNS" NOT CURL_DISABLE_IPFS)
2163
curl_add_if("RTSP" NOT CURL_DISABLE_RTSP)
2164
curl_add_if("RTMP" USE_LIBRTMP)
2165
curl_add_if("MQTT" NOT CURL_DISABLE_MQTT)
2166
curl_add_if("WS" NOT CURL_DISABLE_WEBSOCKETS)
2167
curl_add_if("WSS" NOT CURL_DISABLE_WEBSOCKETS AND _ssl_enabled)
2168
if(_items)
2169
list(SORT _items)
2170
endif()
2171
set(CURL_SUPPORTED_PROTOCOLS_LIST "${_items}")
2172
string(REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}")
2173
string(TOLOWER "${SUPPORT_PROTOCOLS}" _support_protocols_lower)
2174
message(STATUS "Protocols: ${_support_protocols_lower}")
2175
2176
# Clear list and try to detect available features
2177
set(_items "")
2178
curl_add_if("SSL" _ssl_enabled)
2179
curl_add_if("IPv6" USE_IPV6)
2180
curl_add_if("UnixSockets" USE_UNIX_SOCKETS)
2181
curl_add_if("libz" HAVE_LIBZ)
2182
curl_add_if("brotli" HAVE_BROTLI)
2183
curl_add_if("gsasl" USE_GSASL)
2184
curl_add_if("zstd" HAVE_ZSTD)
2185
curl_add_if("AsynchDNS" USE_ARES OR USE_THREADS_POSIX OR USE_THREADS_WIN32)
2186
curl_add_if("asyn-rr" USE_ARES AND ENABLE_THREADED_RESOLVER AND USE_HTTPSRR)
2187
curl_add_if("IDN" (HAVE_LIBIDN2 AND HAVE_IDN2_H) OR
2188
USE_WIN32_IDN OR
2189
USE_APPLE_IDN)
2190
curl_add_if("Largefile" (SIZEOF_CURL_OFF_T GREATER 4) AND ((SIZEOF_OFF_T GREATER 4) OR WIN32))
2191
curl_add_if("SSPI" USE_WINDOWS_SSPI)
2192
curl_add_if("GSS-API" HAVE_GSSAPI)
2193
curl_add_if("alt-svc" NOT CURL_DISABLE_ALTSVC)
2194
curl_add_if("HSTS" NOT CURL_DISABLE_HSTS)
2195
curl_add_if("SPNEGO" NOT CURL_DISABLE_NEGOTIATE_AUTH AND
2196
(HAVE_GSSAPI OR USE_WINDOWS_SSPI))
2197
curl_add_if("Kerberos" NOT CURL_DISABLE_KERBEROS_AUTH AND
2198
(HAVE_GSSAPI OR USE_WINDOWS_SSPI))
2199
curl_add_if("NTLM" NOT CURL_DISABLE_NTLM AND
2200
(_use_curl_ntlm_core OR USE_WINDOWS_SSPI))
2201
curl_add_if("TLS-SRP" USE_TLS_SRP)
2202
curl_add_if("HTTP2" USE_NGHTTP2)
2203
curl_add_if("HTTP3" USE_NGTCP2 OR USE_QUICHE OR USE_OPENSSL_QUIC)
2204
curl_add_if("MultiSSL" CURL_WITH_MULTI_SSL)
2205
curl_add_if("HTTPS-proxy" NOT CURL_DISABLE_PROXY AND _ssl_enabled AND (USE_OPENSSL OR USE_GNUTLS
2206
OR USE_SCHANNEL OR USE_RUSTLS OR USE_MBEDTLS OR
2207
(USE_WOLFSSL AND HAVE_WOLFSSL_BIO_NEW)))
2208
curl_add_if("Unicode" ENABLE_UNICODE)
2209
curl_add_if("threadsafe" HAVE_ATOMIC OR
2210
(USE_THREADS_POSIX AND HAVE_PTHREAD_H) OR
2211
(WIN32 AND HAVE_WIN32_WINNT GREATER_EQUAL 0x0600))
2212
curl_add_if("Debug" ENABLE_DEBUG)
2213
curl_add_if("TrackMemory" ENABLE_CURLDEBUG)
2214
curl_add_if("ECH" _ssl_enabled AND HAVE_ECH)
2215
curl_add_if("HTTPSRR" _ssl_enabled AND USE_HTTPSRR)
2216
curl_add_if("PSL" USE_LIBPSL)
2217
curl_add_if("CAcert" CURL_CA_EMBED_SET)
2218
curl_add_if("SSLS-EXPORT" _ssl_enabled AND USE_SSLS_EXPORT)
2219
curl_add_if("AppleSecTrust" USE_APPLE_SECTRUST AND _ssl_enabled AND (USE_OPENSSL OR USE_GNUTLS))
2220
if(_items)
2221
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
2222
list(SORT _items CASE INSENSITIVE)
2223
else()
2224
list(SORT _items)
2225
endif()
2226
endif()
2227
set(CURL_SUPPORTED_FEATURES_LIST "${_items}")
2228
string(REPLACE ";" " " SUPPORT_FEATURES "${_items}")
2229
message(STATUS "Features: ${SUPPORT_FEATURES}")
2230
2231
# Clear list and collect SSL backends
2232
set(_items "")
2233
curl_add_if("Schannel" _ssl_enabled AND USE_SCHANNEL)
2234
curl_add_if("${_openssl}" _ssl_enabled AND USE_OPENSSL)
2235
curl_add_if("mbedTLS" _ssl_enabled AND USE_MBEDTLS)
2236
curl_add_if("wolfSSL" _ssl_enabled AND USE_WOLFSSL)
2237
curl_add_if("GnuTLS" _ssl_enabled AND USE_GNUTLS)
2238
curl_add_if("Rustls" _ssl_enabled AND USE_RUSTLS)
2239
2240
if(_items)
2241
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
2242
list(SORT _items CASE INSENSITIVE)
2243
else()
2244
list(SORT _items)
2245
endif()
2246
endif()
2247
string(REPLACE ";" " " SSL_BACKENDS "${_items}")
2248
message(STATUS "Enabled SSL backends: ${SSL_BACKENDS}")
2249
if(CURL_DEFAULT_SSL_BACKEND)
2250
message(STATUS "Default SSL backend: ${CURL_DEFAULT_SSL_BACKEND}")
2251
endif()
2252
2253
if(NOT CURL_DISABLE_INSTALL)
2254
2255
# curl-config needs the following options to be set.
2256
set(CC "${CMAKE_C_COMPILER}")
2257
set(CONFIGURE_OPTIONS "")
2258
set(CURLVERSION "${_curl_version}")
2259
set(VERSIONNUM "${_curl_version_num}")
2260
set(prefix "${CMAKE_INSTALL_PREFIX}")
2261
set(exec_prefix "\${prefix}")
2262
if(IS_ABSOLUTE ${CMAKE_INSTALL_INCLUDEDIR})
2263
set(includedir "${CMAKE_INSTALL_INCLUDEDIR}")
2264
else()
2265
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
2266
endif()
2267
if(IS_ABSOLUTE ${CMAKE_INSTALL_LIBDIR})
2268
set(libdir "${CMAKE_INSTALL_LIBDIR}")
2269
else()
2270
set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
2271
endif()
2272
# "a" (Linux) or "lib" (Windows)
2273
string(REPLACE "." "" libext "${CMAKE_STATIC_LIBRARY_SUFFIX}")
2274
2275
set(_ldflags "")
2276
set(LIBCURL_PC_LIBS_PRIVATE "")
2277
2278
# Filter CMAKE_SHARED_LINKER_FLAGS for libs and libpaths
2279
string(STRIP "${CMAKE_SHARED_LINKER_FLAGS}" _custom_ldflags)
2280
string(REGEX REPLACE " +-([^ \\t;]*)" ";-\\1" _custom_ldflags "${_custom_ldflags}")
2281
2282
set(_custom_libs "")
2283
set(_custom_libdirs "")
2284
foreach(_flag IN LISTS _custom_ldflags)
2285
if(_flag MATCHES "^-l")
2286
string(REGEX REPLACE "^-l" "" _flag "${_flag}")
2287
list(APPEND _custom_libs "${_flag}")
2288
elseif(_flag MATCHES "^-framework|^-F")
2289
list(APPEND _custom_libs "${_flag}")
2290
elseif(_flag MATCHES "^-L")
2291
string(REGEX REPLACE "^-L" "" _flag "${_flag}")
2292
list(APPEND _custom_libdirs "${_flag}")
2293
elseif(_flag MATCHES "^--library-path=")
2294
string(REGEX REPLACE "^--library-path=" "" _flag "${_flag}")
2295
list(APPEND _custom_libdirs "${_flag}")
2296
endif()
2297
endforeach()
2298
2299
# Avoid getting unnecessary -L options for known system directories.
2300
set(_sys_libdirs "${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}")
2301
foreach(_libdir IN LISTS CMAKE_SYSTEM_PREFIX_PATH)
2302
if(_libdir MATCHES "/$")
2303
string(APPEND _libdir "lib")
2304
else()
2305
string(APPEND _libdir "/lib")
2306
endif()
2307
if(IS_DIRECTORY "${_libdir}")
2308
list(APPEND _sys_libdirs "${_libdir}")
2309
endif()
2310
if(DEFINED CMAKE_LIBRARY_ARCHITECTURE)
2311
string(APPEND _libdir "/${CMAKE_LIBRARY_ARCHITECTURE}")
2312
if(IS_DIRECTORY "${_libdir}")
2313
list(APPEND _sys_libdirs "${_libdir}")
2314
endif()
2315
endif()
2316
endforeach()
2317
2318
set(_implicit_libs "")
2319
if(NOT MINGW AND NOT UNIX)
2320
set(_implicit_libs "${CMAKE_C_IMPLICIT_LINK_LIBRARIES}")
2321
endif()
2322
2323
set(_explicit_libdirs "")
2324
set(LIBCURL_PC_REQUIRES_PRIVATE "")
2325
set(LIBCURL_PC_LIBS_PRIVATE_LIST "")
2326
foreach(_lib IN LISTS CURL_LIBS _custom_libs _implicit_libs)
2327
if(TARGET "${_lib}")
2328
set(_explicit_libs "")
2329
get_target_property(_imported "${_lib}" IMPORTED)
2330
if(NOT _imported)
2331
# Reading the LOCATION property on non-imported target will error out.
2332
# Assume the user will not need this information in the .pc file.
2333
continue()
2334
endif()
2335
if(_lib MATCHES "CURL::")
2336
# This is empty for 'CURL::*' targets and safe to ignore.
2337
# Explicitly skip this query to avoid CMake v3.18 and older erroring out.
2338
set(_libname "")
2339
else()
2340
get_target_property(_libname "${_lib}" LOCATION)
2341
endif()
2342
if(_libname)
2343
list(APPEND _explicit_libs "${_libname}")
2344
else()
2345
get_target_property(_libs "${_lib}" INTERFACE_LINK_LIBRARIES)
2346
if(_libs)
2347
list(APPEND _explicit_libs "${_libs}")
2348
endif()
2349
get_target_property(_libdirs "${_lib}" INTERFACE_LINK_DIRECTORIES)
2350
if(_libdirs)
2351
list(APPEND _explicit_libdirs "${_libdirs}")
2352
endif()
2353
endif()
2354
if(NOT _libname AND NOT _libs AND NOT _libdirs)
2355
message(WARNING "Bad lib in library list: ${_lib}")
2356
endif()
2357
get_target_property(_modules "${_lib}" INTERFACE_LIBCURL_PC_MODULES)
2358
if(_modules)
2359
list(APPEND LIBCURL_PC_REQUIRES_PRIVATE "${_modules}")
2360
endif()
2361
2362
foreach(_lib IN LISTS _explicit_libs)
2363
if(_lib MATCHES "/")
2364
# This gets a bit more complex, because we want to specify the
2365
# directory separately, and only once per directory
2366
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.20)
2367
cmake_path(GET _lib PARENT_PATH _libdir)
2368
cmake_path(GET _lib STEM _libname)
2369
else()
2370
get_filename_component(_libdir "${_lib}" DIRECTORY)
2371
get_filename_component(_libname "${_lib}" NAME_WE)
2372
endif()
2373
if(_libname MATCHES "^lib")
2374
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.20)
2375
cmake_path(SET _libdir NORMALIZE "${_libdir}")
2376
endif()
2377
list(FIND _sys_libdirs "${_libdir}" _libdir_index)
2378
if(_libdir_index LESS 0)
2379
list(APPEND _ldflags "-L${_libdir}")
2380
endif()
2381
string(REGEX REPLACE "^lib" "" _libname "${_libname}")
2382
list(APPEND LIBCURL_PC_LIBS_PRIVATE "-l${_libname}")
2383
list(APPEND LIBCURL_PC_LIBS_PRIVATE_LIST "${_lib}")
2384
else()
2385
list(APPEND LIBCURL_PC_LIBS_PRIVATE "${_lib}")
2386
list(APPEND LIBCURL_PC_LIBS_PRIVATE_LIST "${_lib}")
2387
endif()
2388
else()
2389
list(APPEND LIBCURL_PC_LIBS_PRIVATE "-l${_lib}")
2390
list(APPEND LIBCURL_PC_LIBS_PRIVATE_LIST "${_lib}")
2391
endif()
2392
endforeach()
2393
elseif(_lib MATCHES "^-") # '-framework <name>'
2394
list(APPEND _ldflags "${_lib}")
2395
list(APPEND LIBCURL_PC_LIBS_PRIVATE_LIST "${_lib}")
2396
else()
2397
list(APPEND LIBCURL_PC_LIBS_PRIVATE "-l${_lib}")
2398
list(APPEND LIBCURL_PC_LIBS_PRIVATE_LIST "${_lib}")
2399
endif()
2400
endforeach()
2401
2402
foreach(_libdir IN LISTS _custom_libdirs _explicit_libdirs)
2403
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.20)
2404
cmake_path(SET _libdir NORMALIZE "${_libdir}")
2405
endif()
2406
list(FIND _sys_libdirs "${_libdir}" _libdir_index)
2407
if(_libdir_index LESS 0)
2408
list(APPEND _ldflags "-L${_libdir}")
2409
endif()
2410
endforeach()
2411
2412
list(REMOVE_DUPLICATES _ldflags)
2413
2414
if(LIBCURL_PC_REQUIRES_PRIVATE)
2415
list(REMOVE_DUPLICATES LIBCURL_PC_REQUIRES_PRIVATE)
2416
string(REPLACE ";" "," LIBCURL_PC_REQUIRES_PRIVATE "${LIBCURL_PC_REQUIRES_PRIVATE}")
2417
endif()
2418
if(LIBCURL_PC_LIBS_PRIVATE)
2419
string(REPLACE ";" " " LIBCURL_PC_LIBS_PRIVATE "${LIBCURL_PC_LIBS_PRIVATE}")
2420
endif()
2421
if(_ldflags)
2422
list(REMOVE_DUPLICATES _ldflags)
2423
string(REPLACE ";" " " _ldflags "${_ldflags}")
2424
set(LIBCURL_PC_LDFLAGS_PRIVATE "${_ldflags}")
2425
string(STRIP "${LIBCURL_PC_LDFLAGS_PRIVATE}" LIBCURL_PC_LDFLAGS_PRIVATE)
2426
else()
2427
set(LIBCURL_PC_LDFLAGS_PRIVATE "")
2428
endif()
2429
set(LIBCURL_PC_CFLAGS_PRIVATE "-DCURL_STATICLIB")
2430
2431
# Merge pkg-config private fields into public ones when static-only
2432
if(BUILD_SHARED_LIBS)
2433
set(ENABLE_SHARED "yes")
2434
set(LIBCURL_PC_REQUIRES "")
2435
set(LIBCURL_PC_LIBS "")
2436
set(LIBCURL_PC_CFLAGS "")
2437
else()
2438
set(ENABLE_SHARED "no")
2439
set(LIBCURL_PC_REQUIRES "${LIBCURL_PC_REQUIRES_PRIVATE}")
2440
set(LIBCURL_PC_LIBS "${LIBCURL_PC_LIBS_PRIVATE}")
2441
set(LIBCURL_PC_CFLAGS "${LIBCURL_PC_CFLAGS_PRIVATE}")
2442
endif()
2443
if(BUILD_STATIC_LIBS)
2444
set(ENABLE_STATIC "yes")
2445
else()
2446
set(ENABLE_STATIC "no")
2447
endif()
2448
2449
# Generate a "curl-config" matching this config.
2450
# Consumed variables:
2451
# CC
2452
# CONFIGURE_OPTIONS
2453
# CURLVERSION
2454
# CURL_CA_BUNDLE
2455
# ENABLE_SHARED
2456
# ENABLE_STATIC
2457
# exec_prefix
2458
# includedir
2459
# LIBCURL_PC_CFLAGS
2460
# LIBCURL_PC_LDFLAGS_PRIVATE
2461
# LIBCURL_PC_LIBS_PRIVATE
2462
# libdir
2463
# libext
2464
# prefix
2465
# SSL_BACKENDS
2466
# SUPPORT_FEATURES
2467
# SUPPORT_PROTOCOLS
2468
# VERSIONNUM
2469
configure_file(
2470
"${PROJECT_SOURCE_DIR}/curl-config.in"
2471
"${PROJECT_BINARY_DIR}/curl-config" @ONLY)
2472
install(FILES "${PROJECT_BINARY_DIR}/curl-config"
2473
DESTINATION ${CMAKE_INSTALL_BINDIR}
2474
PERMISSIONS
2475
OWNER_READ OWNER_WRITE OWNER_EXECUTE
2476
GROUP_READ GROUP_EXECUTE
2477
WORLD_READ WORLD_EXECUTE)
2478
2479
# Generate a pkg-config file matching this config.
2480
# Consumed variables:
2481
# CURLVERSION
2482
# exec_prefix
2483
# includedir
2484
# LIBCURL_PC_CFLAGS
2485
# LIBCURL_PC_CFLAGS_PRIVATE
2486
# LIBCURL_PC_LDFLAGS_PRIVATE
2487
# LIBCURL_PC_LIBS
2488
# LIBCURL_PC_LIBS_PRIVATE
2489
# LIBCURL_PC_REQUIRES
2490
# LIBCURL_PC_REQUIRES_PRIVATE
2491
# libdir
2492
# prefix
2493
# SUPPORT_FEATURES
2494
# SUPPORT_PROTOCOLS
2495
# Documentation:
2496
# https://people.freedesktop.org/~dbn/pkg-config-guide.html
2497
# https://manpages.debian.org/unstable/pkgconf/pkg-config.1.en.html
2498
# https://manpages.debian.org/unstable/pkg-config/pkg-config.1.en.html
2499
# https://www.msys2.org/docs/pkgconfig/
2500
configure_file(
2501
"${PROJECT_SOURCE_DIR}/libcurl.pc.in"
2502
"${PROJECT_BINARY_DIR}/libcurl.pc" @ONLY)
2503
install(FILES "${PROJECT_BINARY_DIR}/libcurl.pc"
2504
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
2505
2506
# Install headers
2507
install(DIRECTORY "${PROJECT_SOURCE_DIR}/include/curl"
2508
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
2509
FILES_MATCHING PATTERN "*.h")
2510
2511
include(CMakePackageConfigHelpers)
2512
write_basic_package_version_file(
2513
"${_version_config}"
2514
VERSION ${_curl_version}
2515
COMPATIBILITY SameMajorVersion)
2516
file(READ "${_version_config}" _generated_version_config)
2517
file(WRITE "${_version_config}" "
2518
if(NOT PACKAGE_FIND_VERSION_RANGE AND PACKAGE_FIND_VERSION_MAJOR STREQUAL \"7\")
2519
# Version 8 satisfies version 7... requirements
2520
set(PACKAGE_FIND_VERSION_MAJOR 8)
2521
set(PACKAGE_FIND_VERSION_COUNT 1)
2522
endif()
2523
${_generated_version_config}")
2524
2525
# Consumed custom variables:
2526
# CMAKE_MINIMUM_REQUIRED_VERSION
2527
# CURLVERSION
2528
# LIBCURL_PC_LIBS_PRIVATE_LIST
2529
# LIB_NAME
2530
# LIB_SELECTED
2531
# LIB_STATIC
2532
# TARGETS_EXPORT_NAME
2533
# CURL_SUPPORTED_FEATURES_LIST
2534
# CURL_SUPPORTED_PROTOCOLS_LIST
2535
# HAVE_BROTLI
2536
# HAVE_GSSAPI
2537
# HAVE_LIBIDN2
2538
# HAVE_LIBZ ZLIB_VERSION_MAJOR
2539
# HAVE_ZSTD
2540
# USE_ARES
2541
# USE_BACKTRACE
2542
# USE_GNUTLS
2543
# USE_GSASL
2544
# USE_LIBPSL
2545
# USE_LIBRTMP
2546
# USE_LIBSSH
2547
# USE_LIBSSH2
2548
# USE_LIBUV
2549
# USE_MBEDTLS
2550
# USE_NGHTTP2
2551
# USE_NGHTTP3
2552
# USE_NGTCP2
2553
# USE_OPENSSL OPENSSL_VERSION_MAJOR
2554
# USE_QUICHE
2555
# USE_RUSTLS
2556
# USE_WIN32_LDAP CURL_DISABLE_LDAP
2557
# USE_WOLFSSL
2558
configure_package_config_file("CMake/curl-config.in.cmake"
2559
"${_project_config}"
2560
INSTALL_DESTINATION ${_install_cmake_dir}
2561
PATH_VARS CMAKE_INSTALL_INCLUDEDIR)
2562
2563
if(CURL_ENABLE_EXPORT_TARGET)
2564
install(EXPORT "${TARGETS_EXPORT_NAME}"
2565
NAMESPACE "${PROJECT_NAME}::"
2566
DESTINATION ${_install_cmake_dir})
2567
endif()
2568
2569
install(
2570
FILES
2571
${_version_config}
2572
${_project_config}
2573
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindBrotli.cmake"
2574
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindCares.cmake"
2575
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindGSS.cmake"
2576
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindGnuTLS.cmake"
2577
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindLDAP.cmake"
2578
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindLibbacktrace.cmake"
2579
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindLibgsasl.cmake"
2580
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindLibidn2.cmake"
2581
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindLibpsl.cmake"
2582
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindLibrtmp.cmake"
2583
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindLibssh.cmake"
2584
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindLibssh2.cmake"
2585
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindLibuv.cmake"
2586
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindMbedTLS.cmake"
2587
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindNGHTTP2.cmake"
2588
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindNGHTTP3.cmake"
2589
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindNGTCP2.cmake"
2590
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindNettle.cmake"
2591
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindQuiche.cmake"
2592
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindRustls.cmake"
2593
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindWolfSSL.cmake"
2594
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/FindZstd.cmake"
2595
DESTINATION ${_install_cmake_dir})
2596
2597
if(NOT TARGET curl_uninstall)
2598
configure_file(
2599
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/cmake_uninstall.in.cmake"
2600
"${CMAKE_CURRENT_BINARY_DIR}/CMake/cmake_uninstall.cmake"
2601
@ONLY)
2602
2603
add_custom_target(curl_uninstall
2604
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/CMake/cmake_uninstall.cmake")
2605
endif()
2606
2607
install(FILES "${PROJECT_SOURCE_DIR}/scripts/wcurl"
2608
DESTINATION ${CMAKE_INSTALL_BINDIR}
2609
PERMISSIONS
2610
OWNER_READ OWNER_WRITE OWNER_EXECUTE
2611
GROUP_READ GROUP_EXECUTE
2612
WORLD_READ WORLD_EXECUTE)
2613
2614
# The `-DEV` part is important
2615
string(REGEX REPLACE "([0-9]+\.[0-9]+)\.([0-9]+.*)" "\\2" CPACK_PACKAGE_VERSION_PATCH "${_curl_version}")
2616
set(CPACK_GENERATOR "TGZ")
2617
include(CPack)
2618
endif()
2619
2620
# Save build info for test runner to pick up and log
2621
set(_cmake_sysroot "")
2622
if(CMAKE_OSX_SYSROOT)
2623
set(_cmake_sysroot ${CMAKE_OSX_SYSROOT})
2624
elseif(CMAKE_SYSROOT)
2625
set(_cmake_sysroot ${CMAKE_SYSROOT})
2626
endif()
2627
set(_buildinfo "\
2628
buildinfo.configure.tool: cmake
2629
buildinfo.configure.command: ${CMAKE_COMMAND}
2630
buildinfo.configure.version: ${CMAKE_VERSION}
2631
buildinfo.configure.args:${_cmake_args}
2632
buildinfo.configure.generator: ${CMAKE_GENERATOR}
2633
buildinfo.configure.make: ${CMAKE_MAKE_PROGRAM}
2634
buildinfo.host.cpu: ${CMAKE_HOST_SYSTEM_PROCESSOR}
2635
buildinfo.host.os: ${CMAKE_HOST_SYSTEM_NAME}
2636
buildinfo.target.cpu: ${CMAKE_SYSTEM_PROCESSOR}
2637
buildinfo.target.os: ${CMAKE_SYSTEM_NAME}
2638
buildinfo.target.flags:${_target_flags}
2639
buildinfo.compiler: ${CMAKE_C_COMPILER_ID}
2640
buildinfo.compiler.version: ${CMAKE_C_COMPILER_VERSION}
2641
buildinfo.sysroot: ${_cmake_sysroot}
2642
")
2643
file(WRITE "${PROJECT_BINARY_DIR}/buildinfo.txt" "# This is a generated file. Do not edit.\n${_buildinfo}")
2644
if(NOT "$ENV{CURL_BUILDINFO}$ENV{CURL_CI}$ENV{CI}" STREQUAL "")
2645
message(STATUS "\n${_buildinfo}")
2646
endif()
2647
2648