1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.
#[=======================================================================[.rst:
FindCURL
--------
Finds the native curl installation (include directories and libraries) for
transferring data with URLS.
.. versionadded:: 3.17
If curl is built using its CMake-based build system, it will provide its own
CMake Package Configuration file (``CURLConfig.cmake``) for use with the
:command:`find_package` command in *config mode*. By default, this module
searches for this file and, if found, returns the results without further
action. If the upstream configuration file is not found, this module falls
back to *module mode* and searches standard locations.
.. versionadded:: 3.13
Debug and Release library variants are found separately.
Components
^^^^^^^^^^
.. versionadded:: 3.14
This module supports optional components to detect the protocols and features
available in the installed curl (these can vary based on the curl version)::
Protocols: DICT FILE FTP FTPS GOPHER GOPHERS HTTP HTTPS IMAP IMAPS IPFS IPNS
LDAP LDAPS MQTT POP3 POP3S RTMP RTMPS RTSP SCP SFTP SMB SMBS SMTP
SMTPS TELNET TFTP WS WSS
Features: alt-svc asyn-rr AsynchDNS brotli CAcert Debug ECH gsasl GSS-API
HSTS HTTP2 HTTP3 HTTPS-proxy HTTPSRR IDN IPv6 Kerberos Largefile
libz MultiSSL NTLM NTLM_WB PSL SPNEGO SSL SSLS-EXPORT SSPI
threadsafe TLS-SRP TrackMemory Unicode UnixSockets zstd
Components can be specified with the :command:`find_package` command as required
for curl to be considered found:
.. code-block:: cmake
find_package(CURL [COMPONENTS <protocols>... <features>...])
Or to check for them optionally, allowing conditional handling in the code:
.. code-block:: cmake
find_package(CURL [OPTIONAL_COMPONENTS <protocols>... <features>...])
Refer to the curl documentation for more information on supported protocols and
features. Component names are case-sensitive and follow the upstream curl
naming conventions.
Imported Targets
^^^^^^^^^^^^^^^^
This module provides the following :ref:`Imported Targets`:
``CURL::libcurl``
.. versionadded:: 3.12
Target encapsulating the curl usage requirements, available if curl is found.
Result Variables
^^^^^^^^^^^^^^^^
This module defines the following variables:
``CURL_FOUND``
Boolean indicating whether the (requested version of) curl and all required
components are found.
``CURL_VERSION``
.. versionadded:: 4.0
The version of curl found. This supersedes ``CURL_VERSION_STRING``.
``CURL_<component>_FOUND``
.. versionadded:: 3.14
Boolean indicating whether the specified component (curl protocol or feature)
is found.
``CURL_INCLUDE_DIRS``
Include directories containing the ``curl/curl.h`` and other headers needed to
use curl.
.. note::
When curl is found via *config mode*, this variable is available only with
curl version 8.9 or newer.
``CURL_LIBRARIES``
List of libraries needed to link against to use curl.
.. note::
When curl is found via *module mode*, this is a list of library file paths.
In *config mode*, this variable is available only with curl version 8.9 or
newer and contains a list of imported targets.
Hints
^^^^^
This module accepts the following variables:
``CURL_NO_CURL_CMAKE``
.. versionadded:: 3.17
Set this variable to ``TRUE`` to disable searching for curl via *config mode*.
``CURL_USE_STATIC_LIBS``
.. versionadded:: 3.28
Set this variable to ``TRUE`` to use static libraries. This is meaningful
only when curl is not found via *config mode*.
Deprecated Variables
^^^^^^^^^^^^^^^^^^^^
The following variables are provided for backward compatibility:
``CURL_VERSION_STRING``
.. deprecated:: 4.0
Superseded by ``CURL_VERSION``.
The version of curl found.
Examples
^^^^^^^^
Finding the curl library and specifying the required minimum version:
.. code-block:: cmake
find_package(CURL 7.61.0)
Finding the curl library and linking it to a project target:
.. code-block:: cmake
find_package(CURL)
target_link_libraries(project_target PRIVATE CURL::libcurl)
Using components to check if the found curl supports specific protocols or
features:
.. code-block:: cmake
find_package(CURL OPTIONAL_COMPONENTS HTTPS SSL)
if(CURL_HTTPS_FOUND)
# curl supports the HTTPS protocol
endif()
if(CURL_SSL_FOUND)
# curl has SSL feature enabled
endif()
#]=======================================================================]
cmake_policy(PUSH)
cmake_policy(SET CMP0159 NEW) # file(STRINGS) with REGEX updates CMAKE_MATCH_<n>
include(FindPackageHandleStandardArgs)
if(NOT CURL_NO_CURL_CMAKE)
# do a find package call to specifically look for the CMake version
# of curl
find_package(CURL QUIET NO_MODULE)
mark_as_advanced(CURL_DIR)
# if we found the CURL cmake package then we are done, and
# can print what we found and return.
if(CURL_FOUND)
find_package_handle_standard_args(CURL HANDLE_COMPONENTS CONFIG_MODE)
# The upstream curl package sets CURL_VERSION, not CURL_VERSION_STRING.
set(CURL_VERSION_STRING "${CURL_VERSION}")
cmake_policy(POP)
return()
endif()
endif()
find_package(PkgConfig QUIET)
if(PKG_CONFIG_FOUND)
pkg_check_modules(PC_CURL QUIET libcurl)
if(PC_CURL_FOUND)
pkg_get_variable(CURL_SUPPORTED_PROTOCOLS_STRING libcurl supported_protocols)
string(REPLACE " " ";" CURL_SUPPORTED_PROTOCOLS "${CURL_SUPPORTED_PROTOCOLS_STRING}")
pkg_get_variable(CURL_SUPPORTED_FEATURES_STRING libcurl supported_features)
string(REPLACE " " ";" CURL_SUPPORTED_FEATURES "${CURL_SUPPORTED_FEATURES_STRING}")
endif()
endif()
# Look for the header file.
find_path(CURL_INCLUDE_DIR
NAMES curl/curl.h
HINTS ${PC_CURL_INCLUDE_DIRS})
mark_as_advanced(CURL_INCLUDE_DIR)
if(NOT CURL_LIBRARY)
# Look for the library (sorted from most current/relevant entry to least).
find_library(CURL_LIBRARY_RELEASE NAMES
curl
# Windows MSVC prebuilts:
curllib
libcurl_imp
curllib_static
# Windows older "Win32 - MSVC" prebuilts (libcurl.lib, e.g. libcurl-7.15.5-win32-msvc.zip):
libcurl
# Some Windows prebuilt versions distribute `libcurl_a.lib` instead of `libcurl.lib`
libcurl_a
NAMES_PER_DIR
HINTS ${PC_CURL_LIBRARY_DIRS}
)
mark_as_advanced(CURL_LIBRARY_RELEASE)
find_library(CURL_LIBRARY_DEBUG NAMES
# Windows MSVC CMake builds in debug configuration on vcpkg:
libcurl-d_imp
libcurl-d
NAMES_PER_DIR
HINTS ${PC_CURL_LIBRARY_DIRS}
)
mark_as_advanced(CURL_LIBRARY_DEBUG)
include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
select_library_configurations(CURL)
endif()
if(CURL_INCLUDE_DIR)
foreach(_curl_version_header curlver.h curl.h)
if(EXISTS "${CURL_INCLUDE_DIR}/curl/${_curl_version_header}")
file(STRINGS "${CURL_INCLUDE_DIR}/curl/${_curl_version_header}" curl_version_str REGEX "^#define[\t ]+LIBCURL_VERSION[\t ]+\".*\"")
string(REGEX REPLACE "^#define[\t ]+LIBCURL_VERSION[\t ]+\"([^\"]*)\".*" "\\1" CURL_VERSION "${curl_version_str}")
set(CURL_VERSION_STRING "${CURL_VERSION}")
unset(curl_version_str)
break()
endif()
endforeach()
endif()
if(CURL_FIND_COMPONENTS)
foreach(component IN LISTS CURL_FIND_COMPONENTS)
set(CURL_${component}_FOUND FALSE)
endforeach()
if(NOT PC_CURL_FOUND)
find_program(CURL_CONFIG_EXECUTABLE NAMES curl-config)
if(CURL_CONFIG_EXECUTABLE)
execute_process(COMMAND ${CURL_CONFIG_EXECUTABLE} --version
OUTPUT_VARIABLE CURL_CONFIG_VERSION_STRING
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${CURL_CONFIG_EXECUTABLE} --feature
OUTPUT_VARIABLE CURL_CONFIG_FEATURES_STRING
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\n" ";" CURL_SUPPORTED_FEATURES "${CURL_CONFIG_FEATURES_STRING}")
execute_process(COMMAND ${CURL_CONFIG_EXECUTABLE} --protocols
OUTPUT_VARIABLE CURL_CONFIG_PROTOCOLS_STRING
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\n" ";" CURL_SUPPORTED_PROTOCOLS "${CURL_CONFIG_PROTOCOLS_STRING}")
endif()
endif()
foreach(component IN LISTS CURL_FIND_COMPONENTS)
list(FIND CURL_SUPPORTED_PROTOCOLS ${component} _found)
if(NOT _found EQUAL -1)
set(CURL_${component}_FOUND TRUE)
else()
list(FIND CURL_SUPPORTED_FEATURES ${component} _found)
if(NOT _found EQUAL -1)
set(CURL_${component}_FOUND TRUE)
endif()
endif()
endforeach()
endif()
find_package_handle_standard_args(CURL
REQUIRED_VARS CURL_LIBRARY CURL_INCLUDE_DIR
VERSION_VAR CURL_VERSION
HANDLE_COMPONENTS)
if(CURL_FOUND)
set(CURL_LIBRARIES ${CURL_LIBRARY})
set(CURL_INCLUDE_DIRS ${CURL_INCLUDE_DIR})
if(NOT TARGET CURL::libcurl)
add_library(CURL::libcurl UNKNOWN IMPORTED)
set_target_properties(CURL::libcurl PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${CURL_INCLUDE_DIRS}")
if(CURL_USE_STATIC_LIBS)
set_property(TARGET CURL::libcurl APPEND PROPERTY
INTERFACE_COMPILE_DEFINITIONS "CURL_STATICLIB")
endif()
if(EXISTS "${CURL_LIBRARY}")
set_target_properties(CURL::libcurl PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION "${CURL_LIBRARY}")
endif()
if(CURL_LIBRARY_RELEASE)
set_property(TARGET CURL::libcurl APPEND PROPERTY
IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(CURL::libcurl PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION_RELEASE "${CURL_LIBRARY_RELEASE}")
endif()
if(CURL_LIBRARY_DEBUG)
set_property(TARGET CURL::libcurl APPEND PROPERTY
IMPORTED_CONFIGURATIONS DEBUG)
set_target_properties(CURL::libcurl PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION_DEBUG "${CURL_LIBRARY_DEBUG}")
endif()
if(PC_CURL_FOUND)
if(PC_CURL_LINK_LIBRARIES)
set_property(TARGET CURL::libcurl PROPERTY
INTERFACE_LINK_LIBRARIES "${PC_CURL_LINK_LIBRARIES}")
endif()
if(PC_CURL_LDFLAGS_OTHER)
set_property(TARGET CURL::libcurl PROPERTY
INTERFACE_LINK_OPTIONS "${PC_CURL_LDFLAGS_OTHER}")
endif()
if(PC_CURL_CFLAGS_OTHER)
set_property(TARGET CURL::libcurl PROPERTY
INTERFACE_COMPILE_OPTIONS "${PC_CURL_CFLAGS_OTHER}")
endif()
else()
if(CURL_USE_STATIC_LIBS AND MSVC)
set_target_properties(CURL::libcurl PROPERTIES
INTERFACE_LINK_LIBRARIES "normaliz.lib;ws2_32.lib;wldap32.lib")
endif()
endif()
endif()
endif()
cmake_policy(POP)
|