|  | # 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) |