chiark / gitweb /
_gnutls
[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 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("limits.h"         HAVE_LIMITS_H)
741 check_include_file_concat("locale.h"         HAVE_LOCALE_H)
742 check_include_file_concat("net/if.h"         HAVE_NET_IF_H)
743 check_include_file_concat("netdb.h"          HAVE_NETDB_H)
744 check_include_file_concat("netinet/in.h"     HAVE_NETINET_IN_H)
745 check_include_file_concat("netinet/tcp.h"    HAVE_NETINET_TCP_H)
746
747 check_include_file_concat("pem.h"            HAVE_PEM_H)
748 check_include_file_concat("poll.h"           HAVE_POLL_H)
749 check_include_file_concat("pwd.h"            HAVE_PWD_H)
750 check_include_file_concat("rsa.h"            HAVE_RSA_H)
751 check_include_file_concat("setjmp.h"         HAVE_SETJMP_H)
752 check_include_file_concat("sgtty.h"          HAVE_SGTTY_H)
753 check_include_file_concat("signal.h"         HAVE_SIGNAL_H)
754 check_include_file_concat("ssl.h"            HAVE_SSL_H)
755 check_include_file_concat("stdbool.h"        HAVE_STDBOOL_H)
756 check_include_file_concat("stdint.h"         HAVE_STDINT_H)
757 check_include_file_concat("stdio.h"          HAVE_STDIO_H)
758 check_include_file_concat("stdlib.h"         HAVE_STDLIB_H)
759 check_include_file_concat("string.h"         HAVE_STRING_H)
760 check_include_file_concat("strings.h"        HAVE_STRINGS_H)
761 check_include_file_concat("stropts.h"        HAVE_STROPTS_H)
762 check_include_file_concat("termio.h"         HAVE_TERMIO_H)
763 check_include_file_concat("termios.h"        HAVE_TERMIOS_H)
764 check_include_file_concat("time.h"           HAVE_TIME_H)
765 check_include_file_concat("unistd.h"         HAVE_UNISTD_H)
766 check_include_file_concat("utime.h"          HAVE_UTIME_H)
767 check_include_file_concat("x509.h"           HAVE_X509_H)
768
769 check_include_file_concat("process.h"        HAVE_PROCESS_H)
770 check_include_file_concat("stddef.h"         HAVE_STDDEF_H)
771 check_include_file_concat("dlfcn.h"          HAVE_DLFCN_H)
772 check_include_file_concat("malloc.h"         HAVE_MALLOC_H)
773 check_include_file_concat("memory.h"         HAVE_MEMORY_H)
774 check_include_file_concat("netinet/if_ether.h" HAVE_NETINET_IF_ETHER_H)
775 check_include_file_concat("stdint.h"        HAVE_STDINT_H)
776 check_include_file_concat("sockio.h"        HAVE_SOCKIO_H)
777 check_include_file_concat("sys/utsname.h"   HAVE_SYS_UTSNAME_H)
778
779 check_type_size(size_t  SIZEOF_SIZE_T)
780 check_type_size(ssize_t  SIZEOF_SSIZE_T)
781 check_type_size("long long"  SIZEOF_LONG_LONG)
782 check_type_size("long"  SIZEOF_LONG)
783 check_type_size("short"  SIZEOF_SHORT)
784 check_type_size("int"  SIZEOF_INT)
785 check_type_size("__int64"  SIZEOF___INT64)
786 check_type_size("long double"  SIZEOF_LONG_DOUBLE)
787 check_type_size("time_t"  SIZEOF_TIME_T)
788 if(NOT HAVE_SIZEOF_SSIZE_T)
789   if(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
790     set(ssize_t long)
791   endif(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
792   if(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
793     set(ssize_t __int64)
794   endif(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
795 endif(NOT HAVE_SIZEOF_SSIZE_T)
796 # off_t is sized later, after the HAVE_FILE_OFFSET_BITS test
797
798 if(HAVE_SIZEOF_LONG_LONG)
799   set(HAVE_LONGLONG 1)
800   set(HAVE_LL 1)
801 endif(HAVE_SIZEOF_LONG_LONG)
802
803 find_file(RANDOM_FILE urandom /dev)
804 mark_as_advanced(RANDOM_FILE)
805
806 # Check for some functions that are used
807 if(HAVE_LIBWS2_32)
808   set(CMAKE_REQUIRED_LIBRARIES ws2_32)
809 elseif(HAVE_LIBSOCKET)
810   set(CMAKE_REQUIRED_LIBRARIES socket)
811 endif()
812
813 check_symbol_exists(basename      "${CURL_INCLUDES}" HAVE_BASENAME)
814 check_symbol_exists(socket        "${CURL_INCLUDES}" HAVE_SOCKET)
815 # poll on macOS is unreliable, it first did not exist, then was broken until
816 # fixed in 10.9 only to break again in 10.12.
817 if(NOT APPLE)
818   check_symbol_exists(poll        "${CURL_INCLUDES}" HAVE_POLL)
819 endif()
820 check_symbol_exists(select        "${CURL_INCLUDES}" HAVE_SELECT)
821 check_symbol_exists(strdup        "${CURL_INCLUDES}" HAVE_STRDUP)
822 check_symbol_exists(strstr        "${CURL_INCLUDES}" HAVE_STRSTR)
823 check_symbol_exists(strtok_r      "${CURL_INCLUDES}" HAVE_STRTOK_R)
824 check_symbol_exists(strftime      "${CURL_INCLUDES}" HAVE_STRFTIME)
825 check_symbol_exists(uname         "${CURL_INCLUDES}" HAVE_UNAME)
826 check_symbol_exists(strcasecmp    "${CURL_INCLUDES}" HAVE_STRCASECMP)
827 check_symbol_exists(stricmp       "${CURL_INCLUDES}" HAVE_STRICMP)
828 check_symbol_exists(strcmpi       "${CURL_INCLUDES}" HAVE_STRCMPI)
829 check_symbol_exists(strncmpi      "${CURL_INCLUDES}" HAVE_STRNCMPI)
830 check_symbol_exists(alarm         "${CURL_INCLUDES}" HAVE_ALARM)
831 if(NOT HAVE_STRNCMPI)
832   set(HAVE_STRCMPI)
833 endif(NOT HAVE_STRNCMPI)
834 check_symbol_exists(gethostbyaddr "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR)
835 check_symbol_exists(gethostbyaddr_r "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR_R)
836 check_symbol_exists(gettimeofday  "${CURL_INCLUDES}" HAVE_GETTIMEOFDAY)
837 check_symbol_exists(inet_addr     "${CURL_INCLUDES}" HAVE_INET_ADDR)
838 check_symbol_exists(inet_ntoa     "${CURL_INCLUDES}" HAVE_INET_NTOA)
839 check_symbol_exists(inet_ntoa_r   "${CURL_INCLUDES}" HAVE_INET_NTOA_R)
840 check_symbol_exists(tcsetattr     "${CURL_INCLUDES}" HAVE_TCSETATTR)
841 check_symbol_exists(tcgetattr     "${CURL_INCLUDES}" HAVE_TCGETATTR)
842 check_symbol_exists(perror        "${CURL_INCLUDES}" HAVE_PERROR)
843 check_symbol_exists(closesocket   "${CURL_INCLUDES}" HAVE_CLOSESOCKET)
844 check_symbol_exists(setvbuf       "${CURL_INCLUDES}" HAVE_SETVBUF)
845 check_symbol_exists(sigsetjmp     "${CURL_INCLUDES}" HAVE_SIGSETJMP)
846 check_symbol_exists(getpass_r     "${CURL_INCLUDES}" HAVE_GETPASS_R)
847 check_symbol_exists(strlcat       "${CURL_INCLUDES}" HAVE_STRLCAT)
848 check_symbol_exists(getpwuid      "${CURL_INCLUDES}" HAVE_GETPWUID)
849 check_symbol_exists(geteuid       "${CURL_INCLUDES}" HAVE_GETEUID)
850 check_symbol_exists(utime         "${CURL_INCLUDES}" HAVE_UTIME)
851 check_symbol_exists(gmtime_r      "${CURL_INCLUDES}" HAVE_GMTIME_R)
852 check_symbol_exists(localtime_r   "${CURL_INCLUDES}" HAVE_LOCALTIME_R)
853
854 check_symbol_exists(gethostbyname   "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME)
855 check_symbol_exists(gethostbyname_r "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R)
856
857 check_symbol_exists(signal        "${CURL_INCLUDES}" HAVE_SIGNAL_FUNC)
858 check_symbol_exists(SIGALRM       "${CURL_INCLUDES}" HAVE_SIGNAL_MACRO)
859 if(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO)
860   set(HAVE_SIGNAL 1)
861 endif(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO)
862 check_symbol_exists(uname          "${CURL_INCLUDES}" HAVE_UNAME)
863 check_symbol_exists(strtoll        "${CURL_INCLUDES}" HAVE_STRTOLL)
864 check_symbol_exists(_strtoi64      "${CURL_INCLUDES}" HAVE__STRTOI64)
865 check_symbol_exists(strerror_r     "${CURL_INCLUDES}" HAVE_STRERROR_R)
866 check_symbol_exists(siginterrupt   "${CURL_INCLUDES}" HAVE_SIGINTERRUPT)
867 check_symbol_exists(perror         "${CURL_INCLUDES}" HAVE_PERROR)
868 check_symbol_exists(fork           "${CURL_INCLUDES}" HAVE_FORK)
869 check_symbol_exists(getaddrinfo    "${CURL_INCLUDES}" HAVE_GETADDRINFO)
870 check_symbol_exists(freeaddrinfo   "${CURL_INCLUDES}" HAVE_FREEADDRINFO)
871 check_symbol_exists(freeifaddrs    "${CURL_INCLUDES}" HAVE_FREEIFADDRS)
872 check_symbol_exists(pipe           "${CURL_INCLUDES}" HAVE_PIPE)
873 check_symbol_exists(ftruncate      "${CURL_INCLUDES}" HAVE_FTRUNCATE)
874 check_symbol_exists(getprotobyname "${CURL_INCLUDES}" HAVE_GETPROTOBYNAME)
875 check_symbol_exists(getrlimit      "${CURL_INCLUDES}" HAVE_GETRLIMIT)
876 check_symbol_exists(setlocale      "${CURL_INCLUDES}" HAVE_SETLOCALE)
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
882 # symbol exists in win32, but function does not.
883 if(WIN32)
884   if(ENABLE_INET_PTON)
885     check_function_exists(inet_pton HAVE_INET_PTON)
886     # _WIN32_WINNT_VISTA (0x0600)
887     add_definitions(-D_WIN32_WINNT=0x0600)
888   else()
889     # _WIN32_WINNT_WINXP (0x0501)
890     add_definitions(-D_WIN32_WINNT=0x0501)
891   endif()
892 else()
893     check_function_exists(inet_pton HAVE_INET_PTON)
894 endif()
895
896 check_symbol_exists(fsetxattr "${CURL_INCLUDES}" HAVE_FSETXATTR)
897 if(HAVE_FSETXATTR)
898   foreach(CURL_TEST HAVE_FSETXATTR_5 HAVE_FSETXATTR_6)
899     curl_internal_test_run(${CURL_TEST})
900   endforeach(CURL_TEST)
901 endif(HAVE_FSETXATTR)
902
903 # sigaction and sigsetjmp are special. Use special mechanism for
904 # detecting those, but only if previous attempt failed.
905 if(HAVE_SIGNAL_H)
906   check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION)
907 endif(HAVE_SIGNAL_H)
908
909 if(NOT HAVE_SIGSETJMP)
910   if(HAVE_SETJMP_H)
911     check_symbol_exists(sigsetjmp "setjmp.h" HAVE_MACRO_SIGSETJMP)
912     if(HAVE_MACRO_SIGSETJMP)
913       set(HAVE_SIGSETJMP 1)
914     endif(HAVE_MACRO_SIGSETJMP)
915   endif(HAVE_SETJMP_H)
916 endif(NOT HAVE_SIGSETJMP)
917
918 # If there is no stricmp(), do not allow LDAP to parse URLs
919 if(NOT HAVE_STRICMP)
920   set(HAVE_LDAP_URL_PARSE 1)
921 endif(NOT HAVE_STRICMP)
922
923 # Do curl specific tests
924 foreach(CURL_TEST
925     HAVE_FCNTL_O_NONBLOCK
926     HAVE_IOCTLSOCKET
927     HAVE_IOCTLSOCKET_CAMEL
928     HAVE_IOCTLSOCKET_CAMEL_FIONBIO
929     HAVE_IOCTLSOCKET_FIONBIO
930     HAVE_IOCTL_FIONBIO
931     HAVE_IOCTL_SIOCGIFADDR
932     HAVE_SETSOCKOPT_SO_NONBLOCK
933     HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
934     TIME_WITH_SYS_TIME
935     HAVE_O_NONBLOCK
936     HAVE_GETHOSTBYADDR_R_5
937     HAVE_GETHOSTBYADDR_R_7
938     HAVE_GETHOSTBYADDR_R_8
939     HAVE_GETHOSTBYADDR_R_5_REENTRANT
940     HAVE_GETHOSTBYADDR_R_7_REENTRANT
941     HAVE_GETHOSTBYADDR_R_8_REENTRANT
942     HAVE_GETHOSTBYNAME_R_3
943     HAVE_GETHOSTBYNAME_R_5
944     HAVE_GETHOSTBYNAME_R_6
945     HAVE_GETHOSTBYNAME_R_3_REENTRANT
946     HAVE_GETHOSTBYNAME_R_5_REENTRANT
947     HAVE_GETHOSTBYNAME_R_6_REENTRANT
948     HAVE_SOCKLEN_T
949     HAVE_IN_ADDR_T
950     HAVE_BOOL_T
951     STDC_HEADERS
952     RETSIGTYPE_TEST
953     HAVE_INET_NTOA_R_DECL
954     HAVE_INET_NTOA_R_DECL_REENTRANT
955     HAVE_GETADDRINFO
956     HAVE_FILE_OFFSET_BITS
957     )
958   curl_internal_test(${CURL_TEST})
959 endforeach(CURL_TEST)
960
961 if(HAVE_FILE_OFFSET_BITS)
962   set(_FILE_OFFSET_BITS 64)
963   set(CMAKE_REQUIRED_FLAGS "-D_FILE_OFFSET_BITS=64")
964 endif(HAVE_FILE_OFFSET_BITS)
965 check_type_size("off_t"  SIZEOF_OFF_T)
966
967 # include this header to get the type
968 set(CMAKE_REQUIRED_INCLUDES "${CURL_SOURCE_DIR}/include")
969 set(CMAKE_EXTRA_INCLUDE_FILES "curl/system.h")
970 check_type_size("curl_off_t"  SIZEOF_CURL_OFF_T)
971 set(CMAKE_EXTRA_INCLUDE_FILES "")
972
973 set(CMAKE_REQUIRED_FLAGS)
974
975 foreach(CURL_TEST
976     HAVE_GLIBC_STRERROR_R
977     HAVE_POSIX_STRERROR_R
978     )
979   curl_internal_test_run(${CURL_TEST})
980 endforeach(CURL_TEST)
981
982 # Check for reentrant
983 foreach(CURL_TEST
984     HAVE_GETHOSTBYADDR_R_5
985     HAVE_GETHOSTBYADDR_R_7
986     HAVE_GETHOSTBYADDR_R_8
987     HAVE_GETHOSTBYNAME_R_3
988     HAVE_GETHOSTBYNAME_R_5
989     HAVE_GETHOSTBYNAME_R_6
990     HAVE_INET_NTOA_R_DECL_REENTRANT)
991   if(NOT ${CURL_TEST})
992     if(${CURL_TEST}_REENTRANT)
993       set(NEED_REENTRANT 1)
994     endif(${CURL_TEST}_REENTRANT)
995   endif(NOT ${CURL_TEST})
996 endforeach(CURL_TEST)
997
998 if(NEED_REENTRANT)
999   foreach(CURL_TEST
1000       HAVE_GETHOSTBYADDR_R_5
1001       HAVE_GETHOSTBYADDR_R_7
1002       HAVE_GETHOSTBYADDR_R_8
1003       HAVE_GETHOSTBYNAME_R_3
1004       HAVE_GETHOSTBYNAME_R_5
1005       HAVE_GETHOSTBYNAME_R_6)
1006     set(${CURL_TEST} 0)
1007     if(${CURL_TEST}_REENTRANT)
1008       set(${CURL_TEST} 1)
1009     endif(${CURL_TEST}_REENTRANT)
1010   endforeach(CURL_TEST)
1011 endif(NEED_REENTRANT)
1012
1013 if(HAVE_INET_NTOA_R_DECL_REENTRANT)
1014   set(HAVE_INET_NTOA_R_DECL 1)
1015   set(NEED_REENTRANT 1)
1016 endif(HAVE_INET_NTOA_R_DECL_REENTRANT)
1017
1018 # Some other minor tests
1019
1020 if(NOT HAVE_IN_ADDR_T)
1021   set(in_addr_t "unsigned long")
1022 endif(NOT HAVE_IN_ADDR_T)
1023
1024 # Fix libz / zlib.h
1025
1026 if(NOT CURL_SPECIAL_LIBZ)
1027   if(NOT HAVE_LIBZ)
1028     set(HAVE_ZLIB_H 0)
1029   endif(NOT HAVE_LIBZ)
1030
1031   if(NOT HAVE_ZLIB_H)
1032     set(HAVE_LIBZ 0)
1033   endif(NOT HAVE_ZLIB_H)
1034 endif(NOT CURL_SPECIAL_LIBZ)
1035
1036 # Check for nonblocking
1037 set(HAVE_DISABLED_NONBLOCKING 1)
1038 if(HAVE_FIONBIO OR
1039     HAVE_IOCTLSOCKET OR
1040     HAVE_IOCTLSOCKET_CASE OR
1041     HAVE_O_NONBLOCK)
1042   set(HAVE_DISABLED_NONBLOCKING)
1043 endif(HAVE_FIONBIO OR
1044   HAVE_IOCTLSOCKET OR
1045   HAVE_IOCTLSOCKET_CASE OR
1046   HAVE_O_NONBLOCK)
1047
1048 if(RETSIGTYPE_TEST)
1049   set(RETSIGTYPE void)
1050 else(RETSIGTYPE_TEST)
1051   set(RETSIGTYPE int)
1052 endif(RETSIGTYPE_TEST)
1053
1054 if(CMAKE_COMPILER_IS_GNUCC AND APPLE)
1055   include(CheckCCompilerFlag)
1056   check_c_compiler_flag(-Wno-long-double HAVE_C_FLAG_Wno_long_double)
1057   if(HAVE_C_FLAG_Wno_long_double)
1058     # The Mac version of GCC warns about use of long double.  Disable it.
1059     get_source_file_property(MPRINTF_COMPILE_FLAGS mprintf.c COMPILE_FLAGS)
1060     if(MPRINTF_COMPILE_FLAGS)
1061       set(MPRINTF_COMPILE_FLAGS "${MPRINTF_COMPILE_FLAGS} -Wno-long-double")
1062     else(MPRINTF_COMPILE_FLAGS)
1063       set(MPRINTF_COMPILE_FLAGS "-Wno-long-double")
1064     endif(MPRINTF_COMPILE_FLAGS)
1065     set_source_files_properties(mprintf.c PROPERTIES
1066       COMPILE_FLAGS ${MPRINTF_COMPILE_FLAGS})
1067   endif(HAVE_C_FLAG_Wno_long_double)
1068 endif(CMAKE_COMPILER_IS_GNUCC AND APPLE)
1069
1070 if(HAVE_SOCKLEN_T)
1071   set(CURL_TYPEOF_CURL_SOCKLEN_T "socklen_t")
1072   if(WIN32)
1073     set(CMAKE_EXTRA_INCLUDE_FILES "winsock2.h;ws2tcpip.h")
1074   elseif(HAVE_SYS_SOCKET_H)
1075     set(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h")
1076   endif()
1077   check_type_size("socklen_t" CURL_SIZEOF_CURL_SOCKLEN_T)
1078   set(CMAKE_EXTRA_INCLUDE_FILES)
1079   if(NOT HAVE_CURL_SIZEOF_CURL_SOCKLEN_T)
1080     message(FATAL_ERROR
1081      "Check for sizeof socklen_t failed, see CMakeFiles/CMakerror.log")
1082   endif()
1083 else()
1084   set(CURL_TYPEOF_CURL_SOCKLEN_T int)
1085   set(CURL_SIZEOF_CURL_SOCKLEN_T ${SIZEOF_INT})
1086 endif()
1087
1088 # TODO test which of these headers are required
1089 if(WIN32)
1090   set(CURL_PULL_WS2TCPIP_H ${HAVE_WS2TCPIP_H})
1091 else()
1092   set(CURL_PULL_SYS_TYPES_H ${HAVE_SYS_TYPES_H})
1093   set(CURL_PULL_SYS_SOCKET_H ${HAVE_SYS_SOCKET_H})
1094   set(CURL_PULL_SYS_POLL_H ${HAVE_SYS_POLL_H})
1095 endif()
1096 set(CURL_PULL_STDINT_H ${HAVE_STDINT_H})
1097 set(CURL_PULL_INTTYPES_H ${HAVE_INTTYPES_H})
1098
1099 include(CMake/OtherTests.cmake)
1100
1101 add_definitions(-DHAVE_CONFIG_H)
1102
1103 # For windows, all compilers used by cmake should support large files
1104 if(WIN32)
1105   set(USE_WIN32_LARGE_FILES ON)
1106 endif(WIN32)
1107
1108 if(MSVC)
1109   add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
1110   if(CMAKE_C_FLAGS MATCHES "/W[0-4]")
1111     string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
1112   else(CMAKE_C_FLAGS MATCHES "/W[0-4]")
1113     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
1114   endif(CMAKE_C_FLAGS MATCHES "/W[0-4]")
1115 endif(MSVC)
1116
1117 # Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).
1118 function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
1119   file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT)
1120   string(REPLACE "$(top_srcdir)"   "\${CURL_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1121   string(REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1122
1123   string(REGEX REPLACE "\\\\\n" "!π!α!" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1124   string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1125   string(REPLACE "!π!α!" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
1126
1127   string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})    # Replace $() with ${}
1128   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.
1129   file(WRITE ${OUTPUT_FILE} ${MAKEFILE_INC_TEXT})
1130
1131 endfunction()
1132
1133 if(USE_MANUAL)
1134   add_subdirectory(docs)
1135 endif()
1136
1137 add_subdirectory(lib)
1138
1139 if(BUILD_CURL_EXE)
1140   add_subdirectory(src)
1141 endif()
1142
1143 include(CTest)
1144 if(BUILD_TESTING)
1145   add_subdirectory(tests)
1146 endif()
1147
1148 # Helper to populate a list (_items) with a label when conditions (the remaining
1149 # args) are satisfied
1150 function(_add_if label)
1151   # TODO need to disable policy CMP0054 (CMake 3.1) to allow this indirection
1152   if(${ARGN})
1153     set(_items ${_items} "${label}" PARENT_SCOPE)
1154   endif()
1155 endfunction()
1156
1157 # Clear list and try to detect available features
1158 set(_items)
1159 _add_if("WinSSL"        SSL_ENABLED AND USE_WINDOWS_SSPI)
1160 _add_if("OpenSSL"       SSL_ENABLED AND USE_OPENSSL)
1161 _add_if("DarwinSSL"     SSL_ENABLED AND USE_DARWINSSL)
1162 _add_if("mbedTLS"       SSL_ENABLED AND USE_MBEDTLS)
1163 _add_if("IPv6"          ENABLE_IPV6)
1164 _add_if("unix-sockets"  USE_UNIX_SOCKETS)
1165 _add_if("libz"          HAVE_LIBZ)
1166 _add_if("AsynchDNS"     USE_ARES OR USE_THREADS_POSIX OR USE_THREADS_WIN32)
1167 _add_if("IDN"           HAVE_LIBIDN2)
1168 _add_if("Largefile"     (CURL_SIZEOF_CURL_OFF_T GREATER 4) AND
1169                         ((SIZEOF_OFF_T GREATER 4) OR USE_WIN32_LARGE_FILES))
1170 # TODO SSP1 (WinSSL) check is missing
1171 _add_if("SSPI"          USE_WINDOWS_SSPI)
1172 _add_if("GSS-API"       HAVE_GSSAPI)
1173 # TODO SSP1 missing for SPNEGO
1174 _add_if("SPNEGO"        NOT CURL_DISABLE_CRYPTO_AUTH AND
1175                         (HAVE_GSSAPI OR USE_WINDOWS_SSPI))
1176 _add_if("Kerberos"      NOT CURL_DISABLE_CRYPTO_AUTH AND
1177                         (HAVE_GSSAPI OR USE_WINDOWS_SSPI))
1178 # NTLM support requires crypto function adaptions from various SSL libs
1179 # TODO alternative SSL libs tests for SSP1, GNUTLS, NSS
1180 if(NOT CURL_DISABLE_CRYPTO_AUTH AND (USE_OPENSSL OR USE_WINDOWS_SSPI OR USE_DARWINSSL OR USE_MBEDTLS))
1181   _add_if("NTLM"        1)
1182   # TODO missing option (autoconf: --enable-ntlm-wb)
1183   _add_if("NTLM_WB"     NOT CURL_DISABLE_HTTP AND NTLM_WB_ENABLED)
1184 endif()
1185 # TODO missing option (--enable-tls-srp), depends on GNUTLS_SRP/OPENSSL_SRP
1186 _add_if("TLS-SRP"       USE_TLS_SRP)
1187 # TODO option --with-nghttp2 tests for nghttp2 lib and nghttp2/nghttp2.h header
1188 _add_if("HTTP2"         USE_NGHTTP2)
1189 string(REPLACE ";" " " SUPPORT_FEATURES "${_items}")
1190 message(STATUS "Enabled features: ${SUPPORT_FEATURES}")
1191
1192 # Clear list and try to detect available protocols
1193 set(_items)
1194 _add_if("HTTP"          NOT CURL_DISABLE_HTTP)
1195 _add_if("HTTPS"         NOT CURL_DISABLE_HTTP AND SSL_ENABLED)
1196 _add_if("FTP"           NOT CURL_DISABLE_FTP)
1197 _add_if("FTPS"          NOT CURL_DISABLE_FTP AND SSL_ENABLED)
1198 _add_if("FILE"          NOT CURL_DISABLE_FILE)
1199 _add_if("TELNET"        NOT CURL_DISABLE_TELNET)
1200 _add_if("LDAP"          NOT CURL_DISABLE_LDAP)
1201 # CURL_DISABLE_LDAP implies CURL_DISABLE_LDAPS
1202 # TODO check HAVE_LDAP_SSL (in autoconf this is enabled with --enable-ldaps)
1203 _add_if("LDAPS"         NOT CURL_DISABLE_LDAPS AND
1204                         ((USE_OPENLDAP AND SSL_ENABLED) OR
1205                         (NOT USE_OPENLDAP AND HAVE_LDAP_SSL)))
1206 _add_if("DICT"          NOT CURL_DISABLE_DICT)
1207 _add_if("TFTP"          NOT CURL_DISABLE_TFTP)
1208 _add_if("GOPHER"        NOT CURL_DISABLE_GOPHER)
1209 _add_if("POP3"          NOT CURL_DISABLE_POP3)
1210 _add_if("POP3S"         NOT CURL_DISABLE_POP3 AND SSL_ENABLED)
1211 _add_if("IMAP"          NOT CURL_DISABLE_IMAP)
1212 _add_if("IMAPS"         NOT CURL_DISABLE_IMAP AND SSL_ENABLED)
1213 _add_if("SMTP"          NOT CURL_DISABLE_SMTP)
1214 _add_if("SMTPS"         NOT CURL_DISABLE_SMTP AND SSL_ENABLED)
1215 _add_if("SCP"           USE_LIBSSH2)
1216 _add_if("SFTP"          USE_LIBSSH2)
1217 _add_if("RTSP"          NOT CURL_DISABLE_RTSP)
1218 _add_if("RTMP"          USE_LIBRTMP)
1219 list(SORT _items)
1220 string(REPLACE ";" " " SUPPORT_PROTOCOLS "${_items}")
1221 message(STATUS "Enabled protocols: ${SUPPORT_PROTOCOLS}")
1222
1223 # curl-config needs the following options to be set.
1224 set(CC                      "${CMAKE_C_COMPILER}")
1225 # TODO probably put a -D... options here?
1226 set(CONFIGURE_OPTIONS       "")
1227 # TODO when to set "-DCURL_STATICLIB" for CPPFLAG_CURL_STATICLIB?
1228 set(CPPFLAG_CURL_STATICLIB  "")
1229 set(CURLVERSION             "${CURL_VERSION}")
1230 set(ENABLE_SHARED           "yes")
1231 if(CURL_STATICLIB)
1232   set(ENABLE_STATIC         "yes")
1233 else()
1234   set(ENABLE_STATIC         "no")
1235 endif()
1236 set(exec_prefix             "\${prefix}")
1237 set(includedir              "\${prefix}/include")
1238 set(LDFLAGS                 "${CMAKE_SHARED_LINKER_FLAGS}")
1239 set(LIBCURL_LIBS            "")
1240 set(libdir                  "${CMAKE_INSTALL_PREFIX}/lib")
1241 foreach(_lib ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${CURL_LIBS})
1242   if(_lib MATCHES ".*/.*" OR _lib MATCHES "^-")
1243     set(LIBCURL_LIBS          "${LIBCURL_LIBS} ${_lib}")
1244   else()
1245     set(LIBCURL_LIBS          "${LIBCURL_LIBS} -l${_lib}")
1246   endif()
1247 endforeach()
1248 # "a" (Linux) or "lib" (Windows)
1249 string(REPLACE "." "" libext "${CMAKE_STATIC_LIBRARY_SUFFIX}")
1250 set(prefix                  "${CMAKE_INSTALL_PREFIX}")
1251 # Set this to "yes" to append all libraries on which -lcurl is dependent
1252 set(REQUIRE_LIB_DEPS        "no")
1253 # SUPPORT_FEATURES
1254 # SUPPORT_PROTOCOLS
1255 set(VERSIONNUM              "${CURL_VERSION_NUM}")
1256
1257 # Finally generate a "curl-config" matching this config
1258 configure_file("${CURL_SOURCE_DIR}/curl-config.in"
1259                "${CURL_BINARY_DIR}/curl-config" @ONLY)
1260 install(FILES "${CURL_BINARY_DIR}/curl-config"
1261         DESTINATION bin
1262         PERMISSIONS
1263           OWNER_READ OWNER_WRITE OWNER_EXECUTE
1264           GROUP_READ GROUP_EXECUTE
1265           WORLD_READ WORLD_EXECUTE)
1266
1267 # Finally generate a pkg-config file matching this config
1268 configure_file("${CURL_SOURCE_DIR}/libcurl.pc.in"
1269                "${CURL_BINARY_DIR}/libcurl.pc" @ONLY)
1270 install(FILES "${CURL_BINARY_DIR}/libcurl.pc"
1271         DESTINATION lib/pkgconfig)
1272
1273 # This needs to be run very last so other parts of the scripts can take advantage of this.
1274 if(NOT CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
1275   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")
1276 endif()
1277
1278 # install headers
1279 install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/curl"
1280     DESTINATION include
1281     FILES_MATCHING PATTERN "*.h")
1282
1283 # Workaround for MSVS10 to avoid the Dialog Hell
1284 # FIXME: This could be removed with future version of CMake.
1285 if(MSVC_VERSION EQUAL 1600)
1286   set(CURL_SLN_FILENAME "${CMAKE_CURRENT_BINARY_DIR}/CURL.sln")
1287   if(EXISTS "${CURL_SLN_FILENAME}")
1288     file(APPEND "${CURL_SLN_FILENAME}" "\n# This should be regenerated!\n")
1289   endif()
1290 endif()
1291
1292 if(NOT TARGET uninstall)
1293   configure_file(
1294       ${CMAKE_CURRENT_SOURCE_DIR}/CMake/cmake_uninstall.cmake.in
1295       ${CMAKE_CURRENT_BINARY_DIR}/CMake/cmake_uninstall.cmake
1296       IMMEDIATE @ONLY)
1297
1298   add_custom_target(uninstall
1299       COMMAND ${CMAKE_COMMAND} -P
1300       ${CMAKE_CURRENT_BINARY_DIR}/CMake/cmake_uninstall.cmake)
1301 endif()