1 #***************************************************************************
3 # Project ___| | | | _ \| |
5 # | (__| |_| | _ <| |___
6 # \___|\___/|_| \_\_____|
8 # Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
10 # This software is licensed as described in the file COPYING, which
11 # you should have received as part of this distribution. The terms
12 # are also available at https://curl.haxx.se/docs/copyright.html.
14 # You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 # copies of the Software, and permit persons to whom the Software is
16 # furnished to do so, under the terms of the COPYING file.
18 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 # KIND, either express or implied.
21 ###########################################################################
22 # curl/libcurl CMake script
23 # by Tetetest and Sukender (Benoit Neil)
26 # The output .so file lacks the soname number which we currently have within the lib/Makefile.am file
27 # Add full (4 or 5 libs) SSL support
28 # Add INSTALL target (EXTRA_DIST variables in Makefile.am may be moved to Makefile.inc so that CMake/CPack is aware of what's to include).
30 # Check on all possible platforms
31 # Test with as many configurations possible (With or without any option)
32 # Create scripts that help keeping the CMake build system up to date (to reduce maintenance). According to Tetetest:
33 # - lists of headers that 'configure' checks for;
34 # - curl-specific tests (the ones that are in m4/curl-*.m4 files);
35 # - (most obvious thing:) curl version numbers.
36 # Add documentation subproject
39 # (From Daniel Stenberg) The cmake build selected to run gcc with -fPIC on my box while the plain configure script did not.
40 # (From Daniel Stenberg) The gcc command line use neither -g nor any -O options. As a developer, I also treasure our configure scripts's --enable-debug option that sets a long range of "picky" compiler options.
41 cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
42 set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}")
45 include(CMakeDependentOption)
46 include(CheckCCompilerFlag)
50 message(WARNING "the curl cmake build system is poorly maintained. Be aware")
52 file (READ ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS)
53 string (REGEX MATCH "#define LIBCURL_VERSION \"[^\"]*"
54 CURL_VERSION ${CURL_VERSION_H_CONTENTS})
55 string (REGEX REPLACE "[^\"]+\"" "" CURL_VERSION ${CURL_VERSION})
56 string (REGEX MATCH "#define LIBCURL_VERSION_NUM 0x[0-9a-fA-F]+"
57 CURL_VERSION_NUM ${CURL_VERSION_H_CONTENTS})
58 string (REGEX REPLACE "[^0]+0x" "" CURL_VERSION_NUM ${CURL_VERSION_NUM})
60 include_regular_expression("^.*$") # Sukender: Is it necessary?
62 # Setup package meta-data
64 message(STATUS "curl version=[${CURL_VERSION}]")
65 # SET(PACKAGE_TARNAME "curl")
66 # SET(PACKAGE_NAME "curl")
67 # SET(PACKAGE_VERSION "-")
68 # SET(PACKAGE_STRING "curl-")
69 # SET(PACKAGE_BUGREPORT "a suitable curl mailing list => https://curl.haxx.se/mail/")
70 set(OPERATING_SYSTEM "${CMAKE_SYSTEM_NAME}")
71 set(OS "\"${CMAKE_SYSTEM_NAME}\"")
73 include_directories(${PROJECT_BINARY_DIR}/include/curl)
74 include_directories( ${CURL_SOURCE_DIR}/include )
76 option(CURL_WERROR "Turn compiler warnings into errors" OFF)
77 option(PICKY_COMPILER "Enable picky compiler options" ON)
78 option(BUILD_CURL_EXE "Set to ON to build curl executable." ON)
79 option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF)
80 option(ENABLE_ARES "Set to ON to enable c-ares support" OFF)
82 option(CURL_STATIC_CRT "Set to ON to build libcurl with static CRT on Windows (/MT)." OFF)
83 option(ENABLE_INET_PTON "Set to OFF to prevent usage of inet_pton when building against modern SDKs while still requiring compatibility with older Windows versions, such as Windows XP, Windows Server 2003 etc." ON)
86 CMAKE_DEPENDENT_OPTION(ENABLE_THREADED_RESOLVER "Set to ON to enable threaded DNS lookup"
90 option(ENABLE_DEBUG "Set to ON to enable curl debug features" OFF)
91 option(ENABLE_CURLDEBUG "Set to ON to build with TrackMemory feature enabled" OFF)
93 if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)
95 foreach (_CCOPT -pedantic -Wall -W -Wpointer-arith -Wwrite-strings -Wunused -Wshadow -Winline -Wnested-externs -Wmissing-declarations -Wmissing-prototypes -Wno-long-long -Wfloat-equal -Wno-multichar -Wsign-compare -Wundef -Wno-format-nonliteral -Wendif-labels -Wstrict-prototypes -Wdeclaration-after-statement -Wstrict-aliasing=3 -Wcast-align -Wtype-limits -Wold-style-declaration -Wmissing-parameter-type -Wempty-body -Wclobbered -Wignored-qualifiers -Wconversion -Wno-sign-conversion -Wvla -Wdouble-promotion -Wno-system-headers)
96 # surprisingly, CHECK_C_COMPILER_FLAG needs a new variable to store each new
98 CHECK_C_COMPILER_FLAG(${_CCOPT} OPT${_CCOPT})
100 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_CCOPT}")
103 endif(PICKY_COMPILER)
104 endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)
107 # DEBUGBUILD will be defined only for Debug builds
108 if(NOT CMAKE_VERSION VERSION_LESS 3.0)
109 set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:DEBUGBUILD>)
111 set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUGBUILD)
113 set(ENABLE_CURLDEBUG ON)
116 if (ENABLE_CURLDEBUG)
117 set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS CURLDEBUG)
120 # For debug libs and exes, add "-d" postfix
121 set(CMAKE_DEBUG_POSTFIX "-d" CACHE STRING "Set debug library postfix")
123 # initialize CURL_LIBS
128 find_package(CARES REQUIRED)
129 list(APPEND CURL_LIBS ${CARES_LIBRARY} )
130 set(CURL_LIBS ${CURL_LIBS} ${CARES_LIBRARY})
133 include(CurlSymbolHiding)
135 option(HTTP_ONLY "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF)
136 mark_as_advanced(HTTP_ONLY)
137 option(CURL_DISABLE_FTP "disables FTP" OFF)
138 mark_as_advanced(CURL_DISABLE_FTP)
139 option(CURL_DISABLE_LDAP "disables LDAP" OFF)
140 mark_as_advanced(CURL_DISABLE_LDAP)
141 option(CURL_DISABLE_TELNET "disables Telnet" OFF)
142 mark_as_advanced(CURL_DISABLE_TELNET)
143 option(CURL_DISABLE_DICT "disables DICT" OFF)
144 mark_as_advanced(CURL_DISABLE_DICT)
145 option(CURL_DISABLE_FILE "disables FILE" OFF)
146 mark_as_advanced(CURL_DISABLE_FILE)
147 option(CURL_DISABLE_TFTP "disables TFTP" OFF)
148 mark_as_advanced(CURL_DISABLE_TFTP)
149 option(CURL_DISABLE_HTTP "disables HTTP" OFF)
150 mark_as_advanced(CURL_DISABLE_HTTP)
152 option(CURL_DISABLE_LDAPS "to disable LDAPS" OFF)
153 mark_as_advanced(CURL_DISABLE_LDAPS)
155 option(CURL_DISABLE_RTSP "to disable RTSP" OFF)
156 mark_as_advanced(CURL_DISABLE_RTSP)
157 option(CURL_DISABLE_PROXY "to disable proxy" OFF)
158 mark_as_advanced(CURL_DISABLE_PROXY)
159 option(CURL_DISABLE_POP3 "to disable POP3" OFF)
160 mark_as_advanced(CURL_DISABLE_POP3)
161 option(CURL_DISABLE_IMAP "to disable IMAP" OFF)
162 mark_as_advanced(CURL_DISABLE_IMAP)
163 option(CURL_DISABLE_SMTP "to disable SMTP" OFF)
164 mark_as_advanced(CURL_DISABLE_SMTP)
165 option(CURL_DISABLE_GOPHER "to disable Gopher" OFF)
166 mark_as_advanced(CURL_DISABLE_GOPHER)
169 set(CURL_DISABLE_FTP ON)
170 set(CURL_DISABLE_LDAP ON)
171 set(CURL_DISABLE_LDAPS ON)
172 set(CURL_DISABLE_TELNET ON)
173 set(CURL_DISABLE_DICT ON)
174 set(CURL_DISABLE_FILE ON)
175 set(CURL_DISABLE_TFTP ON)
176 set(CURL_DISABLE_RTSP ON)
177 set(CURL_DISABLE_POP3 ON)
178 set(CURL_DISABLE_IMAP ON)
179 set(CURL_DISABLE_SMTP ON)
180 set(CURL_DISABLE_GOPHER ON)
183 option(CURL_DISABLE_COOKIES "to disable cookies support" OFF)
184 mark_as_advanced(CURL_DISABLE_COOKIES)
186 option(CURL_DISABLE_CRYPTO_AUTH "to disable cryptographic authentication" OFF)
187 mark_as_advanced(CURL_DISABLE_CRYPTO_AUTH)
188 option(CURL_DISABLE_VERBOSE_STRINGS "to disable verbose strings" OFF)
189 mark_as_advanced(CURL_DISABLE_VERBOSE_STRINGS)
190 option(ENABLE_IPV6 "Define if you want to enable IPv6 support" ON)
191 mark_as_advanced(ENABLE_IPV6)
192 if(ENABLE_IPV6 AND NOT WIN32)
193 include(CheckStructHasMember)
194 check_struct_has_member("struct sockaddr_in6" sin6_addr "netinet/in.h"
195 HAVE_SOCKADDR_IN6_SIN6_ADDR)
196 check_struct_has_member("struct sockaddr_in6" sin6_scope_id "netinet/in.h"
197 HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
198 if(NOT HAVE_SOCKADDR_IN6_SIN6_ADDR)
199 message(WARNING "struct sockaddr_in6 not available, disabling IPv6 support")
200 # Force the feature off as this name is used as guard macro...
202 CACHE BOOL "Define if you want to enable IPv6 support" FORCE)
209 CMAKE_DEPENDENT_OPTION(ENABLE_MANUAL "to provide the built-in manual"
210 ON "NROFF_USEFUL;PERL_FOUND"
214 message(STATUS "Perl not found, testing disabled.")
215 set(BUILD_TESTING OFF)
221 # We need ansi c-flags, especially on HP
222 set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
223 set(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS})
226 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
227 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd")
230 # Disable warnings on Borland to avoid changing 3rd party code.
232 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
237 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /WX")
238 set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /WX")
240 # this assumes clang or gcc style options
241 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
245 # If we are on AIX, do the _ALL_SOURCE magic
246 if(${CMAKE_SYSTEM_NAME} MATCHES AIX)
248 endif(${CMAKE_SYSTEM_NAME} MATCHES AIX)
250 # Include all the necessary files for macros
251 include (CheckFunctionExists)
252 include (CheckIncludeFile)
253 include (CheckIncludeFiles)
254 include (CheckLibraryExists)
255 include (CheckSymbolExists)
256 include (CheckTypeSize)
257 include (CheckCSourceCompiles)
258 include (CMakeDependentOption)
260 # On windows preload settings
262 set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WINSOCKAPI_=")
263 include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/Platforms/WindowsCache.cmake)
266 if(ENABLE_THREADED_RESOLVER)
267 find_package(Threads REQUIRED)
269 set(USE_THREADS_WIN32 ON)
271 set(USE_THREADS_POSIX ${CMAKE_USE_PTHREADS_INIT})
272 set(HAVE_PTHREAD_H ${CMAKE_USE_PTHREADS_INIT})
274 set(CURL_LIBS ${CURL_LIBS} ${CMAKE_THREAD_LIBS_INIT})
277 # Check for all needed libraries
278 check_library_exists_concat("dl" dlopen HAVE_LIBDL)
279 check_library_exists_concat("socket" connect HAVE_LIBSOCKET)
280 check_library_exists("c" gethostbyname "" NOT_NEED_LIBNSL)
282 # Yellowtab Zeta needs different libraries than BeOS 5.
284 set(NOT_NEED_LIBNSL 1)
285 check_library_exists_concat("bind" gethostbyname HAVE_LIBBIND)
286 check_library_exists_concat("bnetapi" closesocket HAVE_LIBBNETAPI)
289 if(NOT NOT_NEED_LIBNSL)
290 check_library_exists_concat("nsl" gethostbyname HAVE_LIBNSL)
291 endif(NOT NOT_NEED_LIBNSL)
293 check_function_exists(gethostname HAVE_GETHOSTNAME)
296 check_library_exists_concat("ws2_32" getch HAVE_LIBWS2_32)
297 check_library_exists_concat("winmm" getch HAVE_LIBWINMM)
300 # check SSL libraries
301 # TODO support GNUTLS, NSS, POLARSSL, AXTLS, CYASSL
304 option(CMAKE_USE_DARWINSSL "enable Apple OS native SSL/TLS" OFF)
307 option(CMAKE_USE_WINSSL "enable Windows native SSL/TLS" OFF)
308 cmake_dependent_option(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON
309 CMAKE_USE_WINSSL OFF)
311 option(CMAKE_USE_MBEDTLS "Enable mbedTLS for SSL/TLS" OFF)
313 set(openssl_default ON)
314 if(WIN32 OR CMAKE_USE_DARWINSSL OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS)
315 set(openssl_default OFF)
317 option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${openssl_default})
319 collect_true(enabled_ssl_options enabled_ssl_options_count
325 if(enabled_ssl_options_count GREATER 1)
326 message(FATAL_ERROR "Multiple SSL options specified: ${enabled_ssl_options}. Please pick at most one and disable the rest.")
331 set(USE_SCHANNEL ON) # Windows native SSL/TLS support
332 set(USE_WINDOWS_SSPI ON) # CMAKE_USE_WINSSL implies CURL_WINDOWS_SSPI
333 list(APPEND CURL_LIBS "crypt32")
335 if(CURL_WINDOWS_SSPI)
336 set(USE_WINDOWS_SSPI ON)
337 set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DSECURITY_WIN32")
340 if(CMAKE_USE_DARWINSSL)
341 find_library(COREFOUNDATION_FRAMEWORK "CoreFoundation")
342 if(NOT COREFOUNDATION_FRAMEWORK)
343 message(FATAL_ERROR "CoreFoundation framework not found")
346 find_library(SECURITY_FRAMEWORK "Security")
347 if(NOT SECURITY_FRAMEWORK)
348 message(FATAL_ERROR "Security framework not found")
352 set(USE_DARWINSSL ON)
353 list(APPEND CURL_LIBS "${COREFOUNDATION_FRAMEWORK}" "${SECURITY_FRAMEWORK}")
356 if(CMAKE_USE_OPENSSL)
357 find_package(OpenSSL REQUIRED)
360 set(HAVE_LIBCRYPTO ON)
362 list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES})
363 include_directories(${OPENSSL_INCLUDE_DIR})
364 set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
365 check_include_file("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H)
366 check_include_file("openssl/engine.h" HAVE_OPENSSL_ENGINE_H)
367 check_include_file("openssl/err.h" HAVE_OPENSSL_ERR_H)
368 check_include_file("openssl/pem.h" HAVE_OPENSSL_PEM_H)
369 check_include_file("openssl/rsa.h" HAVE_OPENSSL_RSA_H)
370 check_include_file("openssl/ssl.h" HAVE_OPENSSL_SSL_H)
371 check_include_file("openssl/x509.h" HAVE_OPENSSL_X509_H)
372 check_include_file("openssl/rand.h" HAVE_OPENSSL_RAND_H)
373 check_symbol_exists(RAND_status "${CURL_INCLUDES}" HAVE_RAND_STATUS)
374 check_symbol_exists(RAND_screen "${CURL_INCLUDES}" HAVE_RAND_SCREEN)
375 check_symbol_exists(RAND_egd "${CURL_INCLUDES}" HAVE_RAND_EGD)
378 if(CMAKE_USE_MBEDTLS)
379 find_package(MbedTLS REQUIRED)
382 list(APPEND CURL_LIBS ${MBEDTLS_LIBRARIES})
383 include_directories(${MBEDTLS_INCLUDE_DIRS})
386 option(USE_NGHTTP2 "Use Nghttp2 library" OFF)
388 find_package(NGHTTP2 REQUIRED)
389 include_directories(${NGHTTP2_INCLUDE_DIRS})
390 list(APPEND CURL_LIBS ${NGHTTP2_LIBRARIES})
393 if(NOT CURL_DISABLE_LDAP)
395 option(USE_WIN32_LDAP "Use Windows LDAP implementation" ON)
397 check_library_exists_concat("wldap32" cldap_open HAVE_WLDAP32)
399 set(USE_WIN32_LDAP OFF)
404 option(CMAKE_USE_OPENLDAP "Use OpenLDAP code." OFF)
405 mark_as_advanced(CMAKE_USE_OPENLDAP)
406 set(CMAKE_LDAP_LIB "ldap" CACHE STRING "Name or full path to ldap library")
407 set(CMAKE_LBER_LIB "lber" CACHE STRING "Name or full path to lber library")
409 if(CMAKE_USE_OPENLDAP AND USE_WIN32_LDAP)
410 message(FATAL_ERROR "Cannot use USE_WIN32_LDAP and CMAKE_USE_OPENLDAP at the same time")
413 # Now that we know, we're not using windows LDAP...
415 check_include_file_concat("winldap.h" HAVE_WINLDAP_H)
416 check_include_file_concat("winber.h" HAVE_WINBER_H)
419 set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})
420 check_library_exists_concat(${CMAKE_LDAP_LIB} ldap_init HAVE_LIBLDAP)
421 check_library_exists_concat(${CMAKE_LBER_LIB} ber_init HAVE_LIBLBER)
423 set(CMAKE_REQUIRED_INCLUDES_BAK ${CMAKE_REQUIRED_INCLUDES})
424 set(CMAKE_LDAP_INCLUDE_DIR "" CACHE STRING "Path to LDAP include directory")
425 if(CMAKE_LDAP_INCLUDE_DIR)
426 list(APPEND CMAKE_REQUIRED_INCLUDES ${CMAKE_LDAP_INCLUDE_DIR})
428 check_include_file_concat("ldap.h" HAVE_LDAP_H)
429 check_include_file_concat("lber.h" HAVE_LBER_H)
432 message(STATUS "LDAP_H not found CURL_DISABLE_LDAP set ON")
433 set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
434 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_BAK}) #LDAP includes won't be used
435 elseif(NOT HAVE_LIBLDAP)
436 message(STATUS "LDAP library '${CMAKE_LDAP_LIB}' not found CURL_DISABLE_LDAP set ON")
437 set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
438 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_BAK}) #LDAP includes won't be used
440 if(CMAKE_USE_OPENLDAP)
443 if(CMAKE_LDAP_INCLUDE_DIR)
444 include_directories(${CMAKE_LDAP_INCLUDE_DIR})
449 list(APPEND _HEADER_LIST "windows.h")
452 list(APPEND _HEADER_LIST "sys/types.h")
454 list(APPEND _HEADER_LIST "ldap.h")
457 foreach(_HEADER ${_HEADER_LIST})
458 set(_INCLUDE_STRING "${_INCLUDE_STRING}#include <${_HEADER}>\n")
464 int main(int argc, char ** argv)
466 BerValue *bvp = NULL;
467 BerElement *bep = ber_init(bvp);
472 set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DLDAP_DEPRECATED=1")
473 list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LDAP_LIB})
475 list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LBER_LIB})
477 check_c_source_compiles("${_SRC_STRING}" NOT_NEED_LBER_H)
482 set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DNEED_LBER_H")
490 if(CURL_DISABLE_LDAP)
491 if(NOT CURL_DISABLE_LDAPS)
492 message(STATUS "LDAP needs to be enabled to support LDAPS")
493 set(CURL_DISABLE_LDAPS ON CACHE BOOL "" FORCE)
497 if(NOT CURL_DISABLE_LDAPS)
498 check_include_file_concat("ldap_ssl.h" HAVE_LDAP_SSL_H)
499 check_include_file_concat("ldapssl.h" HAVE_LDAPSSL_H)
503 check_library_exists_concat("idn2" idn2_lookup_ul HAVE_LIBIDN2)
505 # Check for symbol dlopen (same as HAVE_LIBDL)
506 check_library_exists("${CURL_LIBS}" dlopen "" HAVE_DLOPEN)
508 option(CURL_ZLIB "Set to ON to enable building curl with zlib support." ON)
513 find_package(ZLIB QUIET)
518 list(APPEND CURL_LIBS ${ZLIB_LIBRARIES})
519 include_directories(${ZLIB_INCLUDE_DIRS})
520 list(APPEND CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIRS})
525 option(CMAKE_USE_LIBSSH2 "Use libSSH2" ON)
526 mark_as_advanced(CMAKE_USE_LIBSSH2)
528 set(HAVE_LIBSSH2 OFF)
529 set(HAVE_LIBSSH2_H OFF)
531 if(CMAKE_USE_LIBSSH2)
532 find_package(LibSSH2)
534 list(APPEND CURL_LIBS ${LIBSSH2_LIBRARY})
535 set(CMAKE_REQUIRED_LIBRARIES ${LIBSSH2_LIBRARY})
536 list(APPEND CMAKE_REQUIRED_INCLUDES "${LIBSSH2_INCLUDE_DIR}")
537 include_directories("${LIBSSH2_INCLUDE_DIR}")
541 # find_package has already found the headers
542 set(HAVE_LIBSSH2_H ON)
543 set(CURL_INCLUDES ${CURL_INCLUDES} "${LIBSSH2_INCLUDE_DIR}/libssh2.h")
544 set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DHAVE_LIBSSH2_H")
546 # now check for specific libssh2 symbols as they were added in different versions
547 set(CMAKE_EXTRA_INCLUDE_FILES "libssh2.h")
548 check_function_exists(libssh2_version HAVE_LIBSSH2_VERSION)
549 check_function_exists(libssh2_init HAVE_LIBSSH2_INIT)
550 check_function_exists(libssh2_exit HAVE_LIBSSH2_EXIT)
551 check_function_exists(libssh2_scp_send64 HAVE_LIBSSH2_SCP_SEND64)
552 check_function_exists(libssh2_session_handshake HAVE_LIBSSH2_SESSION_HANDSHAKE)
553 set(CMAKE_EXTRA_INCLUDE_FILES "")
556 endif(CMAKE_USE_LIBSSH2)
558 option(CMAKE_USE_GSSAPI "Use GSSAPI implementation (right now only Heimdal is supported with CMake build)" OFF)
559 mark_as_advanced(CMAKE_USE_GSSAPI)
564 set(HAVE_GSSAPI ${GSS_FOUND})
567 message(STATUS "Found ${GSS_FLAVOUR} GSSAPI version: \"${GSS_VERSION}\"")
569 list(APPEND CMAKE_REQUIRED_INCLUDES ${GSS_INCLUDE_DIRECTORIES})
570 check_include_file_concat("gssapi/gssapi.h" HAVE_GSSAPI_GSSAPI_H)
571 check_include_file_concat("gssapi/gssapi_generic.h" HAVE_GSSAPI_GSSAPI_GENERIC_H)
572 check_include_file_concat("gssapi/gssapi_krb5.h" HAVE_GSSAPI_GSSAPI_KRB5_H)
574 if(GSS_FLAVOUR STREQUAL "Heimdal")
575 set(HAVE_GSSHEIMDAL ON)
578 set(_INCLUDE_LIST "")
579 if(HAVE_GSSAPI_GSSAPI_H)
580 list(APPEND _INCLUDE_LIST "gssapi/gssapi.h")
582 if(HAVE_GSSAPI_GSSAPI_GENERIC_H)
583 list(APPEND _INCLUDE_LIST "gssapi/gssapi_generic.h")
585 if(HAVE_GSSAPI_GSSAPI_KRB5_H)
586 list(APPEND _INCLUDE_LIST "gssapi/gssapi_krb5.h")
589 string(REPLACE ";" " " _COMPILER_FLAGS_STR "${GSS_COMPILER_FLAGS}")
590 string(REPLACE ";" " " _LINKER_FLAGS_STR "${GSS_LINKER_FLAGS}")
592 foreach(_dir ${GSS_LINK_DIRECTORIES})
593 set(_LINKER_FLAGS_STR "${_LINKER_FLAGS_STR} -L\"${_dir}\"")
596 set(CMAKE_REQUIRED_FLAGS "${_COMPILER_FLAGS_STR} ${_LINKER_FLAGS_STR}")
597 set(CMAKE_REQUIRED_LIBRARIES ${GSS_LIBRARIES})
598 check_symbol_exists("GSS_C_NT_HOSTBASED_SERVICE" ${_INCLUDE_LIST} HAVE_GSS_C_NT_HOSTBASED_SERVICE)
599 if(NOT HAVE_GSS_C_NT_HOSTBASED_SERVICE)
600 set(HAVE_OLD_GSSMIT ON)
605 include_directories(${GSS_INCLUDE_DIRECTORIES})
606 link_directories(${GSS_LINK_DIRECTORIES})
607 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GSS_COMPILER_FLAGS}")
608 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GSS_LINKER_FLAGS}")
609 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GSS_LINKER_FLAGS}")
610 list(APPEND CURL_LIBS ${GSS_LIBRARIES})
613 message(WARNING "GSSAPI support has been requested but no supporting libraries found. Skipping.")
617 option(ENABLE_UNIX_SOCKETS "Define if you want Unix domain sockets support" ON)
618 if(ENABLE_UNIX_SOCKETS)
619 include(CheckStructHasMember)
620 check_struct_has_member("struct sockaddr_un" sun_path "sys/un.h" USE_UNIX_SOCKETS)
622 unset(USE_UNIX_SOCKETS CACHE)
629 set(CURL_CA_BUNDLE "auto" CACHE STRING
630 "Path to the CA bundle. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
631 set(CURL_CA_FALLBACK OFF CACHE BOOL
632 "Set ON to use built-in CA store of TLS backend. Defaults to OFF")
633 set(CURL_CA_PATH "auto" CACHE STRING
634 "Location of default CA path. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
636 if("${CURL_CA_BUNDLE}" STREQUAL "")
637 message(FATAL_ERROR "Invalid value of CURL_CA_BUNDLE. Use 'none', 'auto' or file path.")
638 elseif("${CURL_CA_BUNDLE}" STREQUAL "none")
639 unset(CURL_CA_BUNDLE CACHE)
640 elseif("${CURL_CA_BUNDLE}" STREQUAL "auto")
641 unset(CURL_CA_BUNDLE CACHE)
642 set(CURL_CA_BUNDLE_AUTODETECT TRUE)
644 set(CURL_CA_BUNDLE_SET TRUE)
647 if("${CURL_CA_PATH}" STREQUAL "")
648 message(FATAL_ERROR "Invalid value of CURL_CA_PATH. Use 'none', 'auto' or directory path.")
649 elseif("${CURL_CA_PATH}" STREQUAL "none")
650 unset(CURL_CA_PATH CACHE)
651 elseif("${CURL_CA_PATH}" STREQUAL "auto")
652 unset(CURL_CA_PATH CACHE)
653 set(CURL_CA_PATH_AUTODETECT TRUE)
655 set(CURL_CA_PATH_SET TRUE)
658 if(CURL_CA_BUNDLE_SET AND CURL_CA_PATH_AUTODETECT)
659 # Skip autodetection of unset CA path because CA bundle is set explicitly
660 elseif(CURL_CA_PATH_SET AND CURL_CA_BUNDLE_AUTODETECT)
661 # Skip autodetection of unset CA bundle because CA path is set explicitly
662 elseif(CURL_CA_PATH_AUTODETECT OR CURL_CA_BUNDLE_AUTODETECT)
663 # first try autodetecting a CA bundle, then a CA path
665 if(CURL_CA_BUNDLE_AUTODETECT)
666 set(SEARCH_CA_BUNDLE_PATHS
667 /etc/ssl/certs/ca-certificates.crt
668 /etc/pki/tls/certs/ca-bundle.crt
669 /usr/share/ssl/certs/ca-bundle.crt
670 /usr/local/share/certs/ca-root-nss.crt
673 foreach(SEARCH_CA_BUNDLE_PATH ${SEARCH_CA_BUNDLE_PATHS})
674 if(EXISTS "${SEARCH_CA_BUNDLE_PATH}")
675 message(STATUS "Found CA bundle: ${SEARCH_CA_BUNDLE_PATH}")
676 set(CURL_CA_BUNDLE "${SEARCH_CA_BUNDLE_PATH}")
677 set(CURL_CA_BUNDLE_SET TRUE CACHE BOOL "Path to the CA bundle has been set")
683 if(CURL_CA_PATH_AUTODETECT AND (NOT CURL_CA_PATH_SET))
684 if(EXISTS "/etc/ssl/certs")
685 set(CURL_CA_PATH "/etc/ssl/certs")
686 set(CURL_CA_PATH_SET TRUE CACHE BOOL "Path to the CA bundle has been set")
691 if(CURL_CA_PATH_SET AND NOT USE_OPENSSL AND NOT USE_MBEDTLS)
693 "CA path only supported by OpenSSL, GnuTLS or mbed TLS. "
694 "Set CURL_CA_PATH=none or enable one of those TLS backends.")
698 # Check for header files
700 check_include_file_concat("windows.h" HAVE_WINDOWS_H)
701 check_include_file_concat("winsock.h" HAVE_WINSOCK_H)
702 check_include_file_concat("ws2tcpip.h" HAVE_WS2TCPIP_H)
703 check_include_file_concat("winsock2.h" HAVE_WINSOCK2_H)
704 if(NOT CURL_WINDOWS_SSPI AND USE_OPENSSL)
705 set(CURL_LIBS ${CURL_LIBS} "crypt32")
709 check_include_file_concat("stdio.h" HAVE_STDIO_H)
710 check_include_file_concat("inttypes.h" HAVE_INTTYPES_H)
711 check_include_file_concat("sys/filio.h" HAVE_SYS_FILIO_H)
712 check_include_file_concat("sys/ioctl.h" HAVE_SYS_IOCTL_H)
713 check_include_file_concat("sys/param.h" HAVE_SYS_PARAM_H)
714 check_include_file_concat("sys/poll.h" HAVE_SYS_POLL_H)
715 check_include_file_concat("sys/resource.h" HAVE_SYS_RESOURCE_H)
716 check_include_file_concat("sys/select.h" HAVE_SYS_SELECT_H)
717 check_include_file_concat("sys/socket.h" HAVE_SYS_SOCKET_H)
718 check_include_file_concat("sys/sockio.h" HAVE_SYS_SOCKIO_H)
719 check_include_file_concat("sys/stat.h" HAVE_SYS_STAT_H)
720 check_include_file_concat("sys/time.h" HAVE_SYS_TIME_H)
721 check_include_file_concat("sys/types.h" HAVE_SYS_TYPES_H)
722 check_include_file_concat("sys/uio.h" HAVE_SYS_UIO_H)
723 check_include_file_concat("sys/un.h" HAVE_SYS_UN_H)
724 check_include_file_concat("sys/utime.h" HAVE_SYS_UTIME_H)
725 check_include_file_concat("sys/xattr.h" HAVE_SYS_XATTR_H)
726 check_include_file_concat("alloca.h" HAVE_ALLOCA_H)
727 check_include_file_concat("arpa/inet.h" HAVE_ARPA_INET_H)
728 check_include_file_concat("arpa/tftp.h" HAVE_ARPA_TFTP_H)
729 check_include_file_concat("assert.h" HAVE_ASSERT_H)
730 check_include_file_concat("crypto.h" HAVE_CRYPTO_H)
731 check_include_file_concat("des.h" HAVE_DES_H)
732 check_include_file_concat("err.h" HAVE_ERR_H)
733 check_include_file_concat("errno.h" HAVE_ERRNO_H)
734 check_include_file_concat("fcntl.h" HAVE_FCNTL_H)
735 check_include_file_concat("idn2.h" HAVE_IDN2_H)
736 check_include_file_concat("ifaddrs.h" HAVE_IFADDRS_H)
737 check_include_file_concat("io.h" HAVE_IO_H)
738 check_include_file_concat("krb.h" HAVE_KRB_H)
739 check_include_file_concat("libgen.h" HAVE_LIBGEN_H)
740 check_include_file_concat("locale.h" HAVE_LOCALE_H)
741 check_include_file_concat("net/if.h" HAVE_NET_IF_H)
742 check_include_file_concat("netdb.h" HAVE_NETDB_H)
743 check_include_file_concat("netinet/in.h" HAVE_NETINET_IN_H)
744 check_include_file_concat("netinet/tcp.h" HAVE_NETINET_TCP_H)
746 check_include_file_concat("pem.h" HAVE_PEM_H)
747 check_include_file_concat("poll.h" HAVE_POLL_H)
748 check_include_file_concat("pwd.h" HAVE_PWD_H)
749 check_include_file_concat("rsa.h" HAVE_RSA_H)
750 check_include_file_concat("setjmp.h" HAVE_SETJMP_H)
751 check_include_file_concat("sgtty.h" HAVE_SGTTY_H)
752 check_include_file_concat("signal.h" HAVE_SIGNAL_H)
753 check_include_file_concat("ssl.h" HAVE_SSL_H)
754 check_include_file_concat("stdbool.h" HAVE_STDBOOL_H)
755 check_include_file_concat("stdint.h" HAVE_STDINT_H)
756 check_include_file_concat("stdio.h" HAVE_STDIO_H)
757 check_include_file_concat("stdlib.h" HAVE_STDLIB_H)
758 check_include_file_concat("string.h" HAVE_STRING_H)
759 check_include_file_concat("strings.h" HAVE_STRINGS_H)
760 check_include_file_concat("stropts.h" HAVE_STROPTS_H)
761 check_include_file_concat("termio.h" HAVE_TERMIO_H)
762 check_include_file_concat("termios.h" HAVE_TERMIOS_H)
763 check_include_file_concat("time.h" HAVE_TIME_H)
764 check_include_file_concat("unistd.h" HAVE_UNISTD_H)
765 check_include_file_concat("utime.h" HAVE_UTIME_H)
766 check_include_file_concat("x509.h" HAVE_X509_H)
768 check_include_file_concat("process.h" HAVE_PROCESS_H)
769 check_include_file_concat("stddef.h" HAVE_STDDEF_H)
770 check_include_file_concat("dlfcn.h" HAVE_DLFCN_H)
771 check_include_file_concat("malloc.h" HAVE_MALLOC_H)
772 check_include_file_concat("memory.h" HAVE_MEMORY_H)
773 check_include_file_concat("netinet/if_ether.h" HAVE_NETINET_IF_ETHER_H)
774 check_include_file_concat("stdint.h" HAVE_STDINT_H)
775 check_include_file_concat("sockio.h" HAVE_SOCKIO_H)
776 check_include_file_concat("sys/utsname.h" HAVE_SYS_UTSNAME_H)
778 check_type_size(size_t SIZEOF_SIZE_T)
779 check_type_size(ssize_t SIZEOF_SSIZE_T)
780 check_type_size("long long" SIZEOF_LONG_LONG)
781 check_type_size("long" SIZEOF_LONG)
782 check_type_size("short" SIZEOF_SHORT)
783 check_type_size("int" SIZEOF_INT)
784 check_type_size("__int64" SIZEOF___INT64)
785 check_type_size("long double" SIZEOF_LONG_DOUBLE)
786 check_type_size("time_t" SIZEOF_TIME_T)
787 if(NOT HAVE_SIZEOF_SSIZE_T)
788 if(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
790 endif(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
791 if(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
793 endif(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
794 endif(NOT HAVE_SIZEOF_SSIZE_T)
795 # off_t is sized later, after the HAVE_FILE_OFFSET_BITS test
797 if(HAVE_SIZEOF_LONG_LONG)
800 endif(HAVE_SIZEOF_LONG_LONG)
802 find_file(RANDOM_FILE urandom /dev)
803 mark_as_advanced(RANDOM_FILE)
805 # Check for some functions that are used
807 set(CMAKE_REQUIRED_LIBRARIES ws2_32)
808 elseif(HAVE_LIBSOCKET)
809 set(CMAKE_REQUIRED_LIBRARIES socket)
812 check_symbol_exists(basename "${CURL_INCLUDES}" HAVE_BASENAME)
813 check_symbol_exists(socket "${CURL_INCLUDES}" HAVE_SOCKET)
814 # poll on macOS is unreliable, it first did not exist, then was broken until
815 # fixed in 10.9 only to break again in 10.12.
817 check_symbol_exists(poll "${CURL_INCLUDES}" HAVE_POLL)
819 check_symbol_exists(select "${CURL_INCLUDES}" HAVE_SELECT)
820 check_symbol_exists(strdup "${CURL_INCLUDES}" HAVE_STRDUP)
821 check_symbol_exists(strstr "${CURL_INCLUDES}" HAVE_STRSTR)
822 check_symbol_exists(strtok_r "${CURL_INCLUDES}" HAVE_STRTOK_R)
823 check_symbol_exists(strftime "${CURL_INCLUDES}" HAVE_STRFTIME)
824 check_symbol_exists(uname "${CURL_INCLUDES}" HAVE_UNAME)
825 check_symbol_exists(strcasecmp "${CURL_INCLUDES}" HAVE_STRCASECMP)
826 check_symbol_exists(stricmp "${CURL_INCLUDES}" HAVE_STRICMP)
827 check_symbol_exists(strcmpi "${CURL_INCLUDES}" HAVE_STRCMPI)
828 check_symbol_exists(strncmpi "${CURL_INCLUDES}" HAVE_STRNCMPI)
829 check_symbol_exists(alarm "${CURL_INCLUDES}" HAVE_ALARM)
830 if(NOT HAVE_STRNCMPI)
832 endif(NOT HAVE_STRNCMPI)
833 check_symbol_exists(gethostbyaddr "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR)
834 check_symbol_exists(gethostbyaddr_r "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR_R)
835 check_symbol_exists(gettimeofday "${CURL_INCLUDES}" HAVE_GETTIMEOFDAY)
836 check_symbol_exists(inet_addr "${CURL_INCLUDES}" HAVE_INET_ADDR)
837 check_symbol_exists(inet_ntoa "${CURL_INCLUDES}" HAVE_INET_NTOA)
838 check_symbol_exists(inet_ntoa_r "${CURL_INCLUDES}" HAVE_INET_NTOA_R)
839 check_symbol_exists(tcsetattr "${CURL_INCLUDES}" HAVE_TCSETATTR)
840 check_symbol_exists(tcgetattr "${CURL_INCLUDES}" HAVE_TCGETATTR)
841 check_symbol_exists(perror "${CURL_INCLUDES}" HAVE_PERROR)
842 check_symbol_exists(closesocket "${CURL_INCLUDES}" HAVE_CLOSESOCKET)
843 check_symbol_exists(setvbuf "${CURL_INCLUDES}" HAVE_SETVBUF)
844 check_symbol_exists(sigsetjmp "${CURL_INCLUDES}" HAVE_SIGSETJMP)
845 check_symbol_exists(getpass_r "${CURL_INCLUDES}" HAVE_GETPASS_R)
846 check_symbol_exists(strlcat "${CURL_INCLUDES}" HAVE_STRLCAT)
847 check_symbol_exists(getpwuid "${CURL_INCLUDES}" HAVE_GETPWUID)
848 check_symbol_exists(geteuid "${CURL_INCLUDES}" HAVE_GETEUID)
849 check_symbol_exists(utime "${CURL_INCLUDES}" HAVE_UTIME)
850 check_symbol_exists(gmtime_r "${CURL_INCLUDES}" HAVE_GMTIME_R)
851 check_symbol_exists(localtime_r "${CURL_INCLUDES}" HAVE_LOCALTIME_R)
853 check_symbol_exists(gethostbyname "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME)
854 check_symbol_exists(gethostbyname_r "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R)
856 check_symbol_exists(signal "${CURL_INCLUDES}" HAVE_SIGNAL_FUNC)
857 check_symbol_exists(SIGALRM "${CURL_INCLUDES}" HAVE_SIGNAL_MACRO)
858 if(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO)
860 endif(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO)
861 check_symbol_exists(uname "${CURL_INCLUDES}" HAVE_UNAME)
862 check_symbol_exists(strtoll "${CURL_INCLUDES}" HAVE_STRTOLL)
863 check_symbol_exists(_strtoi64 "${CURL_INCLUDES}" HAVE__STRTOI64)
864 check_symbol_exists(strerror_r "${CURL_INCLUDES}" HAVE_STRERROR_R)
865 check_symbol_exists(siginterrupt "${CURL_INCLUDES}" HAVE_SIGINTERRUPT)
866 check_symbol_exists(perror "${CURL_INCLUDES}" HAVE_PERROR)
867 check_symbol_exists(fork "${CURL_INCLUDES}" HAVE_FORK)
868 check_symbol_exists(getaddrinfo "${CURL_INCLUDES}" HAVE_GETADDRINFO)
869 check_symbol_exists(freeaddrinfo "${CURL_INCLUDES}" HAVE_FREEADDRINFO)
870 check_symbol_exists(freeifaddrs "${CURL_INCLUDES}" HAVE_FREEIFADDRS)
871 check_symbol_exists(pipe "${CURL_INCLUDES}" HAVE_PIPE)
872 check_symbol_exists(ftruncate "${CURL_INCLUDES}" HAVE_FTRUNCATE)
873 check_symbol_exists(getprotobyname "${CURL_INCLUDES}" HAVE_GETPROTOBYNAME)
874 check_symbol_exists(getrlimit "${CURL_INCLUDES}" HAVE_GETRLIMIT)
875 check_symbol_exists(setlocale "${CURL_INCLUDES}" HAVE_SETLOCALE)
876 check_symbol_exists(setmode "${CURL_INCLUDES}" HAVE_SETMODE)
877 check_symbol_exists(setrlimit "${CURL_INCLUDES}" HAVE_SETRLIMIT)
878 check_symbol_exists(fcntl "${CURL_INCLUDES}" HAVE_FCNTL)
879 check_symbol_exists(ioctl "${CURL_INCLUDES}" HAVE_IOCTL)
880 check_symbol_exists(setsockopt "${CURL_INCLUDES}" HAVE_SETSOCKOPT)
881 check_function_exists(mach_absolute_time HAVE_MACH_ABSOLUTE_TIME)
883 # symbol exists in win32, but function does not.
886 check_function_exists(inet_pton HAVE_INET_PTON)
887 # _WIN32_WINNT_VISTA (0x0600)
888 add_definitions(-D_WIN32_WINNT=0x0600)
890 # _WIN32_WINNT_WINXP (0x0501)
891 add_definitions(-D_WIN32_WINNT=0x0501)
894 check_function_exists(inet_pton HAVE_INET_PTON)
897 check_symbol_exists(fsetxattr "${CURL_INCLUDES}" HAVE_FSETXATTR)
899 foreach(CURL_TEST HAVE_FSETXATTR_5 HAVE_FSETXATTR_6)
900 curl_internal_test_run(${CURL_TEST})
901 endforeach(CURL_TEST)
902 endif(HAVE_FSETXATTR)
904 # sigaction and sigsetjmp are special. Use special mechanism for
905 # detecting those, but only if previous attempt failed.
907 check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION)
910 if(NOT HAVE_SIGSETJMP)
912 check_symbol_exists(sigsetjmp "setjmp.h" HAVE_MACRO_SIGSETJMP)
913 if(HAVE_MACRO_SIGSETJMP)
914 set(HAVE_SIGSETJMP 1)
915 endif(HAVE_MACRO_SIGSETJMP)
917 endif(NOT HAVE_SIGSETJMP)
919 # If there is no stricmp(), do not allow LDAP to parse URLs
921 set(HAVE_LDAP_URL_PARSE 1)
922 endif(NOT HAVE_STRICMP)
924 # Do curl specific tests
926 HAVE_FCNTL_O_NONBLOCK
928 HAVE_IOCTLSOCKET_CAMEL
929 HAVE_IOCTLSOCKET_CAMEL_FIONBIO
930 HAVE_IOCTLSOCKET_FIONBIO
932 HAVE_IOCTL_SIOCGIFADDR
933 HAVE_SETSOCKOPT_SO_NONBLOCK
934 HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
937 HAVE_GETHOSTBYADDR_R_5
938 HAVE_GETHOSTBYADDR_R_7
939 HAVE_GETHOSTBYADDR_R_8
940 HAVE_GETHOSTBYADDR_R_5_REENTRANT
941 HAVE_GETHOSTBYADDR_R_7_REENTRANT
942 HAVE_GETHOSTBYADDR_R_8_REENTRANT
943 HAVE_GETHOSTBYNAME_R_3
944 HAVE_GETHOSTBYNAME_R_5
945 HAVE_GETHOSTBYNAME_R_6
946 HAVE_GETHOSTBYNAME_R_3_REENTRANT
947 HAVE_GETHOSTBYNAME_R_5_REENTRANT
948 HAVE_GETHOSTBYNAME_R_6_REENTRANT
954 HAVE_INET_NTOA_R_DECL
955 HAVE_INET_NTOA_R_DECL_REENTRANT
957 HAVE_FILE_OFFSET_BITS
959 curl_internal_test(${CURL_TEST})
960 endforeach(CURL_TEST)
962 if(HAVE_FILE_OFFSET_BITS)
963 set(_FILE_OFFSET_BITS 64)
964 set(CMAKE_REQUIRED_FLAGS "-D_FILE_OFFSET_BITS=64")
965 endif(HAVE_FILE_OFFSET_BITS)
966 check_type_size("off_t" SIZEOF_OFF_T)
968 # include this header to get the type
969 set(CMAKE_REQUIRED_INCLUDES "${CURL_SOURCE_DIR}/include")
970 set(CMAKE_EXTRA_INCLUDE_FILES "curl/system.h")
971 check_type_size("curl_off_t" SIZEOF_CURL_OFF_T)
972 set(CMAKE_EXTRA_INCLUDE_FILES "")
974 set(CMAKE_REQUIRED_FLAGS)
977 HAVE_GLIBC_STRERROR_R
978 HAVE_POSIX_STRERROR_R
980 curl_internal_test_run(${CURL_TEST})
981 endforeach(CURL_TEST)
983 # Check for reentrant
985 HAVE_GETHOSTBYADDR_R_5
986 HAVE_GETHOSTBYADDR_R_7
987 HAVE_GETHOSTBYADDR_R_8
988 HAVE_GETHOSTBYNAME_R_3
989 HAVE_GETHOSTBYNAME_R_5
990 HAVE_GETHOSTBYNAME_R_6
991 HAVE_INET_NTOA_R_DECL_REENTRANT)
993 if(${CURL_TEST}_REENTRANT)
994 set(NEED_REENTRANT 1)
995 endif(${CURL_TEST}_REENTRANT)
996 endif(NOT ${CURL_TEST})
997 endforeach(CURL_TEST)
1001 HAVE_GETHOSTBYADDR_R_5
1002 HAVE_GETHOSTBYADDR_R_7
1003 HAVE_GETHOSTBYADDR_R_8
1004 HAVE_GETHOSTBYNAME_R_3
1005 HAVE_GETHOSTBYNAME_R_5
1006 HAVE_GETHOSTBYNAME_R_6)
1008 if(${CURL_TEST}_REENTRANT)
1010 endif(${CURL_TEST}_REENTRANT)
1011 endforeach(CURL_TEST)
1012 endif(NEED_REENTRANT)
1014 if(HAVE_INET_NTOA_R_DECL_REENTRANT)
1015 set(HAVE_INET_NTOA_R_DECL 1)
1016 set(NEED_REENTRANT 1)
1017 endif(HAVE_INET_NTOA_R_DECL_REENTRANT)
1019 # Some other minor tests
1021 if(NOT HAVE_IN_ADDR_T)
1022 set(in_addr_t "unsigned long")
1023 endif(NOT HAVE_IN_ADDR_T)
1027 if(NOT CURL_SPECIAL_LIBZ)
1030 endif(NOT HAVE_LIBZ)
1034 endif(NOT HAVE_ZLIB_H)
1035 endif(NOT CURL_SPECIAL_LIBZ)
1037 # Check for nonblocking
1038 set(HAVE_DISABLED_NONBLOCKING 1)
1041 HAVE_IOCTLSOCKET_CASE OR
1043 set(HAVE_DISABLED_NONBLOCKING)
1044 endif(HAVE_FIONBIO OR
1046 HAVE_IOCTLSOCKET_CASE OR
1050 set(RETSIGTYPE void)
1051 else(RETSIGTYPE_TEST)
1053 endif(RETSIGTYPE_TEST)
1055 if(CMAKE_COMPILER_IS_GNUCC AND APPLE)
1056 include(CheckCCompilerFlag)
1057 check_c_compiler_flag(-Wno-long-double HAVE_C_FLAG_Wno_long_double)
1058 if(HAVE_C_FLAG_Wno_long_double)
1059 # The Mac version of GCC warns about use of long double. Disable it.
1060 get_source_file_property(MPRINTF_COMPILE_FLAGS mprintf.c COMPILE_FLAGS)
1061 if(MPRINTF_COMPILE_FLAGS)
1062 set(MPRINTF_COMPILE_FLAGS "${MPRINTF_COMPILE_FLAGS} -Wno-long-double")
1063 else(MPRINTF_COMPILE_FLAGS)
1064 set(MPRINTF_COMPILE_FLAGS "-Wno-long-double")
1065 endif(MPRINTF_COMPILE_FLAGS)
1066 set_source_files_properties(mprintf.c PROPERTIES
1067 COMPILE_FLAGS ${MPRINTF_COMPILE_FLAGS})
1068 endif(HAVE_C_FLAG_Wno_long_double)
1069 endif(CMAKE_COMPILER_IS_GNUCC AND APPLE)
1072 set(CURL_TYPEOF_CURL_SOCKLEN_T "socklen_t")
1074 set(CMAKE_EXTRA_INCLUDE_FILES "winsock2.h;ws2tcpip.h")
1075 elseif(HAVE_SYS_SOCKET_H)
1076 set(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h")
1078 check_type_size("socklen_t" CURL_SIZEOF_CURL_SOCKLEN_T)
1079 set(CMAKE_EXTRA_INCLUDE_FILES)
1080 if(NOT HAVE_CURL_SIZEOF_CURL_SOCKLEN_T)
1082 "Check for sizeof socklen_t failed, see CMakeFiles/CMakerror.log")
1085 set(CURL_TYPEOF_CURL_SOCKLEN_T int)
1086 set(CURL_SIZEOF_CURL_SOCKLEN_T ${SIZEOF_INT})
1089 # TODO test which of these headers are required
1091 set(CURL_PULL_WS2TCPIP_H ${HAVE_WS2TCPIP_H})
1093 set(CURL_PULL_SYS_TYPES_H ${HAVE_SYS_TYPES_H})
1094 set(CURL_PULL_SYS_SOCKET_H ${HAVE_SYS_SOCKET_H})
1095 set(CURL_PULL_SYS_POLL_H ${HAVE_SYS_POLL_H})
1097 set(CURL_PULL_STDINT_H ${HAVE_STDINT_H})
1098 set(CURL_PULL_INTTYPES_H ${HAVE_INTTYPES_H})
1100 include(CMake/OtherTests.cmake)
1102 add_definitions(-DHAVE_CONFIG_H)
1104 # For windows, all compilers used by cmake should support large files
1106 set(USE_WIN32_LARGE_FILES ON)
1110 add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
1111 if(CMAKE_C_FLAGS MATCHES "/W[0-4]")
1112 string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
1113 else(CMAKE_C_FLAGS MATCHES "/W[0-4]")
1114 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
1115 endif(CMAKE_C_FLAGS MATCHES "/W[0-4]")
1118 # Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).
1119 function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
1120 file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT)
1121 string(REPLACE "$(top_srcdir)" "\${CURL_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1122 string(REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1124 string(REGEX REPLACE "\\\\\n" "!π!α!" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1125 string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1126 string(REPLACE "!π!α!" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1128 string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace $() with ${}
1129 string(REGEX REPLACE "@([a-zA-Z_][a-zA-Z0-9_]*)@" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace @@ with ${}, even if that may not be read by CMake scripts.
1130 file(WRITE ${OUTPUT_FILE} ${MAKEFILE_INC_TEXT})
1134 if(WIN32 AND NOT CYGWIN)
1135 set(CURL_INSTALL_CMAKE_DIR CMake)
1137 set(CURL_INSTALL_CMAKE_DIR lib/cmake/curl)
1141 add_subdirectory(docs)
1144 add_subdirectory(lib)
1147 add_subdirectory(src)
1152 add_subdirectory(tests)
1155 # Helper to populate a list (_items) with a label when conditions (the remaining
1156 # args) are satisfied
1157 function(_add_if label)
1158 # TODO need to disable policy CMP0054 (CMake 3.1) to allow this indirection
1160 set(_items ${_items} "${label}" PARENT_SCOPE)
1164 # Clear list and try to detect available features
1166 _add_if("WinSSL" SSL_ENABLED AND USE_WINDOWS_SSPI)
1167 _add_if("OpenSSL" SSL_ENABLED AND USE_OPENSSL)
1168 _add_if("DarwinSSL" SSL_ENABLED AND USE_DARWINSSL)
1169 _add_if("mbedTLS" SSL_ENABLED AND USE_MBEDTLS)
1170 _add_if("IPv6" ENABLE_IPV6)
1171 _add_if("unix-sockets" USE_UNIX_SOCKETS)
1172 _add_if("libz" HAVE_LIBZ)
1173 _add_if("AsynchDNS" USE_ARES OR USE_THREADS_POSIX OR USE_THREADS_WIN32)
1174 _add_if("IDN" HAVE_LIBIDN2)
1175 _add_if("Largefile" (CURL_SIZEOF_CURL_OFF_T GREATER 4) AND
1176 ((SIZEOF_OFF_T GREATER 4) OR USE_WIN32_LARGE_FILES))
1177 # TODO SSP1 (WinSSL) check is missing
1178 _add_if("SSPI" USE_WINDOWS_SSPI)
1179 _add_if("GSS-API" HAVE_GSSAPI)
1180 # TODO SSP1 missing for SPNEGO
1181 _add_if("SPNEGO" NOT CURL_DISABLE_CRYPTO_AUTH AND
1182 (HAVE_GSSAPI OR USE_WINDOWS_SSPI))
1183 _add_if("Kerberos" NOT CURL_DISABLE_CRYPTO_AUTH AND
1184 (HAVE_GSSAPI OR USE_WINDOWS_SSPI))
1185 # NTLM support requires crypto function adaptions from various SSL libs
1186 # TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
1187 if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_DARWINSSL OR USE_MBEDTLS))
1189 # TODO missing option (autoconf: --enable-ntlm-wb)
1190 _add_if("NTLM_WB" NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
1192 # TODO missing option (--enable-tls-srp), depends on GNUTLS_SRP/OPENSSL_SRP
1193 _add_if("TLS-SRP" USE_TLS_SRP)
1194 # TODO option --with-nghttp2 tests for nghttp2 lib and nghttp2/nghttp2.h header
1195 _add_if("HTTP2" USE_NGHTTP2)
1196 string(REPLACE ";" " " SUPPORT_FEATURES "${_items}")
1197 message(STATUS "Enabled features: ${SUPPORT_FEATURES}")
1199 # Clear list and try to detect available protocols
1201 _add_if("HTTP" NOT CURL_DISABLE_HTTP)
1202 _add_if("HTTPS" NOT CURL_DISABLE_HTTP AND SSL_ENABLED)
1203 _add_if("FTP" NOT CURL_DISABLE_FTP)
1204 _add_if("FTPS" NOT CURL_DISABLE_FTP AND SSL_ENABLED)
1205 _add_if("FILE" NOT CURL_DISABLE_FILE)
1206 _add_if("TELNET" NOT CURL_DISABLE_TELNET)
1207 _add_if("LDAP" NOT CURL_DISABLE_LDAP)
1208 # CURL_DISABLE_LDAP implies CURL_DISABLE_LDAPS
1209 # TODO check HAVE_LDAP_SSL (in autoconf this is enabled with --enable-ldaps)
1210 _add_if("LDAPS" NOT CURL_DISABLE_LDAPS AND
1211 ((USE_OPENLDAP AND SSL_ENABLED) OR
1212 (NOT USE_OPENLDAP AND HAVE_LDAP_SSL)))
1213 _add_if("DICT" NOT CURL_DISABLE_DICT)
1214 _add_if("TFTP" NOT CURL_DISABLE_TFTP)
1215 _add_if("GOPHER" NOT CURL_DISABLE_GOPHER)
1216 _add_if("POP3" NOT CURL_DISABLE_POP3)
1217 _add_if("POP3S" NOT CURL_DISABLE_POP3 AND SSL_ENABLED)
1218 _add_if("IMAP" NOT CURL_DISABLE_IMAP)
1219 _add_if("IMAPS" NOT CURL_DISABLE_IMAP AND SSL_ENABLED)
1220 _add_if("SMTP" NOT CURL_DISABLE_SMTP)
1221 _add_if("SMTPS" NOT CURL_DISABLE_SMTP AND SSL_ENABLED)
1222 _add_if("SCP" USE_LIBSSH2)
1223 _add_if("SFTP" USE_LIBSSH2)
1224 _add_if("RTSP" NOT CURL_DISABLE_RTSP)
1225 _add_if("RTMP" USE_LIBRTMP)
1227 string(REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}")
1228 message(STATUS "Enabled protocols: ${SUPPORT_PROTOCOLS}")
1230 # curl-config needs the following options to be set.
1231 set(CC "${CMAKE_C_COMPILER}")
1232 # TODO probably put a -D... options here?
1233 set(CONFIGURE_OPTIONS "")
1234 # TODO when to set "-DCURL_STATICLIB" for CPPFLAG_CURL_STATICLIB?
1235 set(CPPFLAG_CURL_STATICLIB "")
1236 set(CURLVERSION "${CURL_VERSION}")
1237 set(ENABLE_SHARED "yes")
1239 set(ENABLE_STATIC "yes")
1241 set(ENABLE_STATIC "no")
1243 set(exec_prefix "\${prefix}")
1244 set(includedir "\${prefix}/include")
1245 set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
1246 set(LIBCURL_LIBS "")
1247 set(libdir "${CMAKE_INSTALL_PREFIX}/lib")
1248 foreach(_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${CURL_LIBS})
1249 if(_lib MATCHES ".*/.*" OR _lib MATCHES "^-")
1250 set(LIBCURL_LIBS "${LIBCURL_LIBS} ${_lib}")
1252 set(LIBCURL_LIBS "${LIBCURL_LIBS} -l${_lib}")
1255 # "a" (Linux) or "lib" (Windows)
1256 string(REPLACE "." "" libext "${CMAKE_STATIC_LIBRARY_SUFFIX}")
1257 set(prefix "${CMAKE_INSTALL_PREFIX}")
1258 # Set this to "yes" to append all libraries on which -lcurl is dependent
1259 set(REQUIRE_LIB_DEPS "no")
1262 set(VERSIONNUM "${CURL_VERSION_NUM}")
1264 # Finally generate a "curl-config" matching this config
1265 configure_file("${CURL_SOURCE_DIR}/curl-config.in"
1266 "${CURL_BINARY_DIR}/curl-config" @ONLY)
1267 install(FILES "${CURL_BINARY_DIR}/curl-config"
1270 OWNER_READ OWNER_WRITE OWNER_EXECUTE
1271 GROUP_READ GROUP_EXECUTE
1272 WORLD_READ WORLD_EXECUTE)
1274 # Finally generate a pkg-config file matching this config
1275 configure_file("${CURL_SOURCE_DIR}/libcurl.pc.in"
1276 "${CURL_BINARY_DIR}/libcurl.pc" @ONLY)
1277 install(FILES "${CURL_BINARY_DIR}/libcurl.pc"
1278 DESTINATION lib/pkgconfig)
1280 # This needs to be run very last so other parts of the scripts can take advantage of this.
1281 if(NOT CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
1282 set(CURL_CONFIG_HAS_BEEN_RUN_BEFORE 1 CACHE INTERNAL "Flag to track whether this is the first time running CMake or if CMake has been configured before")
1286 install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/curl"
1288 FILES_MATCHING PATTERN "*.h")
1291 include(CMakePackageConfigHelpers)
1292 write_basic_package_version_file(
1293 "${PROJECT_BINARY_DIR}/curl-config-version.cmake"
1294 VERSION ${CURL_VERSION}
1295 COMPATIBILITY SameMajorVersion
1298 configure_file(CMake/curl-config.cmake
1299 "${PROJECT_BINARY_DIR}/curl-config.cmake"
1304 FILES ${PROJECT_BINARY_DIR}/curl-config.cmake
1305 ${PROJECT_BINARY_DIR}/curl-config-version.cmake
1306 DESTINATION ${CURL_INSTALL_CMAKE_DIR}
1309 # Workaround for MSVS10 to avoid the Dialog Hell
1310 # FIXME: This could be removed with future version of CMake.
1311 if(MSVC_VERSION EQUAL 1600)
1312 set(CURL_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/CURL.sln")
1313 if(EXISTS "${CURL_SLN_FILENAME}")
1314 file(APPEND "${CURL_SLN_FILENAME}" "\n# This should be regenerated!\n")
1318 if(NOT TARGET uninstall)
1320 ${CMAKE_CURRENT_SOURCE_DIR}/CMake/cmake_uninstall.cmake.in
1321 ${CMAKE_CURRENT_BINARY_DIR}/CMake/cmake_uninstall.cmake
1324 add_custom_target(uninstall
1325 COMMAND ${CMAKE_COMMAND} -P
1326 ${CMAKE_CURRENT_BINARY_DIR}/CMake/cmake_uninstall.cmake)