smtp: use the upload buffer size for scratch buffer malloc
[platform/upstream/curl.git] / CMakeLists.txt
1 #***************************************************************************
2 #                                  _   _ ____  _
3 #  Project                     ___| | | |  _ \| |
4 #                             / __| | | | |_) | |
5 #                            | (__| |_| |  _ <| |___
6 #                             \___|\___/|_| \_\_____|
7 #
8 # Copyright (C) 1998 - 2017, 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.12 FATAL_ERROR)
42 set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}")
43 include(Utilities)
44 include(Macros)
45 include(CMakeDependentOption)
46 include(CheckCCompilerFlag)
47
48 project( CURL C )
49
50 message(WARNING "the curl cmake build system is poorly maintained. Be aware")
51
52 file (READ ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS)
53 string (REGEX MATCH "#define LIBCURL_VERSION \"[^\"]*"
54   CURL_VERSION ${CURL_VERSION_H_CONTENTS})
55 string (REGEX REPLACE "[^\"]+\"" "" CURL_VERSION ${CURL_VERSION})
56 string (REGEX MATCH "#define LIBCURL_VERSION_NUM 0x[0-9a-fA-F]+"
57   CURL_VERSION_NUM ${CURL_VERSION_H_CONTENTS})
58 string (REGEX REPLACE "[^0]+0x" "" CURL_VERSION_NUM ${CURL_VERSION_NUM})
59
60 include_regular_expression("^.*$")    # Sukender: Is it necessary?
61
62 # Setup package meta-data
63 # SET(PACKAGE "curl")
64 message(STATUS "curl version=[${CURL_VERSION}]")
65 # SET(PACKAGE_TARNAME "curl")
66 # SET(PACKAGE_NAME "curl")
67 # SET(PACKAGE_VERSION "-")
68 # SET(PACKAGE_STRING "curl-")
69 # SET(PACKAGE_BUGREPORT "a suitable curl mailing list => https://curl.haxx.se/mail/")
70 set(OPERATING_SYSTEM "${CMAKE_SYSTEM_NAME}")
71 set(OS "\"${CMAKE_SYSTEM_NAME}\"")
72
73 include_directories(${PROJECT_BINARY_DIR}/include/curl)
74 include_directories( ${CURL_SOURCE_DIR}/include )
75
76 option(CURL_WERROR "Turn compiler warnings into errors" OFF)
77 option(PICKY_COMPILER "Enable picky compiler options" ON)
78 option(BUILD_CURL_EXE "Set to ON to build curl executable." ON)
79 option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF)
80 option(ENABLE_ARES "Set to ON to enable c-ares support" OFF)
81 if(WIN32)
82   option(CURL_STATIC_CRT "Set to ON to build libcurl with static CRT on Windows (/MT)." OFF)
83   option(ENABLE_INET_PTON "Set to OFF to prevent usage of inet_pton when building against modern SDKs while still requiring compatibility with older Windows versions, such as Windows XP, Windows Server 2003 etc." ON)
84 endif()
85
86 CMAKE_DEPENDENT_OPTION(ENABLE_THREADED_RESOLVER "Set to ON to enable threaded DNS lookup"
87         ON "NOT ENABLE_ARES"
88         OFF)
89
90 option(ENABLE_DEBUG "Set to ON to enable curl debug features" OFF)
91 option(ENABLE_CURLDEBUG "Set to ON to build with TrackMemory feature enabled" OFF)
92
93 if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)
94   if (PICKY_COMPILER)
95     foreach (_CCOPT -pedantic -Wall -W -Wpointer-arith -Wwrite-strings -Wunused -Wshadow -Winline -Wnested-externs -Wmissing-declarations -Wmissing-prototypes -Wno-long-long -Wfloat-equal -Wno-multichar -Wsign-compare -Wundef -Wno-format-nonliteral -Wendif-labels -Wstrict-prototypes -Wdeclaration-after-statement -Wstrict-aliasing=3 -Wcast-align -Wtype-limits -Wold-style-declaration -Wmissing-parameter-type -Wempty-body -Wclobbered -Wignored-qualifiers -Wconversion -Wno-sign-conversion -Wvla -Wdouble-promotion -Wno-system-headers)
96       # surprisingly, CHECK_C_COMPILER_FLAG needs a new variable to store each new
97       # test result in.
98       CHECK_C_COMPILER_FLAG(${_CCOPT} OPT${_CCOPT})
99       if(OPT${_CCOPT})
100         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_CCOPT}")
101       endif()
102     endforeach()
103   endif(PICKY_COMPILER)
104 endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)
105
106 if (ENABLE_DEBUG)
107   # DEBUGBUILD will be defined only for Debug builds
108   if(NOT CMAKE_VERSION VERSION_LESS 3.0)
109     set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:Debug>:DEBUGBUILD>)
110   else()
111     set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUGBUILD)
112   endif()
113   set(ENABLE_CURLDEBUG ON)
114 endif()
115
116 if (ENABLE_CURLDEBUG)
117   set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS CURLDEBUG)
118 endif()
119
120 # For debug libs and exes, add "-d" postfix
121 set(CMAKE_DEBUG_POSTFIX "-d" CACHE STRING "Set debug library postfix")
122
123 # initialize CURL_LIBS
124 set(CURL_LIBS "")
125
126 if(ENABLE_ARES)
127   set(USE_ARES 1)
128   find_package(CARES REQUIRED)
129   list(APPEND CURL_LIBS ${CARES_LIBRARY} )
130   set(CURL_LIBS ${CURL_LIBS} ${CARES_LIBRARY})
131 endif()
132
133 include(CurlSymbolHiding)
134
135 option(HTTP_ONLY "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF)
136 mark_as_advanced(HTTP_ONLY)
137 option(CURL_DISABLE_FTP "disables FTP" OFF)
138 mark_as_advanced(CURL_DISABLE_FTP)
139 option(CURL_DISABLE_LDAP "disables LDAP" OFF)
140 mark_as_advanced(CURL_DISABLE_LDAP)
141 option(CURL_DISABLE_TELNET "disables Telnet" OFF)
142 mark_as_advanced(CURL_DISABLE_TELNET)
143 option(CURL_DISABLE_DICT "disables DICT" OFF)
144 mark_as_advanced(CURL_DISABLE_DICT)
145 option(CURL_DISABLE_FILE "disables FILE" OFF)
146 mark_as_advanced(CURL_DISABLE_FILE)
147 option(CURL_DISABLE_TFTP "disables TFTP" OFF)
148 mark_as_advanced(CURL_DISABLE_TFTP)
149 option(CURL_DISABLE_HTTP "disables HTTP" OFF)
150 mark_as_advanced(CURL_DISABLE_HTTP)
151
152 option(CURL_DISABLE_LDAPS "to disable LDAPS" OFF)
153 mark_as_advanced(CURL_DISABLE_LDAPS)
154
155 option(CURL_DISABLE_RTSP "to disable RTSP" OFF)
156 mark_as_advanced(CURL_DISABLE_RTSP)
157 option(CURL_DISABLE_PROXY "to disable proxy" OFF)
158 mark_as_advanced(CURL_DISABLE_PROXY)
159 option(CURL_DISABLE_POP3 "to disable POP3" OFF)
160 mark_as_advanced(CURL_DISABLE_POP3)
161 option(CURL_DISABLE_IMAP "to disable IMAP" OFF)
162 mark_as_advanced(CURL_DISABLE_IMAP)
163 option(CURL_DISABLE_SMTP "to disable SMTP" OFF)
164 mark_as_advanced(CURL_DISABLE_SMTP)
165 option(CURL_DISABLE_GOPHER "to disable Gopher" OFF)
166 mark_as_advanced(CURL_DISABLE_GOPHER)
167
168 if(HTTP_ONLY)
169   set(CURL_DISABLE_FTP ON)
170   set(CURL_DISABLE_LDAP ON)
171   set(CURL_DISABLE_LDAPS ON)
172   set(CURL_DISABLE_TELNET ON)
173   set(CURL_DISABLE_DICT ON)
174   set(CURL_DISABLE_FILE ON)
175   set(CURL_DISABLE_TFTP ON)
176   set(CURL_DISABLE_RTSP ON)
177   set(CURL_DISABLE_POP3 ON)
178   set(CURL_DISABLE_IMAP ON)
179   set(CURL_DISABLE_SMTP ON)
180   set(CURL_DISABLE_GOPHER ON)
181 endif()
182
183 option(CURL_DISABLE_COOKIES "to disable cookies support" OFF)
184 mark_as_advanced(CURL_DISABLE_COOKIES)
185
186 option(CURL_DISABLE_CRYPTO_AUTH "to disable cryptographic authentication" OFF)
187 mark_as_advanced(CURL_DISABLE_CRYPTO_AUTH)
188 option(CURL_DISABLE_VERBOSE_STRINGS "to disable verbose strings" OFF)
189 mark_as_advanced(CURL_DISABLE_VERBOSE_STRINGS)
190 option(ENABLE_IPV6 "Define if you want to enable IPv6 support" ON)
191 mark_as_advanced(ENABLE_IPV6)
192 if(ENABLE_IPV6 AND NOT WIN32)
193   include(CheckStructHasMember)
194   check_struct_has_member("struct sockaddr_in6" sin6_addr "netinet/in.h"
195                           HAVE_SOCKADDR_IN6_SIN6_ADDR)
196   check_struct_has_member("struct sockaddr_in6" sin6_scope_id "netinet/in.h"
197                           HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
198   if(NOT HAVE_SOCKADDR_IN6_SIN6_ADDR)
199     message(WARNING "struct sockaddr_in6 not available, disabling IPv6 support")
200     # Force the feature off as this name is used as guard macro...
201     set(ENABLE_IPV6 OFF
202         CACHE BOOL "Define if you want to enable IPv6 support" FORCE)
203   endif()
204 endif()
205
206 CURL_NROFF_CHECK()
207 find_package(Perl)
208
209 CMAKE_DEPENDENT_OPTION(ENABLE_MANUAL "to provide the built-in manual"
210     ON "NROFF_USEFUL;PERL_FOUND"
211     OFF)
212
213 if(NOT PERL_FOUND)
214   message(STATUS "Perl not found, testing disabled.")
215   set(BUILD_TESTING OFF)
216 endif()
217 if(ENABLE_MANUAL)
218   set(USE_MANUAL ON)
219 endif()
220
221 # We need ansi c-flags, especially on HP
222 set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
223 set(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS})
224
225 if(CURL_STATIC_CRT)
226   set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
227   set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd")
228 endif()
229
230 # Disable warnings on Borland to avoid changing 3rd party code.
231 if(BORLAND)
232   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
233 endif(BORLAND)
234
235 if(CURL_WERROR)
236   if(MSVC_VERSION)
237     set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /WX")
238     set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /WX")
239   else()
240     # this assumes clang or gcc style options
241     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
242   endif()
243 endif(CURL_WERROR)
244
245 # If we are on AIX, do the _ALL_SOURCE magic
246 if(${CMAKE_SYSTEM_NAME} MATCHES AIX)
247   set(_ALL_SOURCE 1)
248 endif(${CMAKE_SYSTEM_NAME} MATCHES AIX)
249
250 # Include all the necessary files for macros
251 include (CheckFunctionExists)
252 include (CheckIncludeFile)
253 include (CheckIncludeFiles)
254 include (CheckLibraryExists)
255 include (CheckSymbolExists)
256 include (CheckTypeSize)
257 include (CheckCSourceCompiles)
258 include (CMakeDependentOption)
259
260 # On windows preload settings
261 if(WIN32)
262   set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_WINSOCKAPI_=")
263   include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/Platforms/WindowsCache.cmake)
264 endif(WIN32)
265
266 if(ENABLE_THREADED_RESOLVER)
267   find_package(Threads REQUIRED)
268   if(WIN32)
269     set(USE_THREADS_WIN32 ON)
270   else()
271     set(USE_THREADS_POSIX ${CMAKE_USE_PTHREADS_INIT})
272     set(HAVE_PTHREAD_H ${CMAKE_USE_PTHREADS_INIT})
273   endif()
274   set(CURL_LIBS ${CURL_LIBS} ${CMAKE_THREAD_LIBS_INIT})
275 endif()
276
277 # Check for all needed libraries
278 check_library_exists_concat("dl"     dlopen       HAVE_LIBDL)
279 check_library_exists_concat("socket" connect      HAVE_LIBSOCKET)
280 check_library_exists("c" gethostbyname "" NOT_NEED_LIBNSL)
281
282 # Yellowtab Zeta needs different libraries than BeOS 5.
283 if(BEOS)
284   set(NOT_NEED_LIBNSL 1)
285   check_library_exists_concat("bind" gethostbyname HAVE_LIBBIND)
286   check_library_exists_concat("bnetapi" closesocket HAVE_LIBBNETAPI)
287 endif(BEOS)
288
289 if(NOT NOT_NEED_LIBNSL)
290   check_library_exists_concat("nsl"    gethostbyname  HAVE_LIBNSL)
291 endif(NOT NOT_NEED_LIBNSL)
292
293 check_function_exists(gethostname HAVE_GETHOSTNAME)
294
295 if(WIN32)
296   check_library_exists_concat("ws2_32" getch        HAVE_LIBWS2_32)
297   check_library_exists_concat("winmm"  getch        HAVE_LIBWINMM)
298 endif()
299
300 # check SSL libraries
301 # TODO support GNUTLS, NSS, POLARSSL, AXTLS, CYASSL
302
303 if(APPLE)
304   option(CMAKE_USE_DARWINSSL "enable Apple OS native SSL/TLS" OFF)
305 endif()
306 if(WIN32)
307   option(CMAKE_USE_WINSSL "enable Windows native SSL/TLS" OFF)
308   cmake_dependent_option(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON
309     CMAKE_USE_WINSSL OFF)
310 endif()
311 option(CMAKE_USE_MBEDTLS "Enable mbedTLS for SSL/TLS" OFF)
312
313 set(openssl_default ON)
314 if(WIN32 OR CMAKE_USE_DARWINSSL OR CMAKE_USE_WINSSL OR CMAKE_USE_MBEDTLS)
315   set(openssl_default OFF)
316 endif()
317 option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${openssl_default})
318
319 collect_true(enabled_ssl_options enabled_ssl_options_count
320   CMAKE_USE_WINSSL
321   CMAKE_USE_DARWINSSL
322   CMAKE_USE_OPENSSL
323   CMAKE_USE_MBEDTLS
324 )
325 if(enabled_ssl_options_count GREATER 1)
326   message(FATAL_ERROR "Multiple SSL options specified: ${enabled_ssl_options}. Please pick at most one and disable the rest.")
327 endif()
328
329 if(CMAKE_USE_WINSSL)
330   set(SSL_ENABLED ON)
331   set(USE_SCHANNEL ON) # Windows native SSL/TLS support
332   set(USE_WINDOWS_SSPI ON) # CMAKE_USE_WINSSL implies CURL_WINDOWS_SSPI
333   list(APPEND CURL_LIBS "crypt32")
334 endif()
335 if(CURL_WINDOWS_SSPI)
336   set(USE_WINDOWS_SSPI ON)
337   set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DSECURITY_WIN32")
338 endif()
339
340 if(CMAKE_USE_DARWINSSL)
341   find_library(COREFOUNDATION_FRAMEWORK "CoreFoundation")
342   if(NOT COREFOUNDATION_FRAMEWORK)
343       message(FATAL_ERROR "CoreFoundation framework not found")
344   endif()
345
346   find_library(SECURITY_FRAMEWORK "Security")
347   if(NOT SECURITY_FRAMEWORK)
348      message(FATAL_ERROR "Security framework not found")
349   endif()
350
351   set(SSL_ENABLED ON)
352   set(USE_DARWINSSL ON)
353   list(APPEND CURL_LIBS "${COREFOUNDATION_FRAMEWORK}" "${SECURITY_FRAMEWORK}")
354 endif()
355
356 if(CMAKE_USE_OPENSSL)
357   find_package(OpenSSL REQUIRED)
358   set(SSL_ENABLED ON)
359   set(USE_OPENSSL ON)
360   set(HAVE_LIBCRYPTO ON)
361   set(HAVE_LIBSSL ON)
362   list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES})
363   include_directories(${OPENSSL_INCLUDE_DIR})
364   set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
365   check_include_file("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H)
366   check_include_file("openssl/engine.h" HAVE_OPENSSL_ENGINE_H)
367   check_include_file("openssl/err.h"    HAVE_OPENSSL_ERR_H)
368   check_include_file("openssl/pem.h"    HAVE_OPENSSL_PEM_H)
369   check_include_file("openssl/rsa.h"    HAVE_OPENSSL_RSA_H)
370   check_include_file("openssl/ssl.h"    HAVE_OPENSSL_SSL_H)
371   check_include_file("openssl/x509.h"   HAVE_OPENSSL_X509_H)
372   check_include_file("openssl/rand.h"   HAVE_OPENSSL_RAND_H)
373   check_symbol_exists(RAND_status "${CURL_INCLUDES}" HAVE_RAND_STATUS)
374   check_symbol_exists(RAND_screen "${CURL_INCLUDES}" HAVE_RAND_SCREEN)
375   check_symbol_exists(RAND_egd    "${CURL_INCLUDES}" HAVE_RAND_EGD)
376 endif()
377
378 if(CMAKE_USE_MBEDTLS)
379   find_package(MbedTLS REQUIRED)
380   set(SSL_ENABLED ON)
381   set(USE_MBEDTLS ON)
382   list(APPEND CURL_LIBS ${MBEDTLS_LIBRARIES})
383   include_directories(${MBEDTLS_INCLUDE_DIRS})
384 endif()
385
386 option(USE_NGHTTP2 "Use Nghttp2 library" OFF)
387 if(USE_NGHTTP2)
388   find_package(NGHTTP2 REQUIRED)
389   include_directories(${NGHTTP2_INCLUDE_DIRS})
390   list(APPEND CURL_LIBS ${NGHTTP2_LIBRARIES})
391 endif()
392
393 if(NOT CURL_DISABLE_LDAP)
394   if(WIN32)
395     option(USE_WIN32_LDAP "Use Windows LDAP implementation" ON)
396     if(USE_WIN32_LDAP)
397       check_library_exists_concat("wldap32" cldap_open HAVE_WLDAP32)
398       if(NOT HAVE_WLDAP32)
399         set(USE_WIN32_LDAP OFF)
400       endif()
401     endif()
402   endif()
403
404   option(CMAKE_USE_OPENLDAP "Use OpenLDAP code." OFF)
405   mark_as_advanced(CMAKE_USE_OPENLDAP)
406   set(CMAKE_LDAP_LIB "ldap" CACHE STRING "Name or full path to ldap library")
407   set(CMAKE_LBER_LIB "lber" CACHE STRING "Name or full path to lber library")
408
409   if(CMAKE_USE_OPENLDAP AND USE_WIN32_LDAP)
410     message(FATAL_ERROR "Cannot use USE_WIN32_LDAP and CMAKE_USE_OPENLDAP at the same time")
411   endif()
412
413   # Now that we know, we're not using windows LDAP...
414   if(USE_WIN32_LDAP)
415     check_include_file_concat("winldap.h" HAVE_WINLDAP_H)
416     check_include_file_concat("winber.h"  HAVE_WINBER_H)
417   else()
418     # Check for LDAP
419     set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES})
420     check_library_exists_concat(${CMAKE_LDAP_LIB} ldap_init HAVE_LIBLDAP)
421     check_library_exists_concat(${CMAKE_LBER_LIB} ber_init HAVE_LIBLBER)
422
423     set(CMAKE_REQUIRED_INCLUDES_BAK ${CMAKE_REQUIRED_INCLUDES})
424     set(CMAKE_LDAP_INCLUDE_DIR "" CACHE STRING "Path to LDAP include directory")
425     if(CMAKE_LDAP_INCLUDE_DIR)
426       list(APPEND CMAKE_REQUIRED_INCLUDES ${CMAKE_LDAP_INCLUDE_DIR})
427     endif()
428     check_include_file_concat("ldap.h"           HAVE_LDAP_H)
429     check_include_file_concat("lber.h"           HAVE_LBER_H)
430
431     if(NOT HAVE_LDAP_H)
432       message(STATUS "LDAP_H not found CURL_DISABLE_LDAP set ON")
433       set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
434       set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_BAK}) #LDAP includes won't be used
435     elseif(NOT HAVE_LIBLDAP)
436       message(STATUS "LDAP library '${CMAKE_LDAP_LIB}' not found CURL_DISABLE_LDAP set ON")
437       set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
438       set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_BAK}) #LDAP includes won't be used
439     else()
440       if(CMAKE_USE_OPENLDAP)
441         set(USE_OPENLDAP ON)
442       endif()
443       if(CMAKE_LDAP_INCLUDE_DIR)
444         include_directories(${CMAKE_LDAP_INCLUDE_DIR})
445       endif()
446       set(NEED_LBER_H ON)
447       set(_HEADER_LIST)
448       if(HAVE_WINDOWS_H)
449         list(APPEND _HEADER_LIST "windows.h")
450       endif()
451       if(HAVE_SYS_TYPES_H)
452         list(APPEND _HEADER_LIST "sys/types.h")
453       endif()
454       list(APPEND _HEADER_LIST "ldap.h")
455
456       set(_SRC_STRING "")
457       foreach(_HEADER ${_HEADER_LIST})
458         set(_INCLUDE_STRING "${_INCLUDE_STRING}#include <${_HEADER}>\n")
459       endforeach()
460
461       set(_SRC_STRING
462         "
463         ${_INCLUDE_STRING}
464         int main(int argc, char ** argv)
465         {
466           BerValue *bvp = NULL;
467           BerElement *bep = ber_init(bvp);
468           ber_free(bep, 1);
469           return 0;
470         }"
471       )
472       set(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -DLDAP_DEPRECATED=1")
473       list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LDAP_LIB})
474       if(HAVE_LIBLBER)
475         list(APPEND CMAKE_REQUIRED_LIBRARIES ${CMAKE_LBER_LIB})
476       endif()
477       check_c_source_compiles("${_SRC_STRING}" NOT_NEED_LBER_H)
478
479       if(NOT_NEED_LBER_H)
480         set(NEED_LBER_H OFF)
481       else()
482         set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DNEED_LBER_H")
483       endif()
484     endif()
485   endif()
486
487 endif()
488
489 # No ldap, no ldaps.
490 if(CURL_DISABLE_LDAP)
491   if(NOT CURL_DISABLE_LDAPS)
492     message(STATUS "LDAP needs to be enabled to support LDAPS")
493     set(CURL_DISABLE_LDAPS ON CACHE BOOL "" FORCE)
494   endif()
495 endif()
496
497 if(NOT CURL_DISABLE_LDAPS)
498   check_include_file_concat("ldap_ssl.h" HAVE_LDAP_SSL_H)
499   check_include_file_concat("ldapssl.h"  HAVE_LDAPSSL_H)
500 endif()
501
502 # Check for idn
503 check_library_exists_concat("idn2" idn2_lookup_ul HAVE_LIBIDN2)
504
505 # Check for symbol dlopen (same as HAVE_LIBDL)
506 check_library_exists("${CURL_LIBS}" dlopen "" HAVE_DLOPEN)
507
508 option(CURL_ZLIB "Set to ON to enable building curl with zlib support." ON)
509 set(HAVE_LIBZ OFF)
510 set(HAVE_ZLIB_H OFF)
511 set(HAVE_ZLIB OFF)
512 if(CURL_ZLIB)
513   find_package(ZLIB QUIET)
514   if(ZLIB_FOUND)
515     set(HAVE_ZLIB_H ON)
516     set(HAVE_ZLIB ON)
517     set(HAVE_LIBZ ON)
518     list(APPEND CURL_LIBS ${ZLIB_LIBRARIES})
519     include_directories(${ZLIB_INCLUDE_DIRS})
520     list(APPEND CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIRS})
521   endif()
522 endif()
523
524 #libSSH2
525 option(CMAKE_USE_LIBSSH2 "Use libSSH2" ON)
526 mark_as_advanced(CMAKE_USE_LIBSSH2)
527 set(USE_LIBSSH2 OFF)
528 set(HAVE_LIBSSH2 OFF)
529 set(HAVE_LIBSSH2_H OFF)
530
531 if(CMAKE_USE_LIBSSH2)
532   find_package(LibSSH2)
533   if(LIBSSH2_FOUND)
534     list(APPEND CURL_LIBS ${LIBSSH2_LIBRARY})
535     set(CMAKE_REQUIRED_LIBRARIES ${LIBSSH2_LIBRARY})
536     list(APPEND CMAKE_REQUIRED_INCLUDES "${LIBSSH2_INCLUDE_DIR}")
537     include_directories("${LIBSSH2_INCLUDE_DIR}")
538     set(HAVE_LIBSSH2 ON)
539     set(USE_LIBSSH2 ON)
540
541     # find_package has already found the headers
542     set(HAVE_LIBSSH2_H ON)
543     set(CURL_INCLUDES ${CURL_INCLUDES} "${LIBSSH2_INCLUDE_DIR}/libssh2.h")
544     set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -DHAVE_LIBSSH2_H")
545
546     # now check for specific libssh2 symbols as they were added in different versions
547     set(CMAKE_EXTRA_INCLUDE_FILES "libssh2.h")
548     check_function_exists(libssh2_version           HAVE_LIBSSH2_VERSION)
549     check_function_exists(libssh2_init              HAVE_LIBSSH2_INIT)
550     check_function_exists(libssh2_exit              HAVE_LIBSSH2_EXIT)
551     check_function_exists(libssh2_scp_send64        HAVE_LIBSSH2_SCP_SEND64)
552     check_function_exists(libssh2_session_handshake HAVE_LIBSSH2_SESSION_HANDSHAKE)
553     set(CMAKE_EXTRA_INCLUDE_FILES "")
554
555   endif(LIBSSH2_FOUND)
556 endif(CMAKE_USE_LIBSSH2)
557
558 option(CMAKE_USE_GSSAPI "Use GSSAPI implementation (right now only Heimdal is supported with CMake build)" OFF)
559 mark_as_advanced(CMAKE_USE_GSSAPI)
560
561 if(CMAKE_USE_GSSAPI)
562   find_package(GSS)
563
564   set(HAVE_GSSAPI ${GSS_FOUND})
565   if(GSS_FOUND)
566
567     message(STATUS "Found ${GSS_FLAVOUR} GSSAPI version: \"${GSS_VERSION}\"")
568
569     list(APPEND CMAKE_REQUIRED_INCLUDES ${GSS_INCLUDE_DIRECTORIES})
570     check_include_file_concat("gssapi/gssapi.h"  HAVE_GSSAPI_GSSAPI_H)
571     check_include_file_concat("gssapi/gssapi_generic.h" HAVE_GSSAPI_GSSAPI_GENERIC_H)
572     check_include_file_concat("gssapi/gssapi_krb5.h" HAVE_GSSAPI_GSSAPI_KRB5_H)
573
574     if(GSS_FLAVOUR STREQUAL "Heimdal")
575       set(HAVE_GSSHEIMDAL ON)
576     else() # MIT
577       set(HAVE_GSSMIT ON)
578       set(_INCLUDE_LIST "")
579       if(HAVE_GSSAPI_GSSAPI_H)
580         list(APPEND _INCLUDE_LIST "gssapi/gssapi.h")
581       endif()
582       if(HAVE_GSSAPI_GSSAPI_GENERIC_H)
583         list(APPEND _INCLUDE_LIST "gssapi/gssapi_generic.h")
584       endif()
585       if(HAVE_GSSAPI_GSSAPI_KRB5_H)
586         list(APPEND _INCLUDE_LIST "gssapi/gssapi_krb5.h")
587       endif()
588
589       string(REPLACE ";" " " _COMPILER_FLAGS_STR "${GSS_COMPILER_FLAGS}")
590       string(REPLACE ";" " " _LINKER_FLAGS_STR "${GSS_LINKER_FLAGS}")
591
592       foreach(_dir ${GSS_LINK_DIRECTORIES})
593         set(_LINKER_FLAGS_STR "${_LINKER_FLAGS_STR} -L\"${_dir}\"")
594       endforeach()
595
596       set(CMAKE_REQUIRED_FLAGS "${_COMPILER_FLAGS_STR} ${_LINKER_FLAGS_STR}")
597       set(CMAKE_REQUIRED_LIBRARIES ${GSS_LIBRARIES})
598       check_symbol_exists("GSS_C_NT_HOSTBASED_SERVICE" ${_INCLUDE_LIST} HAVE_GSS_C_NT_HOSTBASED_SERVICE)
599       if(NOT HAVE_GSS_C_NT_HOSTBASED_SERVICE)
600         set(HAVE_OLD_GSSMIT ON)
601       endif()
602
603     endif()
604
605     include_directories(${GSS_INCLUDE_DIRECTORIES})
606     link_directories(${GSS_LINK_DIRECTORIES})
607     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GSS_COMPILER_FLAGS}")
608     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${GSS_LINKER_FLAGS}")
609     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GSS_LINKER_FLAGS}")
610     list(APPEND CURL_LIBS ${GSS_LIBRARIES})
611
612   else()
613     message(WARNING "GSSAPI support has been requested but no supporting libraries found. Skipping.")
614   endif()
615 endif()
616
617 option(ENABLE_UNIX_SOCKETS "Define if you want Unix domain sockets support" ON)
618 if(ENABLE_UNIX_SOCKETS)
619   include(CheckStructHasMember)
620   check_struct_has_member("struct sockaddr_un" sun_path "sys/un.h" USE_UNIX_SOCKETS)
621 else()
622   unset(USE_UNIX_SOCKETS CACHE)
623 endif()
624
625
626 #
627 # CA handling
628 #
629 set(CURL_CA_BUNDLE "auto" CACHE STRING
630     "Path to the CA bundle. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
631 set(CURL_CA_FALLBACK OFF CACHE BOOL
632     "Set ON to use built-in CA store of TLS backend. Defaults to OFF")
633 set(CURL_CA_PATH "auto" CACHE STRING
634     "Location of default CA path. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
635
636 if("${CURL_CA_BUNDLE}" STREQUAL "")
637     message(FATAL_ERROR "Invalid value of CURL_CA_BUNDLE. Use 'none', 'auto' or file path.")
638 elseif("${CURL_CA_BUNDLE}" STREQUAL "none")
639     unset(CURL_CA_BUNDLE CACHE)
640 elseif("${CURL_CA_BUNDLE}" STREQUAL "auto")
641     unset(CURL_CA_BUNDLE CACHE)
642     set(CURL_CA_BUNDLE_AUTODETECT TRUE)
643 else()
644     set(CURL_CA_BUNDLE_SET TRUE)
645 endif()
646
647 if("${CURL_CA_PATH}" STREQUAL "")
648     message(FATAL_ERROR "Invalid value of CURL_CA_PATH. Use 'none', 'auto' or directory path.")
649 elseif("${CURL_CA_PATH}" STREQUAL "none")
650     unset(CURL_CA_PATH CACHE)
651 elseif("${CURL_CA_PATH}" STREQUAL "auto")
652     unset(CURL_CA_PATH CACHE)
653     set(CURL_CA_PATH_AUTODETECT TRUE)
654 else()
655     set(CURL_CA_PATH_SET TRUE)
656 endif()
657
658 if(CURL_CA_BUNDLE_SET AND CURL_CA_PATH_AUTODETECT)
659     # Skip autodetection of unset CA path because CA bundle is set explicitly
660 elseif(CURL_CA_PATH_SET AND CURL_CA_BUNDLE_AUTODETECT)
661     # Skip autodetection of unset CA bundle because CA path is set explicitly
662 elseif(CURL_CA_PATH_AUTODETECT OR CURL_CA_BUNDLE_AUTODETECT)
663     # first try autodetecting a CA bundle, then a CA path
664
665     if(CURL_CA_BUNDLE_AUTODETECT)
666         set(SEARCH_CA_BUNDLE_PATHS
667             /etc/ssl/certs/ca-certificates.crt
668             /etc/pki/tls/certs/ca-bundle.crt
669             /usr/share/ssl/certs/ca-bundle.crt
670             /usr/local/share/certs/ca-root-nss.crt
671             /etc/ssl/cert.pem)
672
673         foreach(SEARCH_CA_BUNDLE_PATH ${SEARCH_CA_BUNDLE_PATHS})
674             if(EXISTS "${SEARCH_CA_BUNDLE_PATH}")
675                 message(STATUS "Found CA bundle: ${SEARCH_CA_BUNDLE_PATH}")
676                 set(CURL_CA_BUNDLE "${SEARCH_CA_BUNDLE_PATH}")
677                 set(CURL_CA_BUNDLE_SET TRUE CACHE BOOL "Path to the CA bundle has been set")
678                 break()
679             endif()
680         endforeach()
681     endif()
682
683     if(CURL_CA_PATH_AUTODETECT AND (NOT CURL_CA_PATH_SET))
684         if(EXISTS "/etc/ssl/certs")
685             set(CURL_CA_PATH "/etc/ssl/certs")
686             set(CURL_CA_PATH_SET TRUE CACHE BOOL "Path to the CA bundle has been set")
687         endif()
688     endif()
689 endif()
690
691 if(CURL_CA_PATH_SET AND NOT USE_OPENSSL AND NOT USE_MBEDTLS)
692     message(FATAL_ERROR
693             "CA path only supported by OpenSSL, GnuTLS or mbed TLS. "
694             "Set CURL_CA_PATH=none or enable one of those TLS backends.")
695 endif()
696
697
698 # Check for header files
699 if(NOT UNIX)
700   check_include_file_concat("windows.h"      HAVE_WINDOWS_H)
701   check_include_file_concat("winsock.h"      HAVE_WINSOCK_H)
702   check_include_file_concat("ws2tcpip.h"     HAVE_WS2TCPIP_H)
703   check_include_file_concat("winsock2.h"     HAVE_WINSOCK2_H)
704   if(NOT CURL_WINDOWS_SSPI AND USE_OPENSSL)
705     set(CURL_LIBS ${CURL_LIBS} "crypt32")
706   endif()
707 endif(NOT UNIX)
708
709 check_include_file_concat("stdio.h"          HAVE_STDIO_H)
710 check_include_file_concat("inttypes.h"       HAVE_INTTYPES_H)
711 check_include_file_concat("sys/filio.h"      HAVE_SYS_FILIO_H)
712 check_include_file_concat("sys/ioctl.h"      HAVE_SYS_IOCTL_H)
713 check_include_file_concat("sys/param.h"      HAVE_SYS_PARAM_H)
714 check_include_file_concat("sys/poll.h"       HAVE_SYS_POLL_H)
715 check_include_file_concat("sys/resource.h"   HAVE_SYS_RESOURCE_H)
716 check_include_file_concat("sys/select.h"     HAVE_SYS_SELECT_H)
717 check_include_file_concat("sys/socket.h"     HAVE_SYS_SOCKET_H)
718 check_include_file_concat("sys/sockio.h"     HAVE_SYS_SOCKIO_H)
719 check_include_file_concat("sys/stat.h"       HAVE_SYS_STAT_H)
720 check_include_file_concat("sys/time.h"       HAVE_SYS_TIME_H)
721 check_include_file_concat("sys/types.h"      HAVE_SYS_TYPES_H)
722 check_include_file_concat("sys/uio.h"        HAVE_SYS_UIO_H)
723 check_include_file_concat("sys/un.h"         HAVE_SYS_UN_H)
724 check_include_file_concat("sys/utime.h"      HAVE_SYS_UTIME_H)
725 check_include_file_concat("sys/xattr.h"      HAVE_SYS_XATTR_H)
726 check_include_file_concat("alloca.h"         HAVE_ALLOCA_H)
727 check_include_file_concat("arpa/inet.h"      HAVE_ARPA_INET_H)
728 check_include_file_concat("arpa/tftp.h"      HAVE_ARPA_TFTP_H)
729 check_include_file_concat("assert.h"         HAVE_ASSERT_H)
730 check_include_file_concat("crypto.h"         HAVE_CRYPTO_H)
731 check_include_file_concat("des.h"            HAVE_DES_H)
732 check_include_file_concat("err.h"            HAVE_ERR_H)
733 check_include_file_concat("errno.h"          HAVE_ERRNO_H)
734 check_include_file_concat("fcntl.h"          HAVE_FCNTL_H)
735 check_include_file_concat("idn2.h"           HAVE_IDN2_H)
736 check_include_file_concat("ifaddrs.h"        HAVE_IFADDRS_H)
737 check_include_file_concat("io.h"             HAVE_IO_H)
738 check_include_file_concat("krb.h"            HAVE_KRB_H)
739 check_include_file_concat("libgen.h"         HAVE_LIBGEN_H)
740 check_include_file_concat("locale.h"         HAVE_LOCALE_H)
741 check_include_file_concat("net/if.h"         HAVE_NET_IF_H)
742 check_include_file_concat("netdb.h"          HAVE_NETDB_H)
743 check_include_file_concat("netinet/in.h"     HAVE_NETINET_IN_H)
744 check_include_file_concat("netinet/tcp.h"    HAVE_NETINET_TCP_H)
745
746 check_include_file_concat("pem.h"            HAVE_PEM_H)
747 check_include_file_concat("poll.h"           HAVE_POLL_H)
748 check_include_file_concat("pwd.h"            HAVE_PWD_H)
749 check_include_file_concat("rsa.h"            HAVE_RSA_H)
750 check_include_file_concat("setjmp.h"         HAVE_SETJMP_H)
751 check_include_file_concat("sgtty.h"          HAVE_SGTTY_H)
752 check_include_file_concat("signal.h"         HAVE_SIGNAL_H)
753 check_include_file_concat("ssl.h"            HAVE_SSL_H)
754 check_include_file_concat("stdbool.h"        HAVE_STDBOOL_H)
755 check_include_file_concat("stdint.h"         HAVE_STDINT_H)
756 check_include_file_concat("stdio.h"          HAVE_STDIO_H)
757 check_include_file_concat("stdlib.h"         HAVE_STDLIB_H)
758 check_include_file_concat("string.h"         HAVE_STRING_H)
759 check_include_file_concat("strings.h"        HAVE_STRINGS_H)
760 check_include_file_concat("stropts.h"        HAVE_STROPTS_H)
761 check_include_file_concat("termio.h"         HAVE_TERMIO_H)
762 check_include_file_concat("termios.h"        HAVE_TERMIOS_H)
763 check_include_file_concat("time.h"           HAVE_TIME_H)
764 check_include_file_concat("unistd.h"         HAVE_UNISTD_H)
765 check_include_file_concat("utime.h"          HAVE_UTIME_H)
766 check_include_file_concat("x509.h"           HAVE_X509_H)
767
768 check_include_file_concat("process.h"        HAVE_PROCESS_H)
769 check_include_file_concat("stddef.h"         HAVE_STDDEF_H)
770 check_include_file_concat("dlfcn.h"          HAVE_DLFCN_H)
771 check_include_file_concat("malloc.h"         HAVE_MALLOC_H)
772 check_include_file_concat("memory.h"         HAVE_MEMORY_H)
773 check_include_file_concat("netinet/if_ether.h" HAVE_NETINET_IF_ETHER_H)
774 check_include_file_concat("stdint.h"        HAVE_STDINT_H)
775 check_include_file_concat("sockio.h"        HAVE_SOCKIO_H)
776 check_include_file_concat("sys/utsname.h"   HAVE_SYS_UTSNAME_H)
777
778 check_type_size(size_t  SIZEOF_SIZE_T)
779 check_type_size(ssize_t  SIZEOF_SSIZE_T)
780 check_type_size("long long"  SIZEOF_LONG_LONG)
781 check_type_size("long"  SIZEOF_LONG)
782 check_type_size("short"  SIZEOF_SHORT)
783 check_type_size("int"  SIZEOF_INT)
784 check_type_size("__int64"  SIZEOF___INT64)
785 check_type_size("long double"  SIZEOF_LONG_DOUBLE)
786 check_type_size("time_t"  SIZEOF_TIME_T)
787 if(NOT HAVE_SIZEOF_SSIZE_T)
788   if(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
789     set(ssize_t long)
790   endif(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
791   if(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
792     set(ssize_t __int64)
793   endif(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
794 endif(NOT HAVE_SIZEOF_SSIZE_T)
795 # off_t is sized later, after the HAVE_FILE_OFFSET_BITS test
796
797 if(HAVE_SIZEOF_LONG_LONG)
798   set(HAVE_LONGLONG 1)
799   set(HAVE_LL 1)
800 endif(HAVE_SIZEOF_LONG_LONG)
801
802 find_file(RANDOM_FILE urandom /dev)
803 mark_as_advanced(RANDOM_FILE)
804
805 # Check for some functions that are used
806 if(HAVE_LIBWS2_32)
807   set(CMAKE_REQUIRED_LIBRARIES ws2_32)
808 elseif(HAVE_LIBSOCKET)
809   set(CMAKE_REQUIRED_LIBRARIES socket)
810 endif()
811
812 check_symbol_exists(basename      "${CURL_INCLUDES}" HAVE_BASENAME)
813 check_symbol_exists(socket        "${CURL_INCLUDES}" HAVE_SOCKET)
814 # poll on macOS is unreliable, it first did not exist, then was broken until
815 # fixed in 10.9 only to break again in 10.12.
816 if(NOT APPLE)
817   check_symbol_exists(poll        "${CURL_INCLUDES}" HAVE_POLL)
818 endif()
819 check_symbol_exists(select        "${CURL_INCLUDES}" HAVE_SELECT)
820 check_symbol_exists(strdup        "${CURL_INCLUDES}" HAVE_STRDUP)
821 check_symbol_exists(strstr        "${CURL_INCLUDES}" HAVE_STRSTR)
822 check_symbol_exists(strtok_r      "${CURL_INCLUDES}" HAVE_STRTOK_R)
823 check_symbol_exists(strftime      "${CURL_INCLUDES}" HAVE_STRFTIME)
824 check_symbol_exists(uname         "${CURL_INCLUDES}" HAVE_UNAME)
825 check_symbol_exists(strcasecmp    "${CURL_INCLUDES}" HAVE_STRCASECMP)
826 check_symbol_exists(stricmp       "${CURL_INCLUDES}" HAVE_STRICMP)
827 check_symbol_exists(strcmpi       "${CURL_INCLUDES}" HAVE_STRCMPI)
828 check_symbol_exists(strncmpi      "${CURL_INCLUDES}" HAVE_STRNCMPI)
829 check_symbol_exists(alarm         "${CURL_INCLUDES}" HAVE_ALARM)
830 if(NOT HAVE_STRNCMPI)
831   set(HAVE_STRCMPI)
832 endif(NOT HAVE_STRNCMPI)
833 check_symbol_exists(gethostbyaddr "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR)
834 check_symbol_exists(gethostbyaddr_r "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR_R)
835 check_symbol_exists(gettimeofday  "${CURL_INCLUDES}" HAVE_GETTIMEOFDAY)
836 check_symbol_exists(inet_addr     "${CURL_INCLUDES}" HAVE_INET_ADDR)
837 check_symbol_exists(inet_ntoa     "${CURL_INCLUDES}" HAVE_INET_NTOA)
838 check_symbol_exists(inet_ntoa_r   "${CURL_INCLUDES}" HAVE_INET_NTOA_R)
839 check_symbol_exists(tcsetattr     "${CURL_INCLUDES}" HAVE_TCSETATTR)
840 check_symbol_exists(tcgetattr     "${CURL_INCLUDES}" HAVE_TCGETATTR)
841 check_symbol_exists(perror        "${CURL_INCLUDES}" HAVE_PERROR)
842 check_symbol_exists(closesocket   "${CURL_INCLUDES}" HAVE_CLOSESOCKET)
843 check_symbol_exists(setvbuf       "${CURL_INCLUDES}" HAVE_SETVBUF)
844 check_symbol_exists(sigsetjmp     "${CURL_INCLUDES}" HAVE_SIGSETJMP)
845 check_symbol_exists(getpass_r     "${CURL_INCLUDES}" HAVE_GETPASS_R)
846 check_symbol_exists(strlcat       "${CURL_INCLUDES}" HAVE_STRLCAT)
847 check_symbol_exists(getpwuid      "${CURL_INCLUDES}" HAVE_GETPWUID)
848 check_symbol_exists(geteuid       "${CURL_INCLUDES}" HAVE_GETEUID)
849 check_symbol_exists(utime         "${CURL_INCLUDES}" HAVE_UTIME)
850 check_symbol_exists(gmtime_r      "${CURL_INCLUDES}" HAVE_GMTIME_R)
851 check_symbol_exists(localtime_r   "${CURL_INCLUDES}" HAVE_LOCALTIME_R)
852
853 check_symbol_exists(gethostbyname   "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME)
854 check_symbol_exists(gethostbyname_r "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R)
855
856 check_symbol_exists(signal        "${CURL_INCLUDES}" HAVE_SIGNAL_FUNC)
857 check_symbol_exists(SIGALRM       "${CURL_INCLUDES}" HAVE_SIGNAL_MACRO)
858 if(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO)
859   set(HAVE_SIGNAL 1)
860 endif(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO)
861 check_symbol_exists(uname          "${CURL_INCLUDES}" HAVE_UNAME)
862 check_symbol_exists(strtoll        "${CURL_INCLUDES}" HAVE_STRTOLL)
863 check_symbol_exists(_strtoi64      "${CURL_INCLUDES}" HAVE__STRTOI64)
864 check_symbol_exists(strerror_r     "${CURL_INCLUDES}" HAVE_STRERROR_R)
865 check_symbol_exists(siginterrupt   "${CURL_INCLUDES}" HAVE_SIGINTERRUPT)
866 check_symbol_exists(perror         "${CURL_INCLUDES}" HAVE_PERROR)
867 check_symbol_exists(fork           "${CURL_INCLUDES}" HAVE_FORK)
868 check_symbol_exists(getaddrinfo    "${CURL_INCLUDES}" HAVE_GETADDRINFO)
869 check_symbol_exists(freeaddrinfo   "${CURL_INCLUDES}" HAVE_FREEADDRINFO)
870 check_symbol_exists(freeifaddrs    "${CURL_INCLUDES}" HAVE_FREEIFADDRS)
871 check_symbol_exists(pipe           "${CURL_INCLUDES}" HAVE_PIPE)
872 check_symbol_exists(ftruncate      "${CURL_INCLUDES}" HAVE_FTRUNCATE)
873 check_symbol_exists(getprotobyname "${CURL_INCLUDES}" HAVE_GETPROTOBYNAME)
874 check_symbol_exists(getrlimit      "${CURL_INCLUDES}" HAVE_GETRLIMIT)
875 check_symbol_exists(setlocale      "${CURL_INCLUDES}" HAVE_SETLOCALE)
876 check_symbol_exists(setmode        "${CURL_INCLUDES}" HAVE_SETMODE)
877 check_symbol_exists(setrlimit      "${CURL_INCLUDES}" HAVE_SETRLIMIT)
878 check_symbol_exists(fcntl          "${CURL_INCLUDES}" HAVE_FCNTL)
879 check_symbol_exists(ioctl          "${CURL_INCLUDES}" HAVE_IOCTL)
880 check_symbol_exists(setsockopt     "${CURL_INCLUDES}" HAVE_SETSOCKOPT)
881 check_function_exists(mach_absolute_time HAVE_MACH_ABSOLUTE_TIME)
882
883 # symbol exists in win32, but function does not.
884 if(WIN32)
885   if(ENABLE_INET_PTON)
886     check_function_exists(inet_pton HAVE_INET_PTON)
887     # _WIN32_WINNT_VISTA (0x0600)
888     add_definitions(-D_WIN32_WINNT=0x0600)
889   else()
890     # _WIN32_WINNT_WINXP (0x0501)
891     add_definitions(-D_WIN32_WINNT=0x0501)
892   endif()
893 else()
894     check_function_exists(inet_pton HAVE_INET_PTON)
895 endif()
896
897 check_symbol_exists(fsetxattr "${CURL_INCLUDES}" HAVE_FSETXATTR)
898 if(HAVE_FSETXATTR)
899   foreach(CURL_TEST HAVE_FSETXATTR_5 HAVE_FSETXATTR_6)
900     curl_internal_test_run(${CURL_TEST})
901   endforeach(CURL_TEST)
902 endif(HAVE_FSETXATTR)
903
904 # sigaction and sigsetjmp are special. Use special mechanism for
905 # detecting those, but only if previous attempt failed.
906 if(HAVE_SIGNAL_H)
907   check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION)
908 endif(HAVE_SIGNAL_H)
909
910 if(NOT HAVE_SIGSETJMP)
911   if(HAVE_SETJMP_H)
912     check_symbol_exists(sigsetjmp "setjmp.h" HAVE_MACRO_SIGSETJMP)
913     if(HAVE_MACRO_SIGSETJMP)
914       set(HAVE_SIGSETJMP 1)
915     endif(HAVE_MACRO_SIGSETJMP)
916   endif(HAVE_SETJMP_H)
917 endif(NOT HAVE_SIGSETJMP)
918
919 # If there is no stricmp(), do not allow LDAP to parse URLs
920 if(NOT HAVE_STRICMP)
921   set(HAVE_LDAP_URL_PARSE 1)
922 endif(NOT HAVE_STRICMP)
923
924 # Do curl specific tests
925 foreach(CURL_TEST
926     HAVE_FCNTL_O_NONBLOCK
927     HAVE_IOCTLSOCKET
928     HAVE_IOCTLSOCKET_CAMEL
929     HAVE_IOCTLSOCKET_CAMEL_FIONBIO
930     HAVE_IOCTLSOCKET_FIONBIO
931     HAVE_IOCTL_FIONBIO
932     HAVE_IOCTL_SIOCGIFADDR
933     HAVE_SETSOCKOPT_SO_NONBLOCK
934     HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
935     TIME_WITH_SYS_TIME
936     HAVE_O_NONBLOCK
937     HAVE_GETHOSTBYADDR_R_5
938     HAVE_GETHOSTBYADDR_R_7
939     HAVE_GETHOSTBYADDR_R_8
940     HAVE_GETHOSTBYADDR_R_5_REENTRANT
941     HAVE_GETHOSTBYADDR_R_7_REENTRANT
942     HAVE_GETHOSTBYADDR_R_8_REENTRANT
943     HAVE_GETHOSTBYNAME_R_3
944     HAVE_GETHOSTBYNAME_R_5
945     HAVE_GETHOSTBYNAME_R_6
946     HAVE_GETHOSTBYNAME_R_3_REENTRANT
947     HAVE_GETHOSTBYNAME_R_5_REENTRANT
948     HAVE_GETHOSTBYNAME_R_6_REENTRANT
949     HAVE_SOCKLEN_T
950     HAVE_IN_ADDR_T
951     HAVE_BOOL_T
952     STDC_HEADERS
953     RETSIGTYPE_TEST
954     HAVE_INET_NTOA_R_DECL
955     HAVE_INET_NTOA_R_DECL_REENTRANT
956     HAVE_GETADDRINFO
957     HAVE_FILE_OFFSET_BITS
958     )
959   curl_internal_test(${CURL_TEST})
960 endforeach(CURL_TEST)
961
962 if(HAVE_FILE_OFFSET_BITS)
963   set(_FILE_OFFSET_BITS 64)
964   set(CMAKE_REQUIRED_FLAGS "-D_FILE_OFFSET_BITS=64")
965 endif(HAVE_FILE_OFFSET_BITS)
966 check_type_size("off_t"  SIZEOF_OFF_T)
967
968 # include this header to get the type
969 set(CMAKE_REQUIRED_INCLUDES "${CURL_SOURCE_DIR}/include")
970 set(CMAKE_EXTRA_INCLUDE_FILES "curl/system.h")
971 check_type_size("curl_off_t"  SIZEOF_CURL_OFF_T)
972 set(CMAKE_EXTRA_INCLUDE_FILES "")
973
974 set(CMAKE_REQUIRED_FLAGS)
975
976 foreach(CURL_TEST
977     HAVE_GLIBC_STRERROR_R
978     HAVE_POSIX_STRERROR_R
979     )
980   curl_internal_test_run(${CURL_TEST})
981 endforeach(CURL_TEST)
982
983 # Check for reentrant
984 foreach(CURL_TEST
985     HAVE_GETHOSTBYADDR_R_5
986     HAVE_GETHOSTBYADDR_R_7
987     HAVE_GETHOSTBYADDR_R_8
988     HAVE_GETHOSTBYNAME_R_3
989     HAVE_GETHOSTBYNAME_R_5
990     HAVE_GETHOSTBYNAME_R_6
991     HAVE_INET_NTOA_R_DECL_REENTRANT)
992   if(NOT ${CURL_TEST})
993     if(${CURL_TEST}_REENTRANT)
994       set(NEED_REENTRANT 1)
995     endif(${CURL_TEST}_REENTRANT)
996   endif(NOT ${CURL_TEST})
997 endforeach(CURL_TEST)
998
999 if(NEED_REENTRANT)
1000   foreach(CURL_TEST
1001       HAVE_GETHOSTBYADDR_R_5
1002       HAVE_GETHOSTBYADDR_R_7
1003       HAVE_GETHOSTBYADDR_R_8
1004       HAVE_GETHOSTBYNAME_R_3
1005       HAVE_GETHOSTBYNAME_R_5
1006       HAVE_GETHOSTBYNAME_R_6)
1007     set(${CURL_TEST} 0)
1008     if(${CURL_TEST}_REENTRANT)
1009       set(${CURL_TEST} 1)
1010     endif(${CURL_TEST}_REENTRANT)
1011   endforeach(CURL_TEST)
1012 endif(NEED_REENTRANT)
1013
1014 if(HAVE_INET_NTOA_R_DECL_REENTRANT)
1015   set(HAVE_INET_NTOA_R_DECL 1)
1016   set(NEED_REENTRANT 1)
1017 endif(HAVE_INET_NTOA_R_DECL_REENTRANT)
1018
1019 # Some other minor tests
1020
1021 if(NOT HAVE_IN_ADDR_T)
1022   set(in_addr_t "unsigned long")
1023 endif(NOT HAVE_IN_ADDR_T)
1024
1025 # Fix libz / zlib.h
1026
1027 if(NOT CURL_SPECIAL_LIBZ)
1028   if(NOT HAVE_LIBZ)
1029     set(HAVE_ZLIB_H 0)
1030   endif(NOT HAVE_LIBZ)
1031
1032   if(NOT HAVE_ZLIB_H)
1033     set(HAVE_LIBZ 0)
1034   endif(NOT HAVE_ZLIB_H)
1035 endif(NOT CURL_SPECIAL_LIBZ)
1036
1037 # Check for nonblocking
1038 set(HAVE_DISABLED_NONBLOCKING 1)
1039 if(HAVE_FIONBIO OR
1040     HAVE_IOCTLSOCKET OR
1041     HAVE_IOCTLSOCKET_CASE OR
1042     HAVE_O_NONBLOCK)
1043   set(HAVE_DISABLED_NONBLOCKING)
1044 endif(HAVE_FIONBIO OR
1045   HAVE_IOCTLSOCKET OR
1046   HAVE_IOCTLSOCKET_CASE OR
1047   HAVE_O_NONBLOCK)
1048
1049 if(RETSIGTYPE_TEST)
1050   set(RETSIGTYPE void)
1051 else(RETSIGTYPE_TEST)
1052   set(RETSIGTYPE int)
1053 endif(RETSIGTYPE_TEST)
1054
1055 if(CMAKE_COMPILER_IS_GNUCC AND APPLE)
1056   include(CheckCCompilerFlag)
1057   check_c_compiler_flag(-Wno-long-double HAVE_C_FLAG_Wno_long_double)
1058   if(HAVE_C_FLAG_Wno_long_double)
1059     # The Mac version of GCC warns about use of long double.  Disable it.
1060     get_source_file_property(MPRINTF_COMPILE_FLAGS mprintf.c COMPILE_FLAGS)
1061     if(MPRINTF_COMPILE_FLAGS)
1062       set(MPRINTF_COMPILE_FLAGS "${MPRINTF_COMPILE_FLAGS} -Wno-long-double")
1063     else(MPRINTF_COMPILE_FLAGS)
1064       set(MPRINTF_COMPILE_FLAGS "-Wno-long-double")
1065     endif(MPRINTF_COMPILE_FLAGS)
1066     set_source_files_properties(mprintf.c PROPERTIES
1067       COMPILE_FLAGS ${MPRINTF_COMPILE_FLAGS})
1068   endif(HAVE_C_FLAG_Wno_long_double)
1069 endif(CMAKE_COMPILER_IS_GNUCC AND APPLE)
1070
1071 if(HAVE_SOCKLEN_T)
1072   set(CURL_TYPEOF_CURL_SOCKLEN_T "socklen_t")
1073   if(WIN32)
1074     set(CMAKE_EXTRA_INCLUDE_FILES "winsock2.h;ws2tcpip.h")
1075   elseif(HAVE_SYS_SOCKET_H)
1076     set(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h")
1077   endif()
1078   check_type_size("socklen_t" CURL_SIZEOF_CURL_SOCKLEN_T)
1079   set(CMAKE_EXTRA_INCLUDE_FILES)
1080   if(NOT HAVE_CURL_SIZEOF_CURL_SOCKLEN_T)
1081     message(FATAL_ERROR
1082      "Check for sizeof socklen_t failed, see CMakeFiles/CMakerror.log")
1083   endif()
1084 else()
1085   set(CURL_TYPEOF_CURL_SOCKLEN_T int)
1086   set(CURL_SIZEOF_CURL_SOCKLEN_T ${SIZEOF_INT})
1087 endif()
1088
1089 # TODO test which of these headers are required
1090 if(WIN32)
1091   set(CURL_PULL_WS2TCPIP_H ${HAVE_WS2TCPIP_H})
1092 else()
1093   set(CURL_PULL_SYS_TYPES_H ${HAVE_SYS_TYPES_H})
1094   set(CURL_PULL_SYS_SOCKET_H ${HAVE_SYS_SOCKET_H})
1095   set(CURL_PULL_SYS_POLL_H ${HAVE_SYS_POLL_H})
1096 endif()
1097 set(CURL_PULL_STDINT_H ${HAVE_STDINT_H})
1098 set(CURL_PULL_INTTYPES_H ${HAVE_INTTYPES_H})
1099
1100 include(CMake/OtherTests.cmake)
1101
1102 add_definitions(-DHAVE_CONFIG_H)
1103
1104 # For windows, all compilers used by cmake should support large files
1105 if(WIN32)
1106   set(USE_WIN32_LARGE_FILES ON)
1107 endif(WIN32)
1108
1109 if(MSVC)
1110   add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
1111   if(CMAKE_C_FLAGS MATCHES "/W[0-4]")
1112     string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
1113   else(CMAKE_C_FLAGS MATCHES "/W[0-4]")
1114     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
1115   endif(CMAKE_C_FLAGS MATCHES "/W[0-4]")
1116 endif(MSVC)
1117
1118 # Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).
1119 function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
1120   file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT)
1121   string(REPLACE "$(top_srcdir)"   "\${CURL_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1122   string(REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1123
1124   string(REGEX REPLACE "\\\\\n" "!π!α!" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1125   string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1126   string(REPLACE "!π!α!" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1127
1128   string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})    # Replace $() with ${}
1129   string(REGEX REPLACE "@([a-zA-Z_][a-zA-Z0-9_]*)@" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})    # Replace @@ with ${}, even if that may not be read by CMake scripts.
1130   file(WRITE ${OUTPUT_FILE} ${MAKEFILE_INC_TEXT})
1131
1132 endfunction()
1133
1134 if(WIN32 AND NOT CYGWIN)
1135     set(CURL_INSTALL_CMAKE_DIR CMake)
1136 else()
1137     set(CURL_INSTALL_CMAKE_DIR lib/cmake/curl)
1138 endif()
1139
1140 if(USE_MANUAL)
1141   add_subdirectory(docs)
1142 endif()
1143
1144 add_subdirectory(lib)
1145
1146 if(BUILD_CURL_EXE)
1147   add_subdirectory(src)
1148 endif()
1149
1150 include(CTest)
1151 if(BUILD_TESTING)
1152   add_subdirectory(tests)
1153 endif()
1154
1155 # Helper to populate a list (_items) with a label when conditions (the remaining
1156 # args) are satisfied
1157 function(_add_if label)
1158   # TODO need to disable policy CMP0054 (CMake 3.1) to allow this indirection
1159   if(${ARGN})
1160     set(_items ${_items} "${label}" PARENT_SCOPE)
1161   endif()
1162 endfunction()
1163
1164 # Clear list and try to detect available features
1165 set(_items)
1166 _add_if("WinSSL"        SSL_ENABLED AND USE_WINDOWS_SSPI)
1167 _add_if("OpenSSL"       SSL_ENABLED AND USE_OPENSSL)
1168 _add_if("DarwinSSL"     SSL_ENABLED AND USE_DARWINSSL)
1169 _add_if("mbedTLS"       SSL_ENABLED AND USE_MBEDTLS)
1170 _add_if("IPv6"          ENABLE_IPV6)
1171 _add_if("unix-sockets"  USE_UNIX_SOCKETS)
1172 _add_if("libz"          HAVE_LIBZ)
1173 _add_if("AsynchDNS"     USE_ARES OR USE_THREADS_POSIX OR USE_THREADS_WIN32)
1174 _add_if("IDN"           HAVE_LIBIDN2)
1175 _add_if("Largefile"     (CURL_SIZEOF_CURL_OFF_T GREATER 4) AND
1176                         ((SIZEOF_OFF_T GREATER 4) OR USE_WIN32_LARGE_FILES))
1177 # TODO SSP1 (WinSSL) check is missing
1178 _add_if("SSPI"          USE_WINDOWS_SSPI)
1179 _add_if("GSS-API"       HAVE_GSSAPI)
1180 # TODO SSP1 missing for SPNEGO
1181 _add_if("SPNEGO"        NOT CURL_DISABLE_CRYPTO_AUTH AND
1182                         (HAVE_GSSAPI OR USE_WINDOWS_SSPI))
1183 _add_if("Kerberos"      NOT CURL_DISABLE_CRYPTO_AUTH AND
1184                         (HAVE_GSSAPI OR USE_WINDOWS_SSPI))
1185 # NTLM support requires crypto function adaptions from various SSL libs
1186 # TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
1187 if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_DARWINSSL OR USE_MBEDTLS))
1188   _add_if("NTLM"        1)
1189   # TODO missing option (autoconf: --enable-ntlm-wb)
1190   _add_if("NTLM_WB"     NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
1191 endif()
1192 # TODO missing option (--enable-tls-srp), depends on GNUTLS_SRP/OPENSSL_SRP
1193 _add_if("TLS-SRP"       USE_TLS_SRP)
1194 # TODO option --with-nghttp2 tests for nghttp2 lib and nghttp2/nghttp2.h header
1195 _add_if("HTTP2"         USE_NGHTTP2)
1196 string(REPLACE ";" " " SUPPORT_FEATURES "${_items}")
1197 message(STATUS "Enabled features: ${SUPPORT_FEATURES}")
1198
1199 # Clear list and try to detect available protocols
1200 set(_items)
1201 _add_if("HTTP"          NOT CURL_DISABLE_HTTP)
1202 _add_if("HTTPS"         NOT CURL_DISABLE_HTTP AND SSL_ENABLED)
1203 _add_if("FTP"           NOT CURL_DISABLE_FTP)
1204 _add_if("FTPS"          NOT CURL_DISABLE_FTP AND SSL_ENABLED)
1205 _add_if("FILE"          NOT CURL_DISABLE_FILE)
1206 _add_if("TELNET"        NOT CURL_DISABLE_TELNET)
1207 _add_if("LDAP"          NOT CURL_DISABLE_LDAP)
1208 # CURL_DISABLE_LDAP implies CURL_DISABLE_LDAPS
1209 # TODO check HAVE_LDAP_SSL (in autoconf this is enabled with --enable-ldaps)
1210 _add_if("LDAPS"         NOT CURL_DISABLE_LDAPS AND
1211                         ((USE_OPENLDAP AND SSL_ENABLED) OR
1212                         (NOT USE_OPENLDAP AND HAVE_LDAP_SSL)))
1213 _add_if("DICT"          NOT CURL_DISABLE_DICT)
1214 _add_if("TFTP"          NOT CURL_DISABLE_TFTP)
1215 _add_if("GOPHER"        NOT CURL_DISABLE_GOPHER)
1216 _add_if("POP3"          NOT CURL_DISABLE_POP3)
1217 _add_if("POP3S"         NOT CURL_DISABLE_POP3 AND SSL_ENABLED)
1218 _add_if("IMAP"          NOT CURL_DISABLE_IMAP)
1219 _add_if("IMAPS"         NOT CURL_DISABLE_IMAP AND SSL_ENABLED)
1220 _add_if("SMTP"          NOT CURL_DISABLE_SMTP)
1221 _add_if("SMTPS"         NOT CURL_DISABLE_SMTP AND SSL_ENABLED)
1222 _add_if("SCP"           USE_LIBSSH2)
1223 _add_if("SFTP"          USE_LIBSSH2)
1224 _add_if("RTSP"          NOT CURL_DISABLE_RTSP)
1225 _add_if("RTMP"          USE_LIBRTMP)
1226 list(SORT _items)
1227 string(REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}")
1228 message(STATUS "Enabled protocols: ${SUPPORT_PROTOCOLS}")
1229
1230 # curl-config needs the following options to be set.
1231 set(CC                      "${CMAKE_C_COMPILER}")
1232 # TODO probably put a -D... options here?
1233 set(CONFIGURE_OPTIONS       "")
1234 # TODO when to set "-DCURL_STATICLIB" for CPPFLAG_CURL_STATICLIB?
1235 set(CPPFLAG_CURL_STATICLIB  "")
1236 set(CURLVERSION             "${CURL_VERSION}")
1237 set(ENABLE_SHARED           "yes")
1238 if(CURL_STATICLIB)
1239   set(ENABLE_STATIC         "yes")
1240 else()
1241   set(ENABLE_STATIC         "no")
1242 endif()
1243 set(exec_prefix             "\${prefix}")
1244 set(includedir              "\${prefix}/include")
1245 set(LDFLAGS                 "${CMAKE_SHARED_LINKER_FLAGS}")
1246 set(LIBCURL_LIBS            "")
1247 set(libdir                  "${CMAKE_INSTALL_PREFIX}/lib")
1248 foreach(_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${CURL_LIBS})
1249   if(_lib MATCHES ".*/.*" OR _lib MATCHES "^-")
1250     set(LIBCURL_LIBS          "${LIBCURL_LIBS} ${_lib}")
1251   else()
1252     set(LIBCURL_LIBS          "${LIBCURL_LIBS} -l${_lib}")
1253   endif()
1254 endforeach()
1255 # "a" (Linux) or "lib" (Windows)
1256 string(REPLACE "." "" libext "${CMAKE_STATIC_LIBRARY_SUFFIX}")
1257 set(prefix                  "${CMAKE_INSTALL_PREFIX}")
1258 # Set this to "yes" to append all libraries on which -lcurl is dependent
1259 set(REQUIRE_LIB_DEPS        "no")
1260 # SUPPORT_FEATURES
1261 # SUPPORT_PROTOCOLS
1262 set(VERSIONNUM              "${CURL_VERSION_NUM}")
1263
1264 # Finally generate a "curl-config" matching this config
1265 configure_file("${CURL_SOURCE_DIR}/curl-config.in"
1266                "${CURL_BINARY_DIR}/curl-config" @ONLY)
1267 install(FILES "${CURL_BINARY_DIR}/curl-config"
1268         DESTINATION bin
1269         PERMISSIONS
1270           OWNER_READ OWNER_WRITE OWNER_EXECUTE
1271           GROUP_READ GROUP_EXECUTE
1272           WORLD_READ WORLD_EXECUTE)
1273
1274 # Finally generate a pkg-config file matching this config
1275 configure_file("${CURL_SOURCE_DIR}/libcurl.pc.in"
1276                "${CURL_BINARY_DIR}/libcurl.pc" @ONLY)
1277 install(FILES "${CURL_BINARY_DIR}/libcurl.pc"
1278         DESTINATION lib/pkgconfig)
1279
1280 # This needs to be run very last so other parts of the scripts can take advantage of this.
1281 if(NOT CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
1282   set(CURL_CONFIG_HAS_BEEN_RUN_BEFORE 1 CACHE INTERNAL "Flag to track whether this is the first time running CMake or if CMake has been configured before")
1283 endif()
1284
1285 # install headers
1286 install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/curl"
1287     DESTINATION include
1288     FILES_MATCHING PATTERN "*.h")
1289
1290
1291 include(CMakePackageConfigHelpers)
1292 write_basic_package_version_file(
1293     "${PROJECT_BINARY_DIR}/curl-config-version.cmake"
1294     VERSION ${CURL_VERSION}
1295     COMPATIBILITY SameMajorVersion
1296 )
1297
1298 configure_file(CMake/curl-config.cmake
1299         "${PROJECT_BINARY_DIR}/curl-config.cmake"
1300         COPYONLY
1301 )
1302
1303 install(
1304         FILES ${PROJECT_BINARY_DIR}/curl-config.cmake
1305               ${PROJECT_BINARY_DIR}/curl-config-version.cmake
1306         DESTINATION ${CURL_INSTALL_CMAKE_DIR}
1307 )
1308
1309 # Workaround for MSVS10 to avoid the Dialog Hell
1310 # FIXME: This could be removed with future version of CMake.
1311 if(MSVC_VERSION EQUAL 1600)
1312   set(CURL_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/CURL.sln")
1313   if(EXISTS "${CURL_SLN_FILENAME}")
1314     file(APPEND "${CURL_SLN_FILENAME}" "\n# This should be regenerated!\n")
1315   endif()
1316 endif()
1317
1318 if(NOT TARGET uninstall)
1319   configure_file(
1320       ${CMAKE_CURRENT_SOURCE_DIR}/CMake/cmake_uninstall.cmake.in
1321       ${CMAKE_CURRENT_BINARY_DIR}/CMake/cmake_uninstall.cmake
1322       IMMEDIATE @ONLY)
1323
1324   add_custom_target(uninstall
1325       COMMAND ${CMAKE_COMMAND} -P
1326       ${CMAKE_CURRENT_BINARY_DIR}/CMake/cmake_uninstall.cmake)
1327 endif()