
On systems where there are two versions of libcurl installed CURL_VERSION_STRING is always set to the version found by the `pkg_check_modules(PC_CURL QUIET libcurl)`. But CURL_VERSION_STRING should match the libs and include paths found by `find_path` and `find_library` (more specifically the path where the header is found, because that where the version is parsed from. So make sure that the version is always parsed from the header file, use the output of pkg_check_modules only as HINT for find_path / find_library.
217 lines
7.2 KiB
CMake
217 lines
7.2 KiB
CMake
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
|
|
#[=======================================================================[.rst:
|
|
FindCURL
|
|
--------
|
|
|
|
Find the native CURL headers and libraries.
|
|
|
|
.. versionadded:: 3.14
|
|
This module accept optional COMPONENTS to check supported features and
|
|
protocols:
|
|
|
|
::
|
|
|
|
PROTOCOLS: ICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS LDAP LDAPS POP3
|
|
POP3S RTMP RTSP SCP SFTP SMB SMBS SMTP SMTPS TELNET TFTP
|
|
FEATURES: SSL IPv6 UnixSockets libz AsynchDNS IDN GSS-API PSL SPNEGO
|
|
Kerberos NTLM NTLM_WB TLS-SRP HTTP2 HTTPS-proxy
|
|
|
|
IMPORTED Targets
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
This module defines :prop_tgt:`IMPORTED` target ``CURL::libcurl``, if
|
|
curl has been found.
|
|
|
|
Result Variables
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
This module defines the following variables:
|
|
|
|
``CURL_FOUND``
|
|
"True" if ``curl`` found.
|
|
|
|
``CURL_INCLUDE_DIRS``
|
|
where to find ``curl``/``curl.h``, etc.
|
|
|
|
``CURL_LIBRARIES``
|
|
List of libraries when using ``curl``.
|
|
|
|
``CURL_VERSION_STRING``
|
|
The version of ``curl`` found.
|
|
|
|
.. versionadded:: 3.13
|
|
Debug and Release variants are found separately.
|
|
|
|
CURL CMake
|
|
^^^^^^^^^^
|
|
|
|
.. versionadded:: 3.17
|
|
|
|
If CURL was built using the CMake buildsystem then it provides its own
|
|
``CURLConfig.cmake`` file for use with the :command:`find_package` command's
|
|
config mode. This module looks for this file and, if found,
|
|
returns its results with no further action.
|
|
|
|
Set ``CURL_NO_CURL_CMAKE`` to ``ON`` to disable this search.
|
|
|
|
#]=======================================================================]
|
|
|
|
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
|
|
|
|
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}")
|
|
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 libcurl supported_protocols)
|
|
pkg_get_variable(CURL_SUPPORTED_FEATURES libcurl supported_features)
|
|
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
|
|
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_STRING "${curl_version_str}")
|
|
unset(curl_version_str)
|
|
break()
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
|
|
if(CURL_FIND_COMPONENTS)
|
|
set(CURL_KNOWN_PROTOCOLS ICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS LDAP LDAPS POP3 POP3S RTMP RTSP SCP SFTP SMB SMBS SMTP SMTPS TELNET TFTP)
|
|
set(CURL_KNOWN_FEATURES SSL IPv6 UnixSockets libz AsynchDNS IDN GSS-API PSL SPNEGO Kerberos NTLM NTLM_WB TLS-SRP HTTP2 HTTPS-proxy)
|
|
foreach(component IN LISTS CURL_KNOWN_PROTOCOLS CURL_KNOWN_FEATURES)
|
|
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_KNOWN_PROTOCOLS ${component} _found)
|
|
if(NOT _found EQUAL -1)
|
|
list(FIND CURL_SUPPORTED_PROTOCOLS ${component} _found)
|
|
if(NOT _found EQUAL -1)
|
|
set(CURL_${component}_FOUND TRUE)
|
|
elseif(CURL_FIND_REQUIRED)
|
|
message(FATAL_ERROR "CURL: Required protocol ${component} is not found")
|
|
endif()
|
|
else()
|
|
list(FIND CURL_SUPPORTED_FEATURES ${component} _found)
|
|
if(NOT _found EQUAL -1)
|
|
set(CURL_${component}_FOUND TRUE)
|
|
elseif(CURL_FIND_REQUIRED)
|
|
message(FATAL_ERROR "CURL: Required feature ${component} is not found")
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
|
|
find_package_handle_standard_args(CURL
|
|
REQUIRED_VARS CURL_LIBRARY CURL_INCLUDE_DIR
|
|
VERSION_VAR CURL_VERSION_STRING
|
|
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(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()
|
|
endif()
|
|
endif()
|