Imported Upstream version 7.48.0
[platform/upstream/curl.git] / CMakeLists.txt
1 #***************************************************************************
2 #                                  _   _ ____  _
3 #  Project                     ___| | | |  _ \| |
4 #                             / __| | | | |_) | |
5 #                            | (__| |_| |  _ <| |___
6 #                             \___|\___/|_| \_\_____|
7 #
8 # Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
9 #
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.
13 #
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.
17 #
18 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 # KIND, either express or implied.
20 #
21 ###########################################################################
22 # cURL/libcurl CMake script
23 # by Tetetest and Sukender (Benoit Neil)
24
25 # TODO:
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).
29 # Add CTests(?)
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
37 #
38 # To check:
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}")
43 include(Utilities)
44 include(Macros)
45
46 project( CURL C )
47
48 message(WARNING "the curl cmake build system is poorly maintained. Be aware")
49
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})
57
58 include_regular_expression("^.*$")    # Sukender: Is it necessary?
59
60 # Setup package meta-data
61 # SET(PACKAGE "curl")
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}\"")
70
71 include_directories(${PROJECT_BINARY_DIR}/include/curl)
72 include_directories( ${CURL_SOURCE_DIR}/include )
73
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)
79
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)
82
83 if (ENABLE_DEBUG)
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>)
87   else()
88     set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUGBUILD)
89   endif()
90   set(ENABLE_CURLDEBUG ON)
91 endif()
92
93 if (ENABLE_CURLDEBUG)
94   set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS CURLDEBUG)
95 endif()
96
97 # initialize CURL_LIBS
98 set(CURL_LIBS "")
99
100 if(ENABLE_THREADED_RESOLVER AND ENABLE_ARES)
101   message(FATAL_ERROR "Options ENABLE_THREADED_RESOLVER and ENABLE_ARES are mutually exclusive")
102 endif()
103
104 if(ENABLE_ARES)
105   set(USE_ARES 1)
106   find_package(CARES REQUIRED)
107   list(APPEND CURL_LIBS ${CARES_LIBRARY} )
108   set(CURL_LIBS ${CURL_LIBS} ${CARES_LIBRARY})
109 endif()
110
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)
113   #INCLUDE(Dart)
114   include(CTest)
115 endif(BUILD_DASHBOARD_REPORTS)
116
117 if(MSVC)
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)
120 endif()
121
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)
124
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)
141
142 option(CURL_DISABLE_LDAPS "to disable LDAPS" OFF)
143 mark_as_advanced(CURL_DISABLE_LDAPS)
144
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)
157
158 if(HTTP_ONLY)
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)
171 endif()
172
173 option(CURL_DISABLE_COOKIES "to disable cookies support" OFF)
174 mark_as_advanced(CURL_DISABLE_COOKIES)
175
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...
193     set(ENABLE_IPV6 OFF
194         CACHE BOOL "Define if you want to enable IPv6 support" FORCE)
195   endif()
196 endif()
197
198 option(ENABLE_MANUAL "to provide the built-in manual" ON)
199 unset(USE_MANUAL CACHE) # TODO: cache NROFF/NROFF_MANOPT/USE_MANUAL vars?
200 if(ENABLE_MANUAL)
201   find_program(NROFF NAMES gnroff nroff)
202   if(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"
210         ERROR_QUIET)
211       # Save the option if it was valid
212       if(NROFF_MANOPT_OUTPUT)
213         message("Found *nroff option: -- ${_MANOPT}")
214         set(NROFF_MANOPT ${_MANOPT})
215         set(USE_MANUAL 1)
216         break()
217       endif()
218     endforeach()
219     # No need for the temporary file
220     file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt")
221     if(NOT USE_MANUAL)
222       message(WARNING "Found no *nroff option to get plaintext from man pages")
223     endif()
224   else()
225     message(WARNING "Found no *nroff program")
226   endif()
227 endif()
228
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})
232
233 # Disable warnings on Borland to avoid changing 3rd party code.
234 if(BORLAND)
235   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
236 endif(BORLAND)
237
238 # If we are on AIX, do the _ALL_SOURCE magic
239 if(${CMAKE_SYSTEM_NAME} MATCHES AIX)
240   set(_ALL_SOURCE 1)
241 endif(${CMAKE_SYSTEM_NAME} MATCHES AIX)
242
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)
252
253 # On windows preload settings
254 if(WIN32)
255   set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WINSOCKAPI_")
256   include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/Platforms/WindowsCache.cmake)
257 endif(WIN32)
258
259 if(ENABLE_THREADED_RESOLVER)
260   check_include_file_concat("pthread.h" HAVE_PTHREAD_H)
261   if(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)
267     endif()
268   endif()
269 endif()
270
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)
275
276 # Yellowtab Zeta needs different libraries than BeOS 5.
277 if(BEOS)
278   set(NOT_NEED_LIBNSL 1)
279   check_library_exists_concat("bind" gethostbyname HAVE_LIBBIND)
280   check_library_exists_concat("bnetapi" closesocket HAVE_LIBBNETAPI)
281 endif(BEOS)
282
283 if(NOT NOT_NEED_LIBNSL)
284   check_library_exists_concat("nsl"    gethostbyname  HAVE_LIBNSL)
285 endif(NOT NOT_NEED_LIBNSL)
286
287 check_function_exists(gethostname HAVE_GETHOSTNAME)
288
289 set(OPENSSL_DEFAULT ON)
290 if(WIN32)
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)
294 endif()
295
296 option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${OPENSSL_DEFAULT})
297 mark_as_advanced(CMAKE_USE_OPENSSL)
298
299 if(WIN32)
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)
303 endif()
304
305 set(USE_OPENSSL OFF)
306 set(HAVE_LIBCRYPTO OFF)
307 set(HAVE_LIBSSL OFF)
308
309 if(CMAKE_USE_OPENSSL)
310   find_package(OpenSSL)
311   if(OPENSSL_FOUND)
312     list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES})
313     set(USE_OPENSSL ON)
314     set(HAVE_LIBCRYPTO ON)
315     set(HAVE_LIBSSL 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)
327   elseif(WIN32)
328     set(CURL_WINDOWS_SSPI ON)
329   endif()
330 endif()
331
332 if(NOT CURL_DISABLE_LDAP)
333
334   if(WIN32)
335     option(USE_WIN32_LDAP "Use Windows LDAP implementation" ON)
336     if(USE_WIN32_LDAP)
337       check_library_exists("wldap32" cldap_open "" HAVE_WLDAP32)
338       if(NOT HAVE_WLDAP32)
339         set(USE_WIN32_LDAP OFF)
340       endif()
341     endif()
342   endif()
343
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")
348
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")
351   endif()
352   
353   # Now that we know, we're not using windows LDAP...
354   if(NOT USE_WIN32_LDAP)
355     # Check for 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)
359   else()
360     check_include_file_concat("winldap.h" HAVE_WINLDAP_H)
361     check_include_file_concat("winber.h"  HAVE_WINBER_H)
362   endif()
363   
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})
368   endif()
369   check_include_file_concat("ldap.h"           HAVE_LDAP_H)
370   check_include_file_concat("lber.h"           HAVE_LBER_H)
371
372   if(NOT HAVE_LDAP_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
380   else()
381     if(CMAKE_USE_OPENLDAP)
382       set(USE_OPENLDAP ON)
383     endif()
384     if(CMAKE_LDAP_INCLUDE_DIR)
385       include_directories(${CMAKE_LDAP_INCLUDE_DIR})
386     endif()
387     set(NEED_LBER_H ON)
388     set(_HEADER_LIST)
389     if(HAVE_WINDOWS_H)
390       list(APPEND _HEADER_LIST "windows.h")
391     endif()
392     if(HAVE_SYS_TYPES_H)
393       list(APPEND _HEADER_LIST "sys/types.h")
394     endif()
395     list(APPEND _HEADER_LIST "ldap.h")
396
397     set(_SRC_STRING "")
398     foreach(_HEADER ${_HEADER_LIST})
399       set(_INCLUDE_STRING "${_INCLUDE_STRING}#include <${_HEADER}>\n")
400     endforeach()
401
402     set(_SRC_STRING
403       "
404       ${_INCLUDE_STRING}
405       int main(int argc, char ** argv)
406       {
407         BerValue *bvp = NULL;
408         BerElement *bep = ber_init(bvp);
409         ber_free(bep, 1);
410         return 0;
411       }"
412     )
413     set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DLDAP_DEPRECATED=1")
414     list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LDAP_LIB})
415     if(HAVE_LIBLBER)
416       list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LBER_LIB})
417     endif()
418     check_c_source_compiles("${_SRC_STRING}" NOT_NEED_LBER_H)
419
420     if(NOT_NEED_LBER_H)
421       set(NEED_LBER_H OFF)
422     else()
423       set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DNEED_LBER_H")
424     endif()
425   endif()
426
427 endif()
428
429 # No ldap, no ldaps.
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)
434   endif()
435 endif()
436
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)
440 endif()
441
442 # Check for idn
443 check_library_exists_concat("idn" idna_to_ascii_lz HAVE_LIBIDN)
444
445 # Check for symbol dlopen (same as HAVE_LIBDL)
446 check_library_exists("${CURL_LIBS}" dlopen "" HAVE_DLOPEN)
447
448 option(CURL_ZLIB "Set to ON to enable building cURL with zlib support." ON)
449 set(HAVE_LIBZ OFF)
450 set(HAVE_ZLIB_H OFF)
451 set(HAVE_ZLIB OFF)
452 if(CURL_ZLIB)
453   find_package(ZLIB QUIET)
454   if(ZLIB_FOUND)
455     set(HAVE_ZLIB_H ON)
456     set(HAVE_ZLIB ON)
457     set(HAVE_LIBZ ON)
458     list(APPEND CURL_LIBS ${ZLIB_LIBRARIES})
459     include_directories(${ZLIB_INCLUDE_DIRS})
460     list(APPEND CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIRS})
461   endif()
462 endif()
463
464 #libSSH2
465 option(CMAKE_USE_LIBSSH2 "Use libSSH2" ON)
466 mark_as_advanced(CMAKE_USE_LIBSSH2)
467 set(USE_LIBSSH2 OFF)
468 set(HAVE_LIBSSH2 OFF)
469 set(HAVE_LIBSSH2_H OFF)
470
471 if(CMAKE_USE_LIBSSH2)
472   find_package(LibSSH2)
473   if(LIBSSH2_FOUND)
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}")
478     set(HAVE_LIBSSH2 ON)
479     set(USE_LIBSSH2 ON)
480
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")
485
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 "")
494
495   endif(LIBSSH2_FOUND)
496 endif(CMAKE_USE_LIBSSH2)
497
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)
500
501 if(CMAKE_USE_GSSAPI)
502   find_package(GSS)
503
504   set(HAVE_GSSAPI ${GSS_FOUND})
505   if(GSS_FOUND)
506
507     message(STATUS "Found ${GSS_FLAVOUR} GSSAPI version: \"${GSS_VERSION}\"")
508
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)
513
514     if(GSS_FLAVOUR STREQUAL "Heimdal")
515       set(HAVE_GSSHEIMDAL ON)
516     else() # MIT
517       set(HAVE_GSSMIT ON)
518       set(_INCLUDE_LIST "")
519       if(HAVE_GSSAPI_GSSAPI_H)
520         list(APPEND _INCLUDE_LIST "gssapi/gssapi.h")
521       endif()
522       if(HAVE_GSSAPI_GSSAPI_GENERIC_H)
523         list(APPEND _INCLUDE_LIST "gssapi/gssapi_generic.h")
524       endif()
525       if(HAVE_GSSAPI_GSSAPI_KRB5_H)
526         list(APPEND _INCLUDE_LIST "gssapi/gssapi_krb5.h")
527       endif()
528
529       string(REPLACE ";" " " _COMPILER_FLAGS_STR "${GSS_COMPILER_FLAGS}")
530       string(REPLACE ";" " " _LINKER_FLAGS_STR "${GSS_LINKER_FLAGS}")
531
532       foreach(_dir ${GSS_LINK_DIRECTORIES})
533         set(_LINKER_FLAGS_STR "${_LINKER_FLAGS_STR} -L\"${_dir}\"")
534       endforeach()
535
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)
541       endif()
542
543     endif()
544
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})
551
552   else()
553     message(WARNING "GSSAPI support has been requested but no supporting libraries found. Skipping.")
554   endif()
555 endif()
556
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)
561 else()
562   unset(USE_UNIX_SOCKETS CACHE)
563 endif()
564
565
566 # Check for header files
567 if(NOT UNIX)
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)
575     if(HAVE_SSPI_H)
576       check_include_file_concat("schannel.h" HAVE_SCHANNEL_H)
577       set(USE_WINDOWS_SSPI ON)
578       if(HAVE_SCHANNEL_H)
579         set(USE_SCHANNEL ON)
580         set(SSL_ENABLED ON)
581       endif()
582     endif()
583   endif()
584 endif(NOT UNIX)
585
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)
622
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)
645
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)
656
657
658
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)
670     set(ssize_t long)
671   endif(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
672   if(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
673     set(ssize_t __int64)
674   endif(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
675 endif(NOT HAVE_SIZEOF_SSIZE_T)
676
677 # Different sizeofs, etc.
678
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
687
688 set(CURL_SIZEOF_LONG ${SIZEOF_LONG})
689
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)
699
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)
709
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)
720
721 if(HAVE_SIZEOF_LONG_LONG)
722   set(HAVE_LONGLONG 1)
723   set(HAVE_LL 1)
724 endif(HAVE_SIZEOF_LONG_LONG)
725
726 find_file(RANDOM_FILE urandom /dev)
727 mark_as_advanced(RANDOM_FILE)
728
729 # Check for some functions that are used
730 if(HAVE_LIBWS2_32)
731   set(CMAKE_REQUIRED_LIBRARIES ws2_32)
732 elseif(HAVE_LIBSOCKET)
733   set(CMAKE_REQUIRED_LIBRARIES socket)
734 endif()
735
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)
751   set(HAVE_STRCMPI)
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)
777     set(USE_OPENSSL 1)
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)
782
783 check_symbol_exists(gethostbyname   "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME)
784 check_symbol_exists(gethostbyname_r "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R)
785
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)
789   set(HAVE_SIGNAL 1)
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)
813
814 # symbol exists in win32, but function does not.
815 check_function_exists(inet_pton HAVE_INET_PTON)
816
817 # sigaction and sigsetjmp are special. Use special mechanism for
818 # detecting those, but only if previous attempt failed.
819 if(HAVE_SIGNAL_H)
820   check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION)
821 endif(HAVE_SIGNAL_H)
822
823 if(NOT HAVE_SIGSETJMP)
824   if(HAVE_SETJMP_H)
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)
829   endif(HAVE_SETJMP_H)
830 endif(NOT HAVE_SIGSETJMP)
831
832 # If there is no stricmp(), do not allow LDAP to parse URLs
833 if(NOT HAVE_STRICMP)
834   set(HAVE_LDAP_URL_PARSE 1)
835 endif(NOT HAVE_STRICMP)
836
837 # Do curl specific tests
838 foreach(CURL_TEST
839     HAVE_FCNTL_O_NONBLOCK
840     HAVE_IOCTLSOCKET
841     HAVE_IOCTLSOCKET_CAMEL
842     HAVE_IOCTLSOCKET_CAMEL_FIONBIO
843     HAVE_IOCTLSOCKET_FIONBIO
844     HAVE_IOCTL_FIONBIO
845     HAVE_IOCTL_SIOCGIFADDR
846     HAVE_SETSOCKOPT_SO_NONBLOCK
847     HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
848     TIME_WITH_SYS_TIME
849     HAVE_O_NONBLOCK
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
862     HAVE_SOCKLEN_T
863     HAVE_IN_ADDR_T
864     HAVE_BOOL_T
865     STDC_HEADERS
866     RETSIGTYPE_TEST
867     HAVE_INET_NTOA_R_DECL
868     HAVE_INET_NTOA_R_DECL_REENTRANT
869     HAVE_GETADDRINFO
870     HAVE_FILE_OFFSET_BITS
871     )
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)
877 foreach(CURL_TEST
878     HAVE_GLIBC_STRERROR_R
879     HAVE_POSIX_STRERROR_R
880     )
881   curl_internal_test_run(${CURL_TEST})
882 endforeach(CURL_TEST)
883
884 # Check for reentrant
885 foreach(CURL_TEST
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)
893   if(NOT ${CURL_TEST})
894     if(${CURL_TEST}_REENTRANT)
895       set(NEED_REENTRANT 1)
896     endif(${CURL_TEST}_REENTRANT)
897   endif(NOT ${CURL_TEST})
898 endforeach(CURL_TEST)
899
900 if(NEED_REENTRANT)
901   foreach(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)
908     set(${CURL_TEST} 0)
909     if(${CURL_TEST}_REENTRANT)
910       set(${CURL_TEST} 1)
911     endif(${CURL_TEST}_REENTRANT)
912   endforeach(CURL_TEST)
913 endif(NEED_REENTRANT)
914
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)
919
920 # Some other minor tests
921
922 if(NOT HAVE_IN_ADDR_T)
923   set(in_addr_t "unsigned long")
924 endif(NOT HAVE_IN_ADDR_T)
925
926 # Fix libz / zlib.h
927
928 if(NOT CURL_SPECIAL_LIBZ)
929   if(NOT HAVE_LIBZ)
930     set(HAVE_ZLIB_H 0)
931   endif(NOT HAVE_LIBZ)
932
933   if(NOT HAVE_ZLIB_H)
934     set(HAVE_LIBZ 0)
935   endif(NOT HAVE_ZLIB_H)
936 endif(NOT CURL_SPECIAL_LIBZ)
937
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)
946
947
948 # Check for nonblocking
949 set(HAVE_DISABLED_NONBLOCKING 1)
950 if(HAVE_FIONBIO OR
951     HAVE_IOCTLSOCKET OR
952     HAVE_IOCTLSOCKET_CASE OR
953     HAVE_O_NONBLOCK)
954   set(HAVE_DISABLED_NONBLOCKING)
955 endif(HAVE_FIONBIO OR
956   HAVE_IOCTLSOCKET OR
957   HAVE_IOCTLSOCKET_CASE OR
958   HAVE_O_NONBLOCK)
959
960 if(RETSIGTYPE_TEST)
961   set(RETSIGTYPE void)
962 else(RETSIGTYPE_TEST)
963   set(RETSIGTYPE int)
964 endif(RETSIGTYPE_TEST)
965
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)
981
982 if(HAVE_SOCKLEN_T)
983   set(CURL_TYPEOF_CURL_SOCKLEN_T "socklen_t")
984   if(WIN32)
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")
988   endif()
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)
992     message(FATAL_ERROR
993      "Check for sizeof socklen_t failed, see CMakeFiles/CMakerror.log")
994   endif()
995 else()
996   set(CURL_TYPEOF_CURL_SOCKLEN_T int)
997   set(CURL_SIZEOF_CURL_SOCKLEN_T ${SIZEOF_INT})
998 endif()
999
1000 # TODO test which of these headers are required for the typedefs used in curlbuild.h
1001 if(WIN32)
1002   set(CURL_PULL_WS2TCPIP_H ${HAVE_WS2TCPIP_H})
1003 else()
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})
1007 endif()
1008 set(CURL_PULL_STDINT_H ${HAVE_STDINT_H})
1009 set(CURL_PULL_INTTYPES_H ${HAVE_INTTYPES_H})
1010
1011 include(CMake/OtherTests.cmake)
1012
1013 add_definitions(-DHAVE_CONFIG_H)
1014
1015 # For windows, do not allow the compiler to use default target (Vista).
1016 if(WIN32)
1017   add_definitions(-D_WIN32_WINNT=0x0501)
1018 endif(WIN32)
1019
1020 if(MSVC)
1021   add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
1022 endif(MSVC)
1023
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})
1029
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})
1033
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})
1037
1038 endfunction()
1039
1040 add_subdirectory(lib)
1041 if(BUILD_CURL_EXE)
1042   add_subdirectory(src)
1043 endif()
1044 if(BUILD_CURL_TESTS)
1045   add_subdirectory(tests)
1046 endif()
1047
1048 # TODO support GNUTLS, NSS, POLARSSL, AXTLS, CYASSL, WINSSL, DARWINSSL
1049 if(USE_OPENSSL)
1050   set(SSL_ENABLED 1)
1051 endif()
1052
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
1057   if(${ARGN})
1058     set(_items ${_items} "${label}" PARENT_SCOPE)
1059   endif()
1060 endfunction()
1061
1062 # Clear list and try to detect available features
1063 set(_items)
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))
1083   _add_if("NTLM"        1)
1084   # TODO missing option (autoconf: --enable-ntlm-wb)
1085   _add_if("NTLM_WB"     NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
1086 endif()
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}")
1093
1094 # Clear list and try to detect available protocols
1095 set(_items)
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)
1121 list(SORT _items)
1122 string(REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}")
1123 message(STATUS "Enabled protocols: ${SUPPORT_PROTOCOLS}")
1124
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")
1135 if(CURL_STATICLIB)
1136   # Broken: LIBCURL_LIBS below; .a lib is not built
1137   message(WARNING "Static linking is broken!")
1138   set(ENABLE_STATIC         "no")
1139 else()
1140   set(ENABLE_STATIC         "no")
1141 endif()
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}")
1150 endforeach()
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")
1156 # SUPPORT_FEATURES
1157 # SUPPORT_PROTOCOLS
1158 set(VERSIONNUM              "${CURL_VERSION_NUM}")
1159
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"
1164         DESTINATION bin
1165         PERMISSIONS
1166           OWNER_READ OWNER_WRITE OWNER_EXECUTE
1167           GROUP_READ GROUP_EXECUTE
1168           WORLD_READ WORLD_EXECUTE)
1169
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)
1175
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")
1179 endif()
1180
1181 # Installation.
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"
1187     DESTINATION include
1188     FILES_MATCHING PATTERN "*.h"
1189     PATTERN "curlbuild.h" EXCLUDE)
1190
1191
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")
1198   endif()
1199 endif()