1 #***************************************************************************
3 # Project ___| | | | _ \| |
5 # | (__| |_| | _ <| |___
6 # \___|\___/|_| \_\_____|
8 # Copyright (C) 1998 - 2015, 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 FATAL_ERROR)
42 set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}")
48 message(WARNING "the curl cmake build system is poorly maintained. Be aware")
50 file (READ ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS)
51 string (REGEX MATCH "#define LIBCURL_VERSION \"[^\"]*"
52 CURL_VERSION ${CURL_VERSION_H_CONTENTS})
53 string (REGEX REPLACE "[^\"]+\"" "" CURL_VERSION ${CURL_VERSION})
54 string (REGEX MATCH "#define LIBCURL_VERSION_NUM 0x[0-9a-fA-F]+"
55 CURL_VERSION_NUM ${CURL_VERSION_H_CONTENTS})
56 string (REGEX REPLACE "[^0]+0x" "" CURL_VERSION_NUM ${CURL_VERSION_NUM})
58 include_regular_expression("^.*$") # Sukender: Is it necessary?
60 # Setup package meta-data
62 message(STATUS "curl version=[${CURL_VERSION}]")
63 # SET(PACKAGE_TARNAME "curl")
64 # SET(PACKAGE_NAME "curl")
65 # SET(PACKAGE_VERSION "-")
66 # SET(PACKAGE_STRING "curl-")
67 # SET(PACKAGE_BUGREPORT "a suitable curl mailing list => https://curl.haxx.se/mail/")
68 set(OPERATING_SYSTEM "${CMAKE_SYSTEM_NAME}")
69 set(OS "\"${CMAKE_SYSTEM_NAME}\"")
71 include_directories(${PROJECT_BINARY_DIR}/include/curl)
72 include_directories( ${CURL_SOURCE_DIR}/include )
74 option(BUILD_CURL_EXE "Set to ON to build cURL executable." ON)
75 option(BUILD_CURL_TESTS "Set to ON to build cURL tests." ON)
76 option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF)
77 option(ENABLE_ARES "Set to ON to enable c-ares support" OFF)
78 option(ENABLE_THREADED_RESOLVER "Set to ON to enable POSIX threaded DNS lookup" OFF)
80 option(ENABLE_DEBUG "Set to ON to enable curl debug features" OFF)
81 option(ENABLE_CURLDEBUG "Set to ON to build with TrackMemory feature enabled" OFF)
84 # DEBUGBUILD will be defined only for Debug builds
85 if(NOT CMAKE_VERSION VERSION_LESS 3.0)
86 set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:DEBUGBUILD>)
88 set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUGBUILD)
90 set(ENABLE_CURLDEBUG ON)
94 set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS CURLDEBUG)
97 # initialize CURL_LIBS
100 if(ENABLE_THREADED_RESOLVER AND ENABLE_ARES)
101 message(FATAL_ERROR "Options ENABLE_THREADED_RESOLVER and ENABLE_ARES are mutually exclusive")
106 find_package(CARES REQUIRED)
107 list(APPEND CURL_LIBS ${CARES_LIBRARY} )
108 set(CURL_LIBS ${CURL_LIBS} ${CARES_LIBRARY})
111 option(BUILD_DASHBOARD_REPORTS "Set to ON to activate reporting of cURL builds here http://www.cdash.org/CDashPublic/index.php?project=CURL" OFF)
112 if(BUILD_DASHBOARD_REPORTS)
115 endif(BUILD_DASHBOARD_REPORTS)
118 option(BUILD_RELEASE_DEBUG_DIRS "Set OFF to build each configuration to a separate directory" OFF)
119 mark_as_advanced(BUILD_RELEASE_DEBUG_DIRS)
122 option(CURL_HIDDEN_SYMBOLS "Set to ON to hide libcurl internal symbols (=hide all symbols that aren't officially external)." ON)
123 mark_as_advanced(CURL_HIDDEN_SYMBOLS)
125 option(HTTP_ONLY "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF)
126 mark_as_advanced(HTTP_ONLY)
127 option(CURL_DISABLE_FTP "disables FTP" OFF)
128 mark_as_advanced(CURL_DISABLE_FTP)
129 option(CURL_DISABLE_LDAP "disables LDAP" OFF)
130 mark_as_advanced(CURL_DISABLE_LDAP)
131 option(CURL_DISABLE_TELNET "disables Telnet" OFF)
132 mark_as_advanced(CURL_DISABLE_TELNET)
133 option(CURL_DISABLE_DICT "disables DICT" OFF)
134 mark_as_advanced(CURL_DISABLE_DICT)
135 option(CURL_DISABLE_FILE "disables FILE" OFF)
136 mark_as_advanced(CURL_DISABLE_FILE)
137 option(CURL_DISABLE_TFTP "disables TFTP" OFF)
138 mark_as_advanced(CURL_DISABLE_TFTP)
139 option(CURL_DISABLE_HTTP "disables HTTP" OFF)
140 mark_as_advanced(CURL_DISABLE_HTTP)
142 option(CURL_DISABLE_LDAPS "to disable LDAPS" OFF)
143 mark_as_advanced(CURL_DISABLE_LDAPS)
145 option(CURL_DISABLE_RTSP "to disable RTSP" OFF)
146 mark_as_advanced(CURL_DISABLE_RTSP)
147 option(CURL_DISABLE_PROXY "to disable proxy" OFF)
148 mark_as_advanced(CURL_DISABLE_PROXY)
149 option(CURL_DISABLE_POP3 "to disable POP3" OFF)
150 mark_as_advanced(CURL_DISABLE_POP3)
151 option(CURL_DISABLE_IMAP "to disable IMAP" OFF)
152 mark_as_advanced(CURL_DISABLE_IMAP)
153 option(CURL_DISABLE_SMTP "to disable SMTP" OFF)
154 mark_as_advanced(CURL_DISABLE_SMTP)
155 option(CURL_DISABLE_GOPHER "to disable Gopher" OFF)
156 mark_as_advanced(CURL_DISABLE_GOPHER)
159 set(CURL_DISABLE_FTP ON)
160 set(CURL_DISABLE_LDAP ON)
161 set(CURL_DISABLE_LDAPS ON)
162 set(CURL_DISABLE_TELNET ON)
163 set(CURL_DISABLE_DICT ON)
164 set(CURL_DISABLE_FILE ON)
165 set(CURL_DISABLE_TFTP ON)
166 set(CURL_DISABLE_RTSP ON)
167 set(CURL_DISABLE_POP3 ON)
168 set(CURL_DISABLE_IMAP ON)
169 set(CURL_DISABLE_SMTP ON)
170 set(CURL_DISABLE_GOPHER ON)
173 option(CURL_DISABLE_COOKIES "to disable cookies support" OFF)
174 mark_as_advanced(CURL_DISABLE_COOKIES)
176 option(CURL_DISABLE_CRYPTO_AUTH "to disable cryptographic authentication" OFF)
177 mark_as_advanced(CURL_DISABLE_CRYPTO_AUTH)
178 option(CURL_DISABLE_VERBOSE_STRINGS "to disable verbose strings" OFF)
179 mark_as_advanced(CURL_DISABLE_VERBOSE_STRINGS)
180 option(DISABLED_THREADSAFE "Set to explicitly specify we don't want to use thread-safe functions" OFF)
181 mark_as_advanced(DISABLED_THREADSAFE)
182 option(ENABLE_IPV6 "Define if you want to enable IPv6 support" ON)
183 mark_as_advanced(ENABLE_IPV6)
184 if(ENABLE_IPV6 AND NOT WIN32)
185 include(CheckStructHasMember)
186 check_struct_has_member("struct sockaddr_in6" sin6_addr "netinet/in.h"
187 HAVE_SOCKADDR_IN6_SIN6_ADDR)
188 check_struct_has_member("struct sockaddr_in6" sin6_scope_id "netinet/in.h"
189 HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
190 if(NOT HAVE_SOCKADDR_IN6_SIN6_ADDR)
191 message(WARNING "struct sockaddr_in6 not available, disabling IPv6 support")
192 # Force the feature off as this name is used as guard macro...
194 CACHE BOOL "Define if you want to enable IPv6 support" FORCE)
198 option(ENABLE_MANUAL "to provide the built-in manual" ON)
199 unset(USE_MANUAL CACHE) # TODO: cache NROFF/NROFF_MANOPT/USE_MANUAL vars?
201 find_program(NROFF NAMES gnroff nroff)
203 # Need a way to write to stdin, this will do
204 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt" "test")
205 # Tests for a valid nroff option to generate a manpage
206 foreach(_MANOPT "-man" "-mandoc")
207 execute_process(COMMAND "${NROFF}" ${_MANOPT}
208 OUTPUT_VARIABLE NROFF_MANOPT_OUTPUT
209 INPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt"
211 # Save the option if it was valid
212 if(NROFF_MANOPT_OUTPUT)
213 message("Found *nroff option: -- ${_MANOPT}")
214 set(NROFF_MANOPT ${_MANOPT})
219 # No need for the temporary file
220 file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt")
222 message(WARNING "Found no *nroff option to get plaintext from man pages")
225 message(WARNING "Found no *nroff program")
229 # We need ansi c-flags, especially on HP
230 set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
231 set(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS})
233 # Disable warnings on Borland to avoid changing 3rd party code.
235 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
238 # If we are on AIX, do the _ALL_SOURCE magic
239 if(${CMAKE_SYSTEM_NAME} MATCHES AIX)
241 endif(${CMAKE_SYSTEM_NAME} MATCHES AIX)
243 # Include all the necessary files for macros
244 include (CheckFunctionExists)
245 include (CheckIncludeFile)
246 include (CheckIncludeFiles)
247 include (CheckLibraryExists)
248 include (CheckSymbolExists)
249 include (CheckTypeSize)
250 include (CheckCSourceCompiles)
251 include (CMakeDependentOption)
253 # On windows preload settings
255 set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WINSOCKAPI_")
256 include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/Platforms/WindowsCache.cmake)
259 if(ENABLE_THREADED_RESOLVER)
260 check_include_file_concat("pthread.h" HAVE_PTHREAD_H)
262 set(CMAKE_THREAD_PREFER_PTHREAD 1)
263 find_package(Threads)
264 if(CMAKE_USE_PTHREADS_INIT)
265 set(CURL_LIBS ${CURL_LIBS} ${CMAKE_THREAD_LIBS_INIT})
266 set(USE_THREADS_POSIX 1)
271 # Check for all needed libraries
272 check_library_exists_concat("dl" dlopen HAVE_LIBDL)
273 check_library_exists_concat("socket" connect HAVE_LIBSOCKET)
274 check_library_exists("c" gethostbyname "" NOT_NEED_LIBNSL)
276 # Yellowtab Zeta needs different libraries than BeOS 5.
278 set(NOT_NEED_LIBNSL 1)
279 check_library_exists_concat("bind" gethostbyname HAVE_LIBBIND)
280 check_library_exists_concat("bnetapi" closesocket HAVE_LIBBNETAPI)
283 if(NOT NOT_NEED_LIBNSL)
284 check_library_exists_concat("nsl" gethostbyname HAVE_LIBNSL)
285 endif(NOT NOT_NEED_LIBNSL)
287 check_function_exists(gethostname HAVE_GETHOSTNAME)
289 set(OPENSSL_DEFAULT ON)
291 set(OPENSSL_DEFAULT OFF)
292 check_library_exists_concat("ws2_32" getch HAVE_LIBWS2_32)
293 check_library_exists_concat("winmm" getch HAVE_LIBWINMM)
296 option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${OPENSSL_DEFAULT})
297 mark_as_advanced(CMAKE_USE_OPENSSL)
300 CMAKE_DEPENDENT_OPTION(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON
301 "NOT CMAKE_USE_OPENSSL" OFF)
302 mark_as_advanced(CURL_WINDOWS_SSPI)
306 set(HAVE_LIBCRYPTO OFF)
309 if(CMAKE_USE_OPENSSL)
310 find_package(OpenSSL)
312 list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES})
314 set(HAVE_LIBCRYPTO ON)
316 include_directories(${OPENSSL_INCLUDE_DIR})
317 set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
318 check_include_file("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H)
319 check_include_file("openssl/engine.h" HAVE_OPENSSL_ENGINE_H)
320 check_include_file("openssl/err.h" HAVE_OPENSSL_ERR_H)
321 check_include_file("openssl/pem.h" HAVE_OPENSSL_PEM_H)
322 check_include_file("openssl/pkcs12.h" HAVE_OPENSSL_PKCS12_H)
323 check_include_file("openssl/rsa.h" HAVE_OPENSSL_RSA_H)
324 check_include_file("openssl/ssl.h" HAVE_OPENSSL_SSL_H)
325 check_include_file("openssl/x509.h" HAVE_OPENSSL_X509_H)
326 check_include_file("openssl/rand.h" HAVE_OPENSSL_RAND_H)
328 set(CURL_WINDOWS_SSPI ON)
332 if(NOT CURL_DISABLE_LDAP)
335 option(USE_WIN32_LDAP "Use Windows LDAP implementation" ON)
337 check_library_exists("wldap32" cldap_open "" HAVE_WLDAP32)
339 set(USE_WIN32_LDAP OFF)
344 option(CMAKE_USE_OPENLDAP "Use OpenLDAP code." OFF)
345 mark_as_advanced(CMAKE_USE_OPENLDAP)
346 set(CMAKE_LDAP_LIB "ldap" CACHE STRING "Name or full path to ldap library")
347 set(CMAKE_LBER_LIB "lber" CACHE STRING "Name or full path to lber library")
349 if(CMAKE_USE_OPENLDAP AND USE_WIN32_LDAP)
350 message(FATAL_ERROR "Cannot use USE_WIN32_LDAP and CMAKE_USE_OPENLDAP at the same time")
353 # Now that we know, we're not using windows LDAP...
354 if(NOT USE_WIN32_LDAP)
356 set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})
357 check_library_exists_concat(${CMAKE_LDAP_LIB} ldap_init HAVE_LIBLDAP)
358 check_library_exists_concat(${CMAKE_LBER_LIB} ber_init HAVE_LIBLBER)
360 check_include_file_concat("winldap.h" HAVE_WINLDAP_H)
361 check_include_file_concat("winber.h" HAVE_WINBER_H)
364 set(CMAKE_REQUIRED_INCLUDES_BAK ${CMAKE_REQUIRED_INCLUDES})
365 set(CMAKE_LDAP_INCLUDE_DIR "" CACHE STRING "Path to LDAP include directory")
366 if(CMAKE_LDAP_INCLUDE_DIR)
367 list(APPEND CMAKE_REQUIRED_INCLUDES ${CMAKE_LDAP_INCLUDE_DIR})
369 check_include_file_concat("ldap.h" HAVE_LDAP_H)
370 check_include_file_concat("lber.h" HAVE_LBER_H)
373 message(STATUS "LDAP_H not found CURL_DISABLE_LDAP set ON")
374 set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
375 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_BAK}) #LDAP includes won't be used
376 elseif(NOT HAVE_LIBLDAP)
377 message(STATUS "LDAP library '${CMAKE_LDAP_LIB}' not found CURL_DISABLE_LDAP set ON")
378 set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
379 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_BAK}) #LDAP includes won't be used
381 if(CMAKE_USE_OPENLDAP)
384 if(CMAKE_LDAP_INCLUDE_DIR)
385 include_directories(${CMAKE_LDAP_INCLUDE_DIR})
390 list(APPEND _HEADER_LIST "windows.h")
393 list(APPEND _HEADER_LIST "sys/types.h")
395 list(APPEND _HEADER_LIST "ldap.h")
398 foreach(_HEADER ${_HEADER_LIST})
399 set(_INCLUDE_STRING "${_INCLUDE_STRING}#include <${_HEADER}>\n")
405 int main(int argc, char ** argv)
407 BerValue *bvp = NULL;
408 BerElement *bep = ber_init(bvp);
413 set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DLDAP_DEPRECATED=1")
414 list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LDAP_LIB})
416 list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LBER_LIB})
418 check_c_source_compiles("${_SRC_STRING}" NOT_NEED_LBER_H)
423 set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DNEED_LBER_H")
430 if(CURL_DISABLE_LDAP)
431 if(NOT CURL_DISABLE_LDAPS)
432 message(STATUS "LDAP needs to be enabled to support LDAPS")
433 set(CURL_DISABLE_LDAPS ON CACHE BOOL "" FORCE)
437 if(NOT CURL_DISABLE_LDAPS)
438 check_include_file_concat("ldap_ssl.h" HAVE_LDAP_SSL_H)
439 check_include_file_concat("ldapssl.h" HAVE_LDAPSSL_H)
443 check_library_exists_concat("idn" idna_to_ascii_lz HAVE_LIBIDN)
445 # Check for symbol dlopen (same as HAVE_LIBDL)
446 check_library_exists("${CURL_LIBS}" dlopen "" HAVE_DLOPEN)
448 option(CURL_ZLIB "Set to ON to enable building cURL with zlib support." ON)
453 find_package(ZLIB QUIET)
458 list(APPEND CURL_LIBS ${ZLIB_LIBRARIES})
459 include_directories(${ZLIB_INCLUDE_DIRS})
460 list(APPEND CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIRS})
465 option(CMAKE_USE_LIBSSH2 "Use libSSH2" ON)
466 mark_as_advanced(CMAKE_USE_LIBSSH2)
468 set(HAVE_LIBSSH2 OFF)
469 set(HAVE_LIBSSH2_H OFF)
471 if(CMAKE_USE_LIBSSH2)
472 find_package(LibSSH2)
474 list(APPEND CURL_LIBS ${LIBSSH2_LIBRARY})
475 set(CMAKE_REQUIRED_LIBRARIES ${LIBSSH2_LIBRARY})
476 list(APPEND CMAKE_REQUIRED_INCLUDES "${LIBSSH2_INCLUDE_DIR}")
477 include_directories("${LIBSSH2_INCLUDE_DIR}")
481 # find_package has already found the headers
482 set(HAVE_LIBSSH2_H ON)
483 set(CURL_INCLUDES ${CURL_INCLUDES} "${LIBSSH2_INCLUDE_DIR}/libssh2.h")
484 set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DHAVE_LIBSSH2_H")
486 # now check for specific libssh2 symbols as they were added in different versions
487 set(CMAKE_EXTRA_INCLUDE_FILES "libssh2.h")
488 check_function_exists(libssh2_version HAVE_LIBSSH2_VERSION)
489 check_function_exists(libssh2_init HAVE_LIBSSH2_INIT)
490 check_function_exists(libssh2_exit HAVE_LIBSSH2_EXIT)
491 check_function_exists(libssh2_scp_send64 HAVE_LIBSSH2_SCP_SEND64)
492 check_function_exists(libssh2_session_handshake HAVE_LIBSSH2_SESSION_HANDSHAKE)
493 set(CMAKE_EXTRA_INCLUDE_FILES "")
496 endif(CMAKE_USE_LIBSSH2)
498 option(CMAKE_USE_GSSAPI "Use GSSAPI implementation (right now only Heimdal is supported with CMake build)" OFF)
499 mark_as_advanced(CMAKE_USE_GSSAPI)
504 set(HAVE_GSSAPI ${GSS_FOUND})
507 message(STATUS "Found ${GSS_FLAVOUR} GSSAPI version: \"${GSS_VERSION}\"")
509 list(APPEND CMAKE_REQUIRED_INCLUDES ${GSS_INCLUDE_DIRECTORIES})
510 check_include_file_concat("gssapi/gssapi.h" HAVE_GSSAPI_GSSAPI_H)
511 check_include_file_concat("gssapi/gssapi_generic.h" HAVE_GSSAPI_GSSAPI_GENERIC_H)
512 check_include_file_concat("gssapi/gssapi_krb5.h" HAVE_GSSAPI_GSSAPI_KRB5_H)
514 if(GSS_FLAVOUR STREQUAL "Heimdal")
515 set(HAVE_GSSHEIMDAL ON)
518 set(_INCLUDE_LIST "")
519 if(HAVE_GSSAPI_GSSAPI_H)
520 list(APPEND _INCLUDE_LIST "gssapi/gssapi.h")
522 if(HAVE_GSSAPI_GSSAPI_GENERIC_H)
523 list(APPEND _INCLUDE_LIST "gssapi/gssapi_generic.h")
525 if(HAVE_GSSAPI_GSSAPI_KRB5_H)
526 list(APPEND _INCLUDE_LIST "gssapi/gssapi_krb5.h")
529 string(REPLACE ";" " " _COMPILER_FLAGS_STR "${GSS_COMPILER_FLAGS}")
530 string(REPLACE ";" " " _LINKER_FLAGS_STR "${GSS_LINKER_FLAGS}")
532 foreach(_dir ${GSS_LINK_DIRECTORIES})
533 set(_LINKER_FLAGS_STR "${_LINKER_FLAGS_STR} -L\"${_dir}\"")
536 set(CMAKE_REQUIRED_FLAGS "${_COMPILER_FLAGS_STR} ${_LINKER_FLAGS_STR}")
537 set(CMAKE_REQUIRED_LIBRARIES ${GSS_LIBRARIES})
538 check_symbol_exists("GSS_C_NT_HOSTBASED_SERVICE" ${_INCLUDE_LIST} HAVE_GSS_C_NT_HOSTBASED_SERVICE)
539 if(NOT HAVE_GSS_C_NT_HOSTBASED_SERVICE)
540 set(HAVE_OLD_GSSMIT ON)
545 include_directories(${GSS_INCLUDE_DIRECTORIES})
546 link_directories(${GSS_LINK_DIRECTORIES})
547 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GSS_COMPILER_FLAGS}")
548 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GSS_LINKER_FLAGS}")
549 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GSS_LINKER_FLAGS}")
550 list(APPEND CURL_LIBS ${GSS_LIBRARIES})
553 message(WARNING "GSSAPI support has been requested but no supporting libraries found. Skipping.")
557 option(ENABLE_UNIX_SOCKETS "Define if you want Unix domain sockets support" ON)
558 if(ENABLE_UNIX_SOCKETS)
559 include(CheckStructHasMember)
560 check_struct_has_member("struct sockaddr_un" sun_path "sys/un.h" USE_UNIX_SOCKETS)
562 unset(USE_UNIX_SOCKETS CACHE)
566 # Check for header files
568 check_include_file_concat("windows.h" HAVE_WINDOWS_H)
569 check_include_file_concat("winsock.h" HAVE_WINSOCK_H)
570 check_include_file_concat("ws2tcpip.h" HAVE_WS2TCPIP_H)
571 check_include_file_concat("winsock2.h" HAVE_WINSOCK2_H)
572 if(CURL_WINDOWS_SSPI)
573 set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DSECURITY_WIN32")
574 check_include_file_concat("sspi.h" HAVE_SSPI_H)
576 check_include_file_concat("schannel.h" HAVE_SCHANNEL_H)
577 set(USE_WINDOWS_SSPI ON)
586 check_include_file_concat("stdio.h" HAVE_STDIO_H)
587 check_include_file_concat("inttypes.h" HAVE_INTTYPES_H)
588 check_include_file_concat("sys/filio.h" HAVE_SYS_FILIO_H)
589 check_include_file_concat("sys/ioctl.h" HAVE_SYS_IOCTL_H)
590 check_include_file_concat("sys/param.h" HAVE_SYS_PARAM_H)
591 check_include_file_concat("sys/poll.h" HAVE_SYS_POLL_H)
592 check_include_file_concat("sys/resource.h" HAVE_SYS_RESOURCE_H)
593 check_include_file_concat("sys/select.h" HAVE_SYS_SELECT_H)
594 check_include_file_concat("sys/socket.h" HAVE_SYS_SOCKET_H)
595 check_include_file_concat("sys/sockio.h" HAVE_SYS_SOCKIO_H)
596 check_include_file_concat("sys/stat.h" HAVE_SYS_STAT_H)
597 check_include_file_concat("sys/time.h" HAVE_SYS_TIME_H)
598 check_include_file_concat("sys/types.h" HAVE_SYS_TYPES_H)
599 check_include_file_concat("sys/uio.h" HAVE_SYS_UIO_H)
600 check_include_file_concat("sys/un.h" HAVE_SYS_UN_H)
601 check_include_file_concat("sys/utime.h" HAVE_SYS_UTIME_H)
602 check_include_file_concat("alloca.h" HAVE_ALLOCA_H)
603 check_include_file_concat("arpa/inet.h" HAVE_ARPA_INET_H)
604 check_include_file_concat("arpa/tftp.h" HAVE_ARPA_TFTP_H)
605 check_include_file_concat("assert.h" HAVE_ASSERT_H)
606 check_include_file_concat("crypto.h" HAVE_CRYPTO_H)
607 check_include_file_concat("des.h" HAVE_DES_H)
608 check_include_file_concat("err.h" HAVE_ERR_H)
609 check_include_file_concat("errno.h" HAVE_ERRNO_H)
610 check_include_file_concat("fcntl.h" HAVE_FCNTL_H)
611 check_include_file_concat("idn-free.h" HAVE_IDN_FREE_H)
612 check_include_file_concat("ifaddrs.h" HAVE_IFADDRS_H)
613 check_include_file_concat("io.h" HAVE_IO_H)
614 check_include_file_concat("krb.h" HAVE_KRB_H)
615 check_include_file_concat("libgen.h" HAVE_LIBGEN_H)
616 check_include_file_concat("limits.h" HAVE_LIMITS_H)
617 check_include_file_concat("locale.h" HAVE_LOCALE_H)
618 check_include_file_concat("net/if.h" HAVE_NET_IF_H)
619 check_include_file_concat("netdb.h" HAVE_NETDB_H)
620 check_include_file_concat("netinet/in.h" HAVE_NETINET_IN_H)
621 check_include_file_concat("netinet/tcp.h" HAVE_NETINET_TCP_H)
623 check_include_file_concat("pem.h" HAVE_PEM_H)
624 check_include_file_concat("poll.h" HAVE_POLL_H)
625 check_include_file_concat("pwd.h" HAVE_PWD_H)
626 check_include_file_concat("rsa.h" HAVE_RSA_H)
627 check_include_file_concat("setjmp.h" HAVE_SETJMP_H)
628 check_include_file_concat("sgtty.h" HAVE_SGTTY_H)
629 check_include_file_concat("signal.h" HAVE_SIGNAL_H)
630 check_include_file_concat("ssl.h" HAVE_SSL_H)
631 check_include_file_concat("stdbool.h" HAVE_STDBOOL_H)
632 check_include_file_concat("stdint.h" HAVE_STDINT_H)
633 check_include_file_concat("stdio.h" HAVE_STDIO_H)
634 check_include_file_concat("stdlib.h" HAVE_STDLIB_H)
635 check_include_file_concat("string.h" HAVE_STRING_H)
636 check_include_file_concat("strings.h" HAVE_STRINGS_H)
637 check_include_file_concat("stropts.h" HAVE_STROPTS_H)
638 check_include_file_concat("termio.h" HAVE_TERMIO_H)
639 check_include_file_concat("termios.h" HAVE_TERMIOS_H)
640 check_include_file_concat("time.h" HAVE_TIME_H)
641 check_include_file_concat("tld.h" HAVE_TLD_H)
642 check_include_file_concat("unistd.h" HAVE_UNISTD_H)
643 check_include_file_concat("utime.h" HAVE_UTIME_H)
644 check_include_file_concat("x509.h" HAVE_X509_H)
646 check_include_file_concat("process.h" HAVE_PROCESS_H)
647 check_include_file_concat("stddef.h" HAVE_STDDEF_H)
648 check_include_file_concat("dlfcn.h" HAVE_DLFCN_H)
649 check_include_file_concat("malloc.h" HAVE_MALLOC_H)
650 check_include_file_concat("memory.h" HAVE_MEMORY_H)
651 check_include_file_concat("netinet/if_ether.h" HAVE_NETINET_IF_ETHER_H)
652 check_include_file_concat("stdint.h" HAVE_STDINT_H)
653 check_include_file_concat("sockio.h" HAVE_SOCKIO_H)
654 check_include_file_concat("sys/utsname.h" HAVE_SYS_UTSNAME_H)
655 check_include_file_concat("idna.h" HAVE_IDNA_H)
659 check_type_size(size_t SIZEOF_SIZE_T)
660 check_type_size(ssize_t SIZEOF_SSIZE_T)
661 check_type_size("long long" SIZEOF_LONG_LONG)
662 check_type_size("long" SIZEOF_LONG)
663 check_type_size("short" SIZEOF_SHORT)
664 check_type_size("int" SIZEOF_INT)
665 check_type_size("__int64" SIZEOF___INT64)
666 check_type_size("long double" SIZEOF_LONG_DOUBLE)
667 check_type_size("time_t" SIZEOF_TIME_T)
668 if(NOT HAVE_SIZEOF_SSIZE_T)
669 if(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
671 endif(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
672 if(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
674 endif(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
675 endif(NOT HAVE_SIZEOF_SSIZE_T)
677 # Different sizeofs, etc.
679 # define CURL_SIZEOF_LONG 4
680 # define CURL_TYPEOF_CURL_OFF_T long long
681 # define CURL_FORMAT_CURL_OFF_T "lld"
682 # define CURL_FORMAT_CURL_OFF_TU "llu"
683 # define CURL_FORMAT_OFF_T "%lld"
684 # define CURL_SIZEOF_CURL_OFF_T 8
685 # define CURL_SUFFIX_CURL_OFF_T LL
686 # define CURL_SUFFIX_CURL_OFF_TU ULL
688 set(CURL_SIZEOF_LONG ${SIZEOF_LONG})
690 if(SIZEOF_LONG EQUAL 8)
691 set(CURL_TYPEOF_CURL_OFF_T long)
692 set(CURL_SIZEOF_CURL_OFF_T 8)
693 set(CURL_FORMAT_CURL_OFF_T "ld")
694 set(CURL_FORMAT_CURL_OFF_TU "lu")
695 set(CURL_FORMAT_OFF_T "%ld")
696 set(CURL_SUFFIX_CURL_OFF_T L)
697 set(CURL_SUFFIX_CURL_OFF_TU UL)
698 endif(SIZEOF_LONG EQUAL 8)
700 if(SIZEOF_LONG_LONG EQUAL 8)
701 set(CURL_TYPEOF_CURL_OFF_T "long long")
702 set(CURL_SIZEOF_CURL_OFF_T 8)
703 set(CURL_FORMAT_CURL_OFF_T "lld")
704 set(CURL_FORMAT_CURL_OFF_TU "llu")
705 set(CURL_FORMAT_OFF_T "%lld")
706 set(CURL_SUFFIX_CURL_OFF_T LL)
707 set(CURL_SUFFIX_CURL_OFF_TU ULL)
708 endif(SIZEOF_LONG_LONG EQUAL 8)
710 if(NOT CURL_TYPEOF_CURL_OFF_T)
711 set(CURL_TYPEOF_CURL_OFF_T ${ssize_t})
712 set(CURL_SIZEOF_CURL_OFF_T ${SIZEOF_SSIZE_T})
713 # TODO: need adjustment here.
714 set(CURL_FORMAT_CURL_OFF_T "ld")
715 set(CURL_FORMAT_CURL_OFF_TU "lu")
716 set(CURL_FORMAT_OFF_T "%ld")
717 set(CURL_SUFFIX_CURL_OFF_T L)
718 set(CURL_SUFFIX_CURL_OFF_TU LU)
719 endif(NOT CURL_TYPEOF_CURL_OFF_T)
721 if(HAVE_SIZEOF_LONG_LONG)
724 endif(HAVE_SIZEOF_LONG_LONG)
726 find_file(RANDOM_FILE urandom /dev)
727 mark_as_advanced(RANDOM_FILE)
729 # Check for some functions that are used
731 set(CMAKE_REQUIRED_LIBRARIES ws2_32)
732 elseif(HAVE_LIBSOCKET)
733 set(CMAKE_REQUIRED_LIBRARIES socket)
736 check_symbol_exists(basename "${CURL_INCLUDES}" HAVE_BASENAME)
737 check_symbol_exists(socket "${CURL_INCLUDES}" HAVE_SOCKET)
738 check_symbol_exists(poll "${CURL_INCLUDES}" HAVE_POLL)
739 check_symbol_exists(select "${CURL_INCLUDES}" HAVE_SELECT)
740 check_symbol_exists(strdup "${CURL_INCLUDES}" HAVE_STRDUP)
741 check_symbol_exists(strstr "${CURL_INCLUDES}" HAVE_STRSTR)
742 check_symbol_exists(strtok_r "${CURL_INCLUDES}" HAVE_STRTOK_R)
743 check_symbol_exists(strftime "${CURL_INCLUDES}" HAVE_STRFTIME)
744 check_symbol_exists(uname "${CURL_INCLUDES}" HAVE_UNAME)
745 check_symbol_exists(strcasecmp "${CURL_INCLUDES}" HAVE_STRCASECMP)
746 check_symbol_exists(stricmp "${CURL_INCLUDES}" HAVE_STRICMP)
747 check_symbol_exists(strcmpi "${CURL_INCLUDES}" HAVE_STRCMPI)
748 check_symbol_exists(strncmpi "${CURL_INCLUDES}" HAVE_STRNCMPI)
749 check_symbol_exists(alarm "${CURL_INCLUDES}" HAVE_ALARM)
750 if(NOT HAVE_STRNCMPI)
752 endif(NOT HAVE_STRNCMPI)
753 check_symbol_exists(gethostbyaddr "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR)
754 check_symbol_exists(gethostbyaddr_r "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR_R)
755 check_symbol_exists(gettimeofday "${CURL_INCLUDES}" HAVE_GETTIMEOFDAY)
756 check_symbol_exists(inet_addr "${CURL_INCLUDES}" HAVE_INET_ADDR)
757 check_symbol_exists(inet_ntoa "${CURL_INCLUDES}" HAVE_INET_NTOA)
758 check_symbol_exists(inet_ntoa_r "${CURL_INCLUDES}" HAVE_INET_NTOA_R)
759 check_symbol_exists(tcsetattr "${CURL_INCLUDES}" HAVE_TCSETATTR)
760 check_symbol_exists(tcgetattr "${CURL_INCLUDES}" HAVE_TCGETATTR)
761 check_symbol_exists(perror "${CURL_INCLUDES}" HAVE_PERROR)
762 check_symbol_exists(closesocket "${CURL_INCLUDES}" HAVE_CLOSESOCKET)
763 check_symbol_exists(setvbuf "${CURL_INCLUDES}" HAVE_SETVBUF)
764 check_symbol_exists(sigsetjmp "${CURL_INCLUDES}" HAVE_SIGSETJMP)
765 check_symbol_exists(getpass_r "${CURL_INCLUDES}" HAVE_GETPASS_R)
766 check_symbol_exists(strlcat "${CURL_INCLUDES}" HAVE_STRLCAT)
767 check_symbol_exists(getpwuid "${CURL_INCLUDES}" HAVE_GETPWUID)
768 check_symbol_exists(geteuid "${CURL_INCLUDES}" HAVE_GETEUID)
769 check_symbol_exists(utime "${CURL_INCLUDES}" HAVE_UTIME)
770 if(CMAKE_USE_OPENSSL)
771 check_symbol_exists(RAND_status "${CURL_INCLUDES}" HAVE_RAND_STATUS)
772 check_symbol_exists(RAND_screen "${CURL_INCLUDES}" HAVE_RAND_SCREEN)
773 check_symbol_exists(RAND_egd "${CURL_INCLUDES}" HAVE_RAND_EGD)
774 check_symbol_exists(CRYPTO_cleanup_all_ex_data "${CURL_INCLUDES}"
775 HAVE_CRYPTO_CLEANUP_ALL_EX_DATA)
776 if(HAVE_LIBCRYPTO AND HAVE_LIBSSL)
778 endif(HAVE_LIBCRYPTO AND HAVE_LIBSSL)
779 endif(CMAKE_USE_OPENSSL)
780 check_symbol_exists(gmtime_r "${CURL_INCLUDES}" HAVE_GMTIME_R)
781 check_symbol_exists(localtime_r "${CURL_INCLUDES}" HAVE_LOCALTIME_R)
783 check_symbol_exists(gethostbyname "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME)
784 check_symbol_exists(gethostbyname_r "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R)
786 check_symbol_exists(signal "${CURL_INCLUDES}" HAVE_SIGNAL_FUNC)
787 check_symbol_exists(SIGALRM "${CURL_INCLUDES}" HAVE_SIGNAL_MACRO)
788 if(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO)
790 endif(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO)
791 check_symbol_exists(uname "${CURL_INCLUDES}" HAVE_UNAME)
792 check_symbol_exists(strtoll "${CURL_INCLUDES}" HAVE_STRTOLL)
793 check_symbol_exists(_strtoi64 "${CURL_INCLUDES}" HAVE__STRTOI64)
794 check_symbol_exists(strerror_r "${CURL_INCLUDES}" HAVE_STRERROR_R)
795 check_symbol_exists(siginterrupt "${CURL_INCLUDES}" HAVE_SIGINTERRUPT)
796 check_symbol_exists(perror "${CURL_INCLUDES}" HAVE_PERROR)
797 check_symbol_exists(fork "${CURL_INCLUDES}" HAVE_FORK)
798 check_symbol_exists(getaddrinfo "${CURL_INCLUDES}" HAVE_GETADDRINFO)
799 check_symbol_exists(freeaddrinfo "${CURL_INCLUDES}" HAVE_FREEADDRINFO)
800 check_symbol_exists(freeifaddrs "${CURL_INCLUDES}" HAVE_FREEIFADDRS)
801 check_symbol_exists(pipe "${CURL_INCLUDES}" HAVE_PIPE)
802 check_symbol_exists(ftruncate "${CURL_INCLUDES}" HAVE_FTRUNCATE)
803 check_symbol_exists(getprotobyname "${CURL_INCLUDES}" HAVE_GETPROTOBYNAME)
804 check_symbol_exists(getrlimit "${CURL_INCLUDES}" HAVE_GETRLIMIT)
805 check_symbol_exists(idn_free "${CURL_INCLUDES}" HAVE_IDN_FREE)
806 check_symbol_exists(idna_strerror "${CURL_INCLUDES}" HAVE_IDNA_STRERROR)
807 check_symbol_exists(tld_strerror "${CURL_INCLUDES}" HAVE_TLD_STRERROR)
808 check_symbol_exists(setlocale "${CURL_INCLUDES}" HAVE_SETLOCALE)
809 check_symbol_exists(setrlimit "${CURL_INCLUDES}" HAVE_SETRLIMIT)
810 check_symbol_exists(fcntl "${CURL_INCLUDES}" HAVE_FCNTL)
811 check_symbol_exists(ioctl "${CURL_INCLUDES}" HAVE_IOCTL)
812 check_symbol_exists(setsockopt "${CURL_INCLUDES}" HAVE_SETSOCKOPT)
814 # symbol exists in win32, but function does not.
815 check_function_exists(inet_pton HAVE_INET_PTON)
817 # sigaction and sigsetjmp are special. Use special mechanism for
818 # detecting those, but only if previous attempt failed.
820 check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION)
823 if(NOT HAVE_SIGSETJMP)
825 check_symbol_exists(sigsetjmp "setjmp.h" HAVE_MACRO_SIGSETJMP)
826 if(HAVE_MACRO_SIGSETJMP)
827 set(HAVE_SIGSETJMP 1)
828 endif(HAVE_MACRO_SIGSETJMP)
830 endif(NOT HAVE_SIGSETJMP)
832 # If there is no stricmp(), do not allow LDAP to parse URLs
834 set(HAVE_LDAP_URL_PARSE 1)
835 endif(NOT HAVE_STRICMP)
837 # Do curl specific tests
839 HAVE_FCNTL_O_NONBLOCK
841 HAVE_IOCTLSOCKET_CAMEL
842 HAVE_IOCTLSOCKET_CAMEL_FIONBIO
843 HAVE_IOCTLSOCKET_FIONBIO
845 HAVE_IOCTL_SIOCGIFADDR
846 HAVE_SETSOCKOPT_SO_NONBLOCK
847 HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
850 HAVE_GETHOSTBYADDR_R_5
851 HAVE_GETHOSTBYADDR_R_7
852 HAVE_GETHOSTBYADDR_R_8
853 HAVE_GETHOSTBYADDR_R_5_REENTRANT
854 HAVE_GETHOSTBYADDR_R_7_REENTRANT
855 HAVE_GETHOSTBYADDR_R_8_REENTRANT
856 HAVE_GETHOSTBYNAME_R_3
857 HAVE_GETHOSTBYNAME_R_5
858 HAVE_GETHOSTBYNAME_R_6
859 HAVE_GETHOSTBYNAME_R_3_REENTRANT
860 HAVE_GETHOSTBYNAME_R_5_REENTRANT
861 HAVE_GETHOSTBYNAME_R_6_REENTRANT
867 HAVE_INET_NTOA_R_DECL
868 HAVE_INET_NTOA_R_DECL_REENTRANT
870 HAVE_FILE_OFFSET_BITS
872 curl_internal_test(${CURL_TEST})
873 endforeach(CURL_TEST)
874 if(HAVE_FILE_OFFSET_BITS)
875 set(_FILE_OFFSET_BITS 64)
876 endif(HAVE_FILE_OFFSET_BITS)
878 HAVE_GLIBC_STRERROR_R
879 HAVE_POSIX_STRERROR_R
881 curl_internal_test_run(${CURL_TEST})
882 endforeach(CURL_TEST)
884 # Check for reentrant
886 HAVE_GETHOSTBYADDR_R_5
887 HAVE_GETHOSTBYADDR_R_7
888 HAVE_GETHOSTBYADDR_R_8
889 HAVE_GETHOSTBYNAME_R_3
890 HAVE_GETHOSTBYNAME_R_5
891 HAVE_GETHOSTBYNAME_R_6
892 HAVE_INET_NTOA_R_DECL_REENTRANT)
894 if(${CURL_TEST}_REENTRANT)
895 set(NEED_REENTRANT 1)
896 endif(${CURL_TEST}_REENTRANT)
897 endif(NOT ${CURL_TEST})
898 endforeach(CURL_TEST)
902 HAVE_GETHOSTBYADDR_R_5
903 HAVE_GETHOSTBYADDR_R_7
904 HAVE_GETHOSTBYADDR_R_8
905 HAVE_GETHOSTBYNAME_R_3
906 HAVE_GETHOSTBYNAME_R_5
907 HAVE_GETHOSTBYNAME_R_6)
909 if(${CURL_TEST}_REENTRANT)
911 endif(${CURL_TEST}_REENTRANT)
912 endforeach(CURL_TEST)
913 endif(NEED_REENTRANT)
915 if(HAVE_INET_NTOA_R_DECL_REENTRANT)
916 set(HAVE_INET_NTOA_R_DECL 1)
917 set(NEED_REENTRANT 1)
918 endif(HAVE_INET_NTOA_R_DECL_REENTRANT)
920 # Some other minor tests
922 if(NOT HAVE_IN_ADDR_T)
923 set(in_addr_t "unsigned long")
924 endif(NOT HAVE_IN_ADDR_T)
928 if(NOT CURL_SPECIAL_LIBZ)
935 endif(NOT HAVE_ZLIB_H)
936 endif(NOT CURL_SPECIAL_LIBZ)
938 if(_FILE_OFFSET_BITS)
939 set(_FILE_OFFSET_BITS 64)
940 endif(_FILE_OFFSET_BITS)
941 set(CMAKE_REQUIRED_FLAGS "-D_FILE_OFFSET_BITS=64")
942 set(CMAKE_EXTRA_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/curl/curl.h")
943 check_type_size("curl_off_t" SIZEOF_CURL_OFF_T)
944 set(CMAKE_EXTRA_INCLUDE_FILES)
945 set(CMAKE_REQUIRED_FLAGS)
948 # Check for nonblocking
949 set(HAVE_DISABLED_NONBLOCKING 1)
952 HAVE_IOCTLSOCKET_CASE OR
954 set(HAVE_DISABLED_NONBLOCKING)
955 endif(HAVE_FIONBIO OR
957 HAVE_IOCTLSOCKET_CASE OR
962 else(RETSIGTYPE_TEST)
964 endif(RETSIGTYPE_TEST)
966 if(CMAKE_COMPILER_IS_GNUCC AND APPLE)
967 include(CheckCCompilerFlag)
968 check_c_compiler_flag(-Wno-long-double HAVE_C_FLAG_Wno_long_double)
969 if(HAVE_C_FLAG_Wno_long_double)
970 # The Mac version of GCC warns about use of long double. Disable it.
971 get_source_file_property(MPRINTF_COMPILE_FLAGS mprintf.c COMPILE_FLAGS)
972 if(MPRINTF_COMPILE_FLAGS)
973 set(MPRINTF_COMPILE_FLAGS "${MPRINTF_COMPILE_FLAGS} -Wno-long-double")
974 else(MPRINTF_COMPILE_FLAGS)
975 set(MPRINTF_COMPILE_FLAGS "-Wno-long-double")
976 endif(MPRINTF_COMPILE_FLAGS)
977 set_source_files_properties(mprintf.c PROPERTIES
978 COMPILE_FLAGS ${MPRINTF_COMPILE_FLAGS})
979 endif(HAVE_C_FLAG_Wno_long_double)
980 endif(CMAKE_COMPILER_IS_GNUCC AND APPLE)
983 set(CURL_TYPEOF_CURL_SOCKLEN_T "socklen_t")
985 set(CMAKE_EXTRA_INCLUDE_FILES "winsock2.h;ws2tcpip.h")
986 elseif(HAVE_SYS_SOCKET_H)
987 set(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h")
989 check_type_size("socklen_t" CURL_SIZEOF_CURL_SOCKLEN_T)
990 set(CMAKE_EXTRA_INCLUDE_FILES)
991 if(NOT HAVE_CURL_SIZEOF_CURL_SOCKLEN_T)
993 "Check for sizeof socklen_t failed, see CMakeFiles/CMakerror.log")
996 set(CURL_TYPEOF_CURL_SOCKLEN_T int)
997 set(CURL_SIZEOF_CURL_SOCKLEN_T ${SIZEOF_INT})
1000 # TODO test which of these headers are required for the typedefs used in curlbuild.h
1002 set(CURL_PULL_WS2TCPIP_H ${HAVE_WS2TCPIP_H})
1004 set(CURL_PULL_SYS_TYPES_H ${HAVE_SYS_TYPES_H})
1005 set(CURL_PULL_SYS_SOCKET_H ${HAVE_SYS_SOCKET_H})
1006 set(CURL_PULL_SYS_POLL_H ${HAVE_SYS_POLL_H})
1008 set(CURL_PULL_STDINT_H ${HAVE_STDINT_H})
1009 set(CURL_PULL_INTTYPES_H ${HAVE_INTTYPES_H})
1011 include(CMake/OtherTests.cmake)
1013 add_definitions(-DHAVE_CONFIG_H)
1015 # For windows, do not allow the compiler to use default target (Vista).
1017 add_definitions(-D_WIN32_WINNT=0x0501)
1021 add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
1024 # Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).
1025 function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
1026 file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT)
1027 string(REPLACE "$(top_srcdir)" "\${CURL_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1028 string(REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1030 string(REGEX REPLACE "\\\\\n" "§!§" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1031 string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1032 string(REPLACE "§!§" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1034 string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace $() with ${}
1035 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.
1036 file(WRITE ${OUTPUT_FILE} ${MAKEFILE_INC_TEXT})
1040 add_subdirectory(lib)
1042 add_subdirectory(src)
1044 if(BUILD_CURL_TESTS)
1045 add_subdirectory(tests)
1048 # TODO support GNUTLS, NSS, POLARSSL, AXTLS, CYASSL, WINSSL, DARWINSSL
1053 # Helper to populate a list (_items) with a label when conditions (the remaining
1054 # args) are satisfied
1055 function(_add_if label)
1056 # TODO need to disable policy CMP0054 (CMake 3.1) to allow this indirection
1058 set(_items ${_items} "${label}" PARENT_SCOPE)
1062 # Clear list and try to detect available features
1064 _add_if("WinSSL" SSL_ENABLED AND USE_WINDOWS_SSPI)
1065 _add_if("OpenSSL" SSL_ENABLED AND USE_OPENSSL)
1066 _add_if("IPv6" ENABLE_IPV6)
1067 _add_if("unix-sockets" USE_UNIX_SOCKETS)
1068 _add_if("libz" HAVE_LIBZ)
1069 _add_if("AsynchDNS" USE_ARES OR USE_THREADS_POSIX)
1070 _add_if("IDN" HAVE_LIBIDN)
1071 # TODO SSP1 (WinSSL) check is missing
1072 _add_if("SSPI" USE_WINDOWS_SSPI)
1073 _add_if("GSS-API" HAVE_GSSAPI)
1074 # TODO SSP1 missing for SPNEGO
1075 _add_if("SPNEGO" NOT CURL_DISABLE_CRYPTO_AUTH AND
1076 (HAVE_GSSAPI OR USE_WINDOWS_SSPI))
1077 _add_if("Kerberos" NOT CURL_DISABLE_CRYPTO_AUTH AND
1078 (HAVE_GSSAPI OR USE_WINDOWS_SSPI))
1079 # NTLM support requires crypto function adaptions from various SSL libs
1080 # TODO alternative SSL libs tests for SSP1, GNUTLS, NSS, DARWINSSL
1081 if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR
1082 USE_WINDOWS_SSPI OR GNUTLS_ENABLED OR NSS_ENABLED OR DARWINSSL_ENABLED))
1084 # TODO missing option (autoconf: --enable-ntlm-wb)
1085 _add_if("NTLM_WB" NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
1087 # TODO missing option (--enable-tls-srp), depends on GNUTLS_SRP/OPENSSL_SRP
1088 _add_if("TLS-SRP" USE_TLS_SRP)
1089 # TODO option --with-nghttp2 tests for nghttp2 lib and nghttp2/nghttp2.h header
1090 _add_if("HTTP2" USE_NGHTTP2)
1091 string(REPLACE ";" " " SUPPORT_FEATURES "${_items}")
1092 message(STATUS "Enabled features: ${SUPPORT_FEATURES}")
1094 # Clear list and try to detect available protocols
1096 _add_if("HTTP" NOT CURL_DISABLE_HTTP)
1097 _add_if("HTTPS" NOT CURL_DISABLE_HTTP AND SSL_ENABLED)
1098 _add_if("FTP" NOT CURL_DISABLE_FTP)
1099 _add_if("FTPS" NOT CURL_DISABLE_FTP AND SSL_ENABLED)
1100 _add_if("FILE" NOT CURL_DISABLE_FILE)
1101 _add_if("TELNET" NOT CURL_DISABLE_TELNET)
1102 _add_if("LDAP" NOT CURL_DISABLE_LDAP)
1103 # CURL_DISABLE_LDAP implies CURL_DISABLE_LDAPS
1104 # TODO check HAVE_LDAP_SSL (in autoconf this is enabled with --enable-ldaps)
1105 _add_if("LDAPS" NOT CURL_DISABLE_LDAPS AND
1106 ((USE_OPENLDAP AND SSL_ENABLED) OR
1107 (NOT USE_OPENLDAP AND HAVE_LDAP_SSL)))
1108 _add_if("DICT" NOT CURL_DISABLE_DICT)
1109 _add_if("TFTP" NOT CURL_DISABLE_TFTP)
1110 _add_if("GOPHER" NOT CURL_DISABLE_GOPHER)
1111 _add_if("POP3" NOT CURL_DISABLE_POP3)
1112 _add_if("POP3S" NOT CURL_DISABLE_POP3 AND SSL_ENABLED)
1113 _add_if("IMAP" NOT CURL_DISABLE_IMAP)
1114 _add_if("IMAPS" NOT CURL_DISABLE_IMAP AND SSL_ENABLED)
1115 _add_if("SMTP" NOT CURL_DISABLE_SMTP)
1116 _add_if("SMTPS" NOT CURL_DISABLE_SMTP AND SSL_ENABLED)
1117 _add_if("SCP" USE_LIBSSH2)
1118 _add_if("SFTP" USE_LIBSSH2)
1119 _add_if("RTSP" NOT CURL_DISABLE_RTSP)
1120 _add_if("RTMP" USE_LIBRTMP)
1122 string(REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}")
1123 message(STATUS "Enabled protocols: ${SUPPORT_PROTOCOLS}")
1125 # curl-config needs the following options to be set.
1126 set(CC "${CMAKE_C_COMPILER}")
1127 # TODO probably put a -D... options here?
1128 set(CONFIGURE_OPTIONS "")
1129 # TODO when to set "-DCURL_STATICLIB" for CPPFLAG_CURL_STATICLIB?
1130 set(CPPFLAG_CURL_STATICLIB "")
1131 # TODO need to set this (see CURL_CHECK_CA_BUNDLE in acinclude.m4)
1132 set(CURL_CA_BUNDLE "")
1133 set(CURLVERSION "${CURL_VERSION}")
1134 set(ENABLE_SHARED "yes")
1136 # Broken: LIBCURL_LIBS below; .a lib is not built
1137 message(WARNING "Static linking is broken!")
1138 set(ENABLE_STATIC "no")
1140 set(ENABLE_STATIC "no")
1142 set(exec_prefix "\${prefix}")
1143 set(includedir "\${prefix}/include")
1144 set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
1145 set(LIBCURL_LIBS "")
1146 set(libdir "${CMAKE_INSTALL_PREFIX}/lib")
1147 # TODO CURL_LIBS also contains absolute paths which don't work with static -l...
1148 foreach(_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${CURL_LIBS})
1149 set(LIBCURL_LIBS "${LIBCURL_LIBS} -l${_lib}")
1151 # "a" (Linux) or "lib" (Windows)
1152 string(REPLACE "." "" libext "${CMAKE_STATIC_LIBRARY_SUFFIX}")
1153 set(prefix "${CMAKE_INSTALL_PREFIX}")
1154 # Set this to "yes" to append all libraries on which -lcurl is dependent
1155 set(REQUIRE_LIB_DEPS "no")
1158 set(VERSIONNUM "${CURL_VERSION_NUM}")
1160 # Finally generate a "curl-config" matching this config
1161 configure_file("${CURL_SOURCE_DIR}/curl-config.in"
1162 "${CURL_BINARY_DIR}/curl-config" @ONLY)
1163 install(FILES "${CURL_BINARY_DIR}/curl-config"
1166 OWNER_READ OWNER_WRITE OWNER_EXECUTE
1167 GROUP_READ GROUP_EXECUTE
1168 WORLD_READ WORLD_EXECUTE)
1170 # Finally generate a pkg-config file matching this config
1171 configure_file("${CURL_SOURCE_DIR}/libcurl.pc.in"
1172 "${CURL_BINARY_DIR}/libcurl.pc" @ONLY)
1173 install(FILES "${CURL_BINARY_DIR}/libcurl.pc"
1174 DESTINATION lib/pkgconfig)
1176 # This needs to be run very last so other parts of the scripts can take advantage of this.
1177 if(NOT CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
1178 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")
1182 # First, install generated curlbuild.h
1183 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/curl/curlbuild.h"
1184 DESTINATION include/curl )
1185 # Next, install other headers excluding curlbuild.h
1186 install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/curl"
1188 FILES_MATCHING PATTERN "*.h"
1189 PATTERN "curlbuild.h" EXCLUDE)
1192 # Workaround for MSVS10 to avoid the Dialog Hell
1193 # FIXME: This could be removed with future version of CMake.
1194 if(MSVC_VERSION EQUAL 1600)
1195 set(CURL_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/CURL.sln")
1196 if(EXISTS "${CURL_SLN_FILENAME}")
1197 file(APPEND "${CURL_SLN_FILENAME}" "\n# This should be regenerated!\n")