BUG: curl did not build with cmake with VS 2005 for two reasons, ws2tcpip.h requires...
[platform/upstream/curl.git] / CMakeLists.txt
1 # cURL/libcurl CMake script
2 # by Tetetest and Sukender (Benoit Neil)
3
4 # TODO:
5 # The output .so file lacks the soname number which we currently have within the lib/Makefile.am file
6 # Add full (4 or 5 libs) SSL support
7 # 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).
8 # Add CTests(?)
9 # Check on all possible platforms
10 # Test with as many configurations possible (With or without any option)
11 # Create scripts that help keeping the CMake build system up to date (to reduce maintenance). According to Tetetest:
12 #  - lists of headers that 'configure' checks for;
13 #  - curl-specific tests (the ones that are in m4/curl-*.m4 files);
14 #  - (most obvious thing:) curl version numbers.
15 # Add documentation subproject
16 #
17 # To check:
18 # (From Daniel Stenberg) The cmake build selected to run gcc with -fPIC on my box while the plain configure script did not.
19 # (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.
20 cmake_minimum_required(VERSION 2.6.2 FATAL_ERROR)
21 set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}")
22 include(Utilities)
23
24 project( CURL C )
25
26
27 file (READ ${CURL_SOURCE_DIR}/include/curl/curlver.h CURL_VERSION_H_CONTENTS)
28 string (REGEX MATCH "LIBCURL_VERSION_MAJOR[ \t]+([0-9]+)" 
29   LIBCURL_VERSION_MJ ${CURL_VERSION_H_CONTENTS})
30 string (REGEX MATCH "([0-9]+)" 
31   LIBCURL_VERSION_MJ ${LIBCURL_VERSION_MJ})
32 string (REGEX MATCH 
33   "LIBCURL_VERSION_MINOR[ \t]+([0-9]+)"
34   LIBCURL_VERSION_MI ${CURL_VERSION_H_CONTENTS})
35 string (REGEX MATCH "([0-9]+)" LIBCURL_VERSION_MI ${LIBCURL_VERSION_MI})
36 string (REGEX MATCH 
37   "LIBCURL_VERSION_PATCH[ \t]+([0-9]+)" 
38   LIBCURL_VERSION_PT ${CURL_VERSION_H_CONTENTS})
39 string (REGEX MATCH "([0-9]+)" LIBCURL_VERSION_PT ${LIBCURL_VERSION_PT})
40 set (CURL_MAJOR_VERSION ${LIBCURL_VERSION_MJ})
41 set (CURL_MINOR_VERSION ${LIBCURL_VERSION_MI})
42 set (CURL_PATCH_VERSION ${LIBCURL_VERSION_PT})
43
44 include_regular_expression("^.*$")    # Sukender: Is it necessary?
45
46 # Setup package meta-data
47 # SET(PACKAGE "curl")
48 set(CURL_VERSION ${CURL_MAJOR_VERSION}.${CURL_MINOR_VERSION}.${CURL_PATCH_VERSION})
49 message(STATUS "curl version=[${CURL_VERSION}]")
50 # SET(PACKAGE_TARNAME "curl")
51 # SET(PACKAGE_NAME "curl")
52 # SET(PACKAGE_VERSION "-")
53 # SET(PACKAGE_STRING "curl-")
54 # SET(PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/")
55 set(OPERATING_SYSTEM "${CMAKE_SYSTEM_NAME}")
56 set(OS "\"${CMAKE_SYSTEM_NAME}\"")
57
58 # Make the base headers visible to everything
59 # IF(NOT ${PROJECT_BINARY_DIR} EQUAL ${PROJECT_SOURCE_DIR})
60 # INCLUDE_DIRECTORIES(${PROJECT_BINARY_DIR}/include)
61 # ENDIF()
62 include_directories( ${CURL_SOURCE_DIR}/include )
63
64 if(WIN32)
65   set(NATIVE_WINDOWS ON)
66 endif()
67
68 option(BUILD_CURL_EXE "Set to ON to build cURL executable." ON)
69 option(BUILD_CURL_TESTS "Set to ON to build cURL tests." ON)
70 option(CURL_STATICLIB "Set to ON to build libcurl with static linking." OFF)
71 option(CURL_USE_ARES "Set to ON to enable c-ares support" OFF)
72 # initialize CURL_LIBS
73 set(CURL_LIBS "")
74
75 if(CURL_USE_ARES)
76   set(USE_ARES ${CURL_USE_ARES})
77   find_package(CARES REQUIRED) 
78   list(APPEND CURL_LIBS ${CARES_LIBRARY} )
79   set(CURL_LIBS ${CURL_LIBS} ${CARES_LIBRARY})
80 endif()
81
82 option(BUILD_DASHBOARD_REPORTS "Set to ON to activate reporting of cURL builds here http://www.cdash.org/CDashPublic/index.php?project=CURL" OFF)
83 if(BUILD_DASHBOARD_REPORTS)
84   #INCLUDE(Dart)
85   include(CTest)
86 endif(BUILD_DASHBOARD_REPORTS)
87
88 if(MSVC)
89   option(BUILD_RELEASE_DEBUG_DIRS "Set OFF to build each configuration to a separate directory" OFF)
90   mark_as_advanced(BUILD_RELEASE_DEBUG_DIRS)
91 endif()
92
93 option(CURL_HIDDEN_SYMBOLS "Set to ON to hide libcurl internal symbols (=hide all symbols that aren't officially external)." ON)
94 mark_as_advanced(CURL_HIDDEN_SYMBOLS)
95
96 # IF(WIN32)
97 # OPTION(CURL_WINDOWS_SSPI "Use windows libraries to allow NTLM authentication without openssl" ON)
98 # MARK_AS_ADVANCED(CURL_WINDOWS_SSPI)
99 # ENDIF()
100
101 option(HTTP_ONLY "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)" OFF)
102 mark_as_advanced(HTTP_ONLY)
103 option(CURL_DISABLE_FTP "disables FTP" OFF)
104 mark_as_advanced(CURL_DISABLE_FTP)
105 option(CURL_DISABLE_LDAP "disables LDAP" OFF)
106 mark_as_advanced(CURL_DISABLE_LDAP)
107 option(CURL_DISABLE_TELNET "disables Telnet" OFF)
108 mark_as_advanced(CURL_DISABLE_TELNET)
109 option(CURL_DISABLE_DICT "disables DICT" OFF)
110 mark_as_advanced(CURL_DISABLE_DICT)
111 option(CURL_DISABLE_FILE "disables FILE" OFF)
112 mark_as_advanced(CURL_DISABLE_FILE)
113 option(CURL_DISABLE_TFTP "disables TFTP" OFF)
114 mark_as_advanced(CURL_DISABLE_TFTP)
115 option(CURL_DISABLE_HTTP "disables HTTP" OFF)
116 mark_as_advanced(CURL_DISABLE_HTTP)
117
118 option(CURL_DISABLE_LDAPS "to disable LDAPS" OFF)
119 mark_as_advanced(CURL_DISABLE_LDAPS)
120 if(WIN32)
121   set(CURL_DEFAULT_DISABLE_LDAP OFF)
122   # some windows compilers do not have wldap32 
123   if( NOT HAVE_WLDAP32)
124     set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE)
125     message(STATUS "wldap32 not found CURL_DISABLE_LDAP set ON")
126     option(CURL_LDAP_WIN "Use W$ LDAP implementation" OFF)
127   else()
128     option(CURL_LDAP_WIN "Use W$ LDAP implementation" ON)
129   endif()
130   mark_as_advanced(CURL_LDAP_WIN)
131   set(CURL_LDAP_HYBRID OFF)
132 else()
133   option(CURL_LDAP_HYBRID "W$ LDAP with non-W$ compiler" OFF)
134   mark_as_advanced(CURL_LDAP_HYBRID)
135   set(CURL_LDAP_WIN OFF)
136 endif()
137
138 if(HTTP_ONLY)
139   set(CURL_DISABLE_FTP ON)
140   set(CURL_DISABLE_LDAP ON)
141   set(CURL_DISABLE_TELNET ON)
142   set(CURL_DISABLE_DICT ON)
143   set(CURL_DISABLE_FILE ON)
144   set(CURL_DISABLE_TFTP ON)
145 endif()
146
147 option(CURL_DISABLE_COOKIES "to disable cookies support" OFF)
148 mark_as_advanced(CURL_DISABLE_COOKIES)
149
150 option(CURL_DISABLE_CRYPTO_AUTH "to disable cryptographic authentication" OFF)
151 mark_as_advanced(CURL_DISABLE_CRYPTO_AUTH)
152 option(CURL_DISABLE_VERBOSE_STRINGS "to disable verbose strings" OFF)
153 mark_as_advanced(CURL_DISABLE_VERBOSE_STRINGS)
154 option(DISABLED_THREADSAFE "Set to explicitly specify we don't want to use thread-safe functions" OFF)
155 mark_as_advanced(DISABLED_THREADSAFE)
156 option(ENABLE_IPV6 "Define if you want to enable IPv6 support" OFF)
157 mark_as_advanced(ENABLE_IPV6)
158
159 if(WIN32)
160   list_spaces_append_once(CMAKE_C_STANDARD_LIBRARIES wsock32.lib ws2_32.lib)  # bufferoverflowu.lib
161   if(CURL_DISABLE_LDAP)
162     # Remove wldap32.lib from space-separated list
163     string(REPLACE " " ";" _LIST ${CMAKE_C_STANDARD_LIBRARIES})
164     list(REMOVE_ITEM _LIST "wldap32.lib")
165     to_list_spaces(_LIST CMAKE_C_STANDARD_LIBRARIES)
166   else()
167     # Append wldap32.lib
168     list_spaces_append_once(CMAKE_C_STANDARD_LIBRARIES wldap32.lib)
169   endif()
170   set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES}"   CACHE STRING "" FORCE)
171 endif()
172
173
174 # We need ansi c-flags, especially on HP
175 set(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}")
176 set(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS})
177
178 # Disable warnings on Borland to avoid changing 3rd party code.
179 if(BORLAND)
180   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
181 endif(BORLAND)
182
183 # If we are on AIX, do the _ALL_SOURCE magic
184 if(${CMAKE_SYSTEM_NAME} MATCHES AIX)
185   set(_ALL_SOURCE 1)
186 endif(${CMAKE_SYSTEM_NAME} MATCHES AIX)
187
188 # Include all the necessary files for macros
189 include (CheckFunctionExists)
190 include (CheckIncludeFile)
191 include (CheckIncludeFiles)
192 include (CheckLibraryExists)
193 include (CheckSymbolExists)
194 # if crosscompiling is on, the CHECK_TYPE_SIZE macro coming with cmake uses
195 # TRY_COMPILE instead of TRY_RUN which makes crosscompiling easier, Alex
196 if(CMAKE_CROSSCOMPILING)  
197   include ("${CMAKE_MODULE_PATH}/CheckTypeSize.cmake")
198 else(CMAKE_CROSSCOMPILING)
199   include (CheckTypeSize)
200 endif(CMAKE_CROSSCOMPILING)
201
202 # On windows preload settings
203 if(WIN32)
204   include(${CMAKE_CURRENT_SOURCE_DIR}/CMake/Platforms/WindowsCache.cmake)
205 endif(WIN32)
206
207 # This macro checks if the symbol exists in the library and if it
208 # does, it appends library to the list.
209 macro(CHECK_LIBRARY_EXISTS_CONCAT LIBRARY SYMBOL VARIABLE)
210   check_library_exists("${LIBRARY};${CURL_LIBS}" ${SYMBOL} "" 
211     ${VARIABLE})
212   if(${VARIABLE})
213     set(CURL_LIBS ${CURL_LIBS} ${LIBRARY})
214   endif(${VARIABLE})
215 endmacro(CHECK_LIBRARY_EXISTS_CONCAT)
216
217 # Check for all needed libraries
218 check_library_exists_concat("dl"     dlopen       HAVE_LIBDL)
219 #CHECK_LIBRARY_EXISTS_CONCAT("ucb"    gethostname  HAVE_LIBUCB)
220 check_library_exists_concat("socket" connect      HAVE_LIBSOCKET)
221 check_library_exists("c" gethostbyname "" NOT_NEED_LIBNSL)
222
223 # Yellowtab Zeta needs different libraries than BeOS 5.
224 if(BEOS)
225   set(NOT_NEED_LIBNSL 1)
226   check_library_exists_concat("bind" gethostbyname HAVE_LIBBIND)
227   check_library_exists_concat("bnetapi" closesocket HAVE_LIBBNETAPI)
228 endif(BEOS)
229
230 if(NOT NOT_NEED_LIBNSL)
231   check_library_exists_concat("nsl"    gethostbyname  HAVE_LIBNSL)
232 endif(NOT NOT_NEED_LIBNSL)
233
234 check_library_exists_concat("ws2_32" getch        HAVE_LIBWS2_32)
235 check_library_exists_concat("winmm"  getch        HAVE_LIBWINMM)
236 check_library_exists("wldap32" cldap_open "" HAVE_WLDAP32)
237
238 # IF(NOT CURL_SPECIAL_LIBZ)
239 #  CHECK_LIBRARY_EXISTS_CONCAT("z"      inflateEnd   HAVE_LIBZ)
240 # ENDIF(NOT CURL_SPECIAL_LIBZ)
241
242 option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ON)
243 mark_as_advanced(CMAKE_USE_OPENSSL)
244 if(CMAKE_USE_OPENSSL)
245   if(WIN32)
246     find_package(OpenSSL)
247     if(OPENSSL_FOUND)
248       set(USE_SSLEAY TRUE)
249       set(USE_OPENSSL TRUE)
250       list(APPEND CURL_LIBS ${OPENSSL_LIBRARIES} )
251     endif()
252     #FIND_LIBRARY(LIBEAY NAMES libeay32)
253     #LIST(APPEND CURL_LIBS ${LIBEAY} )
254   else(WIN32)
255     check_library_exists_concat("crypto" CRYPTO_lock  HAVE_LIBCRYPTO)
256     check_library_exists_concat("ssl"    SSL_connect  HAVE_LIBSSL)
257   endif(WIN32)
258 endif(CMAKE_USE_OPENSSL)
259
260 # Check for idn
261 check_library_exists_concat("idn" idna_to_ascii_lz HAVE_LIBIDN)
262
263 # Check for LDAP
264 check_library_exists_concat("ldap" ldap_init HAVE_LIBLDAP)
265 # if(NOT HAVE_LIBLDAP)
266 # SET(CURL_DISABLE_LDAP ON)
267 # endif(NOT HAVE_LIBLDAP)
268
269 # Check for symbol dlopen (same as HAVE_LIBDL)
270 check_library_exists("${CURL_LIBS}" dlopen "" HAVE_DLOPEN)
271
272 # For other tests to use the same libraries
273 set(CMAKE_REQUIRED_LIBRARIES ${CURL_LIBS})
274
275 option(CURL_ZLIB "Set to ON to enable building cURL with zlib support." ON)
276 set(HAVE_LIBZ OFF)
277 set(HAVE_ZLIB_H OFF)
278 set(HAVE_ZLIB OFF)
279 if(CURL_ZLIB)  # AND CURL_CONFIG_HAS_BEEN_RUN_BEFORE
280   find_package(ZLIB QUIET)
281   if(ZLIB_FOUND)
282     set(HAVE_ZLIB_H ON)
283     set(HAVE_ZLIB ON)
284     set(HAVE_LIBZ ON)
285   endif()
286 endif()
287
288 # If we have features.h, then do the _BSD_SOURCE magic
289 check_include_file("features.h"       HAVE_FEATURES_H)
290
291 # Check if header file exists and add it to the list.
292 macro(CHECK_INCLUDE_FILE_CONCAT FILE VARIABLE)
293   check_include_files("${CURL_INCLUDES};${FILE}" ${VARIABLE})
294   if(${VARIABLE})
295     set(CURL_INCLUDES ${CURL_INCLUDES} ${FILE})
296     set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -D${VARIABLE}")
297   endif(${VARIABLE})
298 endmacro(CHECK_INCLUDE_FILE_CONCAT)
299
300
301 # Check for header files
302 if(NOT UNIX)
303   check_include_file_concat("ws2tcpip.h"     HAVE_WS2TCPIP_H)
304   check_include_file_concat("winsock2.h"     HAVE_WINSOCK2_H)
305 endif(NOT UNIX)
306 check_include_file_concat("stdio.h"          HAVE_STDIO_H)
307 if(NOT UNIX)
308   check_include_file_concat("windows.h"      HAVE_WINDOWS_H)
309   check_include_file_concat("winsock.h"      HAVE_WINSOCK_H)
310 endif(NOT UNIX)
311
312 check_include_file_concat("inttypes.h"       HAVE_INTTYPES_H)
313 check_include_file_concat("sys/filio.h"      HAVE_SYS_FILIO_H)
314 check_include_file_concat("sys/ioctl.h"      HAVE_SYS_IOCTL_H)
315 check_include_file_concat("sys/param.h"      HAVE_SYS_PARAM_H)
316 check_include_file_concat("sys/poll.h"       HAVE_SYS_POLL_H)
317 check_include_file_concat("sys/resource.h"   HAVE_SYS_RESOURCE_H)
318 check_include_file_concat("sys/select.h"     HAVE_SYS_SELECT_H)
319 check_include_file_concat("sys/socket.h"     HAVE_SYS_SOCKET_H)
320 check_include_file_concat("sys/sockio.h"     HAVE_SYS_SOCKIO_H)
321 check_include_file_concat("sys/stat.h"       HAVE_SYS_STAT_H)
322 check_include_file_concat("sys/time.h"       HAVE_SYS_TIME_H)
323 check_include_file_concat("sys/types.h"      HAVE_SYS_TYPES_H)
324 check_include_file_concat("sys/uio.h"        HAVE_SYS_UIO_H)
325 check_include_file_concat("sys/un.h"         HAVE_SYS_UN_H)
326 check_include_file_concat("sys/utime.h"      HAVE_SYS_UTIME_H)
327 check_include_file_concat("alloca.h"         HAVE_ALLOCA_H)
328 check_include_file_concat("arpa/inet.h"      HAVE_ARPA_INET_H)
329 check_include_file_concat("arpa/tftp.h"      HAVE_ARPA_TFTP_H)
330 check_include_file_concat("assert.h"         HAVE_ASSERT_H)
331 check_include_file_concat("crypto.h"         HAVE_CRYPTO_H)
332 check_include_file_concat("des.h"            HAVE_DES_H)
333 check_include_file_concat("err.h"            HAVE_ERR_H)
334 check_include_file_concat("errno.h"          HAVE_ERRNO_H)
335 check_include_file_concat("fcntl.h"          HAVE_FCNTL_H)
336 check_include_file_concat("gssapi/gssapi.h"  HAVE_GSSAPI_GSSAPI_H)
337 check_include_file_concat("gssapi/gssapi_generic.h" HAVE_GSSAPI_GSSAPI_GENERIC_H)
338 check_include_file_concat("gssapi/gssapi_krb5.h" HAVE_GSSAPI_GSSAPI_KRB5_H)
339 check_include_file_concat("idn-free.h"       HAVE_IDN_FREE_H)
340 check_include_file_concat("ifaddrs.h"        HAVE_IFADDRS_H)
341 check_include_file_concat("io.h"             HAVE_IO_H)
342 check_include_file_concat("krb.h"            HAVE_KRB_H)
343 check_include_file_concat("libgen.h"         HAVE_LIBGEN_H)
344 check_include_file_concat("libssh2.h"        HAVE_LIBSSH2_H)
345 check_include_file_concat("limits.h"         HAVE_LIMITS_H)
346 check_include_file_concat("locale.h"         HAVE_LOCALE_H)
347 check_include_file_concat("net/if.h"         HAVE_NET_IF_H)
348 check_include_file_concat("netdb.h"          HAVE_NETDB_H)
349 check_include_file_concat("netinet/in.h"     HAVE_NETINET_IN_H)
350 check_include_file_concat("netinet/tcp.h"    HAVE_NETINET_TCP_H)
351 check_include_file_concat("openssl/crypto.h" HAVE_OPENSSL_CRYPTO_H)
352 check_include_file_concat("openssl/engine.h" HAVE_OPENSSL_ENGINE_H)
353 check_include_file_concat("openssl/err.h"    HAVE_OPENSSL_ERR_H)
354 check_include_file_concat("openssl/pem.h"    HAVE_OPENSSL_PEM_H)
355 check_include_file_concat("openssl/pkcs12.h" HAVE_OPENSSL_PKCS12_H)
356 check_include_file_concat("openssl/rsa.h"    HAVE_OPENSSL_RSA_H)
357 check_include_file_concat("openssl/ssl.h"    HAVE_OPENSSL_SSL_H)
358 check_include_file_concat("openssl/x509.h"   HAVE_OPENSSL_X509_H)
359 check_include_file_concat("pem.h"            HAVE_PEM_H)
360 check_include_file_concat("poll.h"           HAVE_POLL_H)
361 check_include_file_concat("pwd.h"            HAVE_PWD_H)
362 check_include_file_concat("rsa.h"            HAVE_RSA_H)
363 check_include_file_concat("setjmp.h"         HAVE_SETJMP_H)
364 check_include_file_concat("sgtty.h"          HAVE_SGTTY_H)
365 check_include_file_concat("signal.h"         HAVE_SIGNAL_H)
366 check_include_file_concat("ssl.h"            HAVE_SSL_H)
367 check_include_file_concat("stdbool.h"        HAVE_STDBOOL_H)
368 check_include_file_concat("stdint.h"         HAVE_STDINT_H)
369 check_include_file_concat("stdio.h"          HAVE_STDIO_H)
370 check_include_file_concat("stdlib.h"         HAVE_STDLIB_H)
371 check_include_file_concat("string.h"         HAVE_STRING_H)
372 check_include_file_concat("strings.h"        HAVE_STRINGS_H)
373 check_include_file_concat("stropts.h"        HAVE_STROPTS_H)
374 check_include_file_concat("termio.h"         HAVE_TERMIO_H)
375 check_include_file_concat("termios.h"        HAVE_TERMIOS_H)
376 check_include_file_concat("time.h"           HAVE_TIME_H)
377 check_include_file_concat("tld.h"            HAVE_TLD_H)
378 check_include_file_concat("unistd.h"         HAVE_UNISTD_H)
379 check_include_file_concat("utime.h"          HAVE_UTIME_H)
380 check_include_file_concat("x509.h"           HAVE_X509_H)
381
382 check_include_file_concat("process.h"        HAVE_PROCESS_H)
383 check_include_file_concat("stddef.h"         HAVE_STDDEF_H)
384 check_include_file_concat("dlfcn.h"          HAVE_DLFCN_H)
385 check_include_file_concat("malloc.h"         HAVE_MALLOC_H)
386 check_include_file_concat("memory.h"         HAVE_MEMORY_H)
387 check_include_file_concat("ldap.h"           HAVE_LDAP_H)
388 check_include_file_concat("netinet/if_ether.h" HAVE_NETINET_IF_ETHER_H)
389 check_include_file_concat("stdint.h"        HAVE_STDINT_H)
390 check_include_file_concat("sockio.h"        HAVE_SOCKIO_H)
391 check_include_file_concat("sys/utsname.h"   HAVE_SYS_UTSNAME_H)
392 check_include_file_concat("idna.h"          HAVE_IDNA_H)
393
394 if(CMAKE_USE_OPENSSL)
395   check_include_file_concat("openssl/rand.h"   HAVE_OPENSSL_RAND_H)
396 endif(CMAKE_USE_OPENSSL)
397
398
399 check_type_size(size_t  SIZEOF_SIZE_T)
400 check_type_size(ssize_t  SIZEOF_SSIZE_T)
401 check_type_size("long long"  SIZEOF_LONG_LONG)
402 check_type_size("long"  SIZEOF_LONG)
403 check_type_size("int"  SIZEOF_INT)
404 check_type_size("__int64"  SIZEOF___INT64)
405 check_type_size("long double"  SIZEOF_LONG_DOUBLE)
406 check_type_size("time_t"  SIZEOF_TIME_T)
407 if(NOT HAVE_SIZEOF_SSIZE_T)
408   if(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
409     set(ssize_t long)
410   endif(SIZEOF_LONG EQUAL SIZEOF_SIZE_T)
411   if(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
412     set(ssize_t __int64)
413   endif(NOT ssize_t AND SIZEOF___INT64 EQUAL SIZEOF_SIZE_T)
414 endif(NOT HAVE_SIZEOF_SSIZE_T)
415
416 # Different sizeofs, etc.
417
418 #    define CURL_SIZEOF_LONG        4
419 #    define CURL_TYPEOF_CURL_OFF_T  long long
420 #    define CURL_FORMAT_CURL_OFF_T  "lld"
421 #    define CURL_FORMAT_CURL_OFF_TU "llu"
422 #    define CURL_FORMAT_OFF_T       "%lld"
423 #    define CURL_SIZEOF_CURL_OFF_T  8
424 #    define CURL_SUFFIX_CURL_OFF_T  LL
425 #    define CURL_SUFFIX_CURL_OFF_TU ULL
426
427 set(CURL_SIZEOF_LONG ${SIZEOF_LONG})
428
429 if(SIZEOF_LONG EQUAL 8)
430   set(CURL_TYPEOF_CURL_OFF_T long)
431   set(CURL_SIZEOF_CURL_OFF_T 8)
432   set(CURL_FORMAT_CURL_OFF_T "ld")
433   set(CURL_FORMAT_CURL_OFF_TU "lu")
434   set(CURL_FORMAT_OFF_T "%ld")
435   set(CURL_SUFFIX_CURL_OFF_T L)
436   set(CURL_SUFFIX_CURL_OFF_TU LU)
437 endif(SIZEOF_LONG EQUAL 8)
438
439 if(SIZEOF_LONG_LONG EQUAL 8)
440   set(CURL_TYPEOF_CURL_OFF_T "long long")
441   set(CURL_SIZEOF_CURL_OFF_T 8)
442   set(CURL_FORMAT_CURL_OFF_T "lld")
443   set(CURL_FORMAT_CURL_OFF_TU "llu")
444   set(CURL_FORMAT_OFF_T "%lld")
445   set(CURL_SUFFIX_CURL_OFF_T LL)
446   set(CURL_SUFFIX_CURL_OFF_TU LLU)
447 endif(SIZEOF_LONG_LONG EQUAL 8)
448
449 if(NOT CURL_TYPEOF_CURL_OFF_T)
450   set(CURL_TYPEOF_CURL_OFF_T ${ssize_t})
451   set(CURL_SIZEOF_CURL_OFF_T ${SIZEOF_SSIZE_T})
452   # TODO: need adjustment here.
453   set(CURL_FORMAT_CURL_OFF_T "ld")
454   set(CURL_FORMAT_CURL_OFF_TU "lu")
455   set(CURL_FORMAT_OFF_T "%ld")
456   set(CURL_SUFFIX_CURL_OFF_T L)
457   set(CURL_SUFFIX_CURL_OFF_TU LU)
458 endif(NOT CURL_TYPEOF_CURL_OFF_T)
459
460 if(HAVE_SIZEOF_LONG_LONG)
461   set(HAVE_LONGLONG 1)
462   set(HAVE_LL 1)
463 endif(HAVE_SIZEOF_LONG_LONG)
464
465 find_file(RANDOM_FILE urandom /dev)
466 mark_as_advanced(RANDOM_FILE)
467
468 # Check for some functions that are used
469 check_symbol_exists(basename      "${CURL_INCLUDES}" HAVE_BASENAME)
470 check_symbol_exists(socket        "${CURL_INCLUDES}" HAVE_SOCKET)
471 check_symbol_exists(poll          "${CURL_INCLUDES}" HAVE_POLL)
472 check_symbol_exists(select        "${CURL_INCLUDES}" HAVE_SELECT)
473 check_symbol_exists(strdup        "${CURL_INCLUDES}" HAVE_STRDUP)
474 check_symbol_exists(strstr        "${CURL_INCLUDES}" HAVE_STRSTR)
475 check_symbol_exists(strtok_r      "${CURL_INCLUDES}" HAVE_STRTOK_R)
476 check_symbol_exists(strftime      "${CURL_INCLUDES}" HAVE_STRFTIME)
477 check_symbol_exists(uname         "${CURL_INCLUDES}" HAVE_UNAME)
478 check_symbol_exists(strcasecmp    "${CURL_INCLUDES}" HAVE_STRCASECMP)
479 check_symbol_exists(stricmp       "${CURL_INCLUDES}" HAVE_STRICMP)
480 check_symbol_exists(strcmpi       "${CURL_INCLUDES}" HAVE_STRCMPI)
481 check_symbol_exists(strncmpi      "${CURL_INCLUDES}" HAVE_STRNCMPI)
482 check_symbol_exists(alarm         "${CURL_INCLUDES}" HAVE_ALARM)
483 if(NOT HAVE_STRNCMPI)
484   set(HAVE_STRCMPI)
485 endif(NOT HAVE_STRNCMPI)
486 check_symbol_exists(gethostbyaddr "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR)
487 check_symbol_exists(gethostbyaddr_r "${CURL_INCLUDES}" HAVE_GETHOSTBYADDR_R)
488 check_symbol_exists(gettimeofday  "${CURL_INCLUDES}" HAVE_GETTIMEOFDAY)
489 check_symbol_exists(inet_addr     "${CURL_INCLUDES}" HAVE_INET_ADDR)
490 check_symbol_exists(inet_ntoa     "${CURL_INCLUDES}" HAVE_INET_NTOA)
491 check_symbol_exists(inet_ntoa_r   "${CURL_INCLUDES}" HAVE_INET_NTOA_R)
492 check_symbol_exists(tcsetattr     "${CURL_INCLUDES}" HAVE_TCSETATTR)
493 check_symbol_exists(tcgetattr     "${CURL_INCLUDES}" HAVE_TCGETATTR)
494 check_symbol_exists(perror        "${CURL_INCLUDES}" HAVE_PERROR)
495 check_symbol_exists(closesocket   "${CURL_INCLUDES}" HAVE_CLOSESOCKET)
496 check_symbol_exists(setvbuf       "${CURL_INCLUDES}" HAVE_SETVBUF)
497 check_symbol_exists(sigsetjmp     "${CURL_INCLUDES}" HAVE_SIGSETJMP)
498 check_symbol_exists(getpass_r     "${CURL_INCLUDES}" HAVE_GETPASS_R)
499 check_symbol_exists(strlcat       "${CURL_INCLUDES}" HAVE_STRLCAT)
500 check_symbol_exists(getpwuid      "${CURL_INCLUDES}" HAVE_GETPWUID)
501 check_symbol_exists(geteuid       "${CURL_INCLUDES}" HAVE_GETEUID)
502 check_symbol_exists(utime         "${CURL_INCLUDES}" HAVE_UTIME)
503 if(CMAKE_USE_OPENSSL)
504   check_symbol_exists(RAND_status   "${CURL_INCLUDES}" HAVE_RAND_STATUS)
505   check_symbol_exists(RAND_screen   "${CURL_INCLUDES}" HAVE_RAND_SCREEN)
506   check_symbol_exists(RAND_egd      "${CURL_INCLUDES}" HAVE_RAND_EGD)
507   check_symbol_exists(CRYPTO_cleanup_all_ex_data "${CURL_INCLUDES}" 
508     HAVE_CRYPTO_CLEANUP_ALL_EX_DATA)
509   if(HAVE_LIBCRYPTO AND HAVE_LIBSSL)
510     set(USE_OPENSSL 1)
511     set(USE_SSLEAY 1)
512   endif(HAVE_LIBCRYPTO AND HAVE_LIBSSL)
513 endif(CMAKE_USE_OPENSSL)
514 check_symbol_exists(gmtime_r      "${CURL_INCLUDES}" HAVE_GMTIME_R)
515 check_symbol_exists(localtime_r   "${CURL_INCLUDES}" HAVE_LOCALTIME_R)
516
517 check_symbol_exists(gethostbyname   "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME)
518 check_symbol_exists(gethostbyname_r "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R)
519
520 check_symbol_exists(signal        "${CURL_INCLUDES}" HAVE_SIGNAL_FUNC)
521 check_symbol_exists(SIGALRM       "${CURL_INCLUDES}" HAVE_SIGNAL_MACRO)
522 if(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO)
523   set(HAVE_SIGNAL 1)
524 endif(HAVE_SIGNAL_FUNC AND HAVE_SIGNAL_MACRO)
525 check_symbol_exists(uname          "${CURL_INCLUDES}" HAVE_UNAME)
526 check_symbol_exists(strtoll        "${CURL_INCLUDES}" HAVE_STRTOLL)
527 check_symbol_exists(_strtoi64      "${CURL_INCLUDES}" HAVE__STRTOI64)
528 check_symbol_exists(strerror_r     "${CURL_INCLUDES}" HAVE_STRERROR_R)
529 check_symbol_exists(siginterrupt   "${CURL_INCLUDES}" HAVE_SIGINTERRUPT)
530 check_symbol_exists(perror         "${CURL_INCLUDES}" HAVE_PERROR)
531 check_symbol_exists(fork           "${CURL_INCLUDES}" HAVE_FORK)
532 check_symbol_exists(freeaddrinfo   "${CURL_INCLUDES}" HAVE_FREEADDRINFO)
533 check_symbol_exists(freeifaddrs    "${CURL_INCLUDES}" HAVE_FREEIFADDRS)
534 check_symbol_exists(pipe           "${CURL_INCLUDES}" HAVE_PIPE)
535 check_symbol_exists(ftruncate      "${CURL_INCLUDES}" HAVE_FTRUNCATE)
536 check_symbol_exists(getprotobyname "${CURL_INCLUDES}" HAVE_GETPROTOBYNAME)
537 check_symbol_exists(getrlimit      "${CURL_INCLUDES}" HAVE_GETRLIMIT)
538 check_symbol_exists(idn_free       "${CURL_INCLUDES}" HAVE_IDN_FREE)
539 check_symbol_exists(idna_strerror  "${CURL_INCLUDES}" HAVE_IDNA_STRERROR)
540 check_symbol_exists(tld_strerror   "${CURL_INCLUDES}" HAVE_TLD_STRERROR)
541 check_symbol_exists(setlocale      "${CURL_INCLUDES}" HAVE_SETLOCALE)
542 check_symbol_exists(setrlimit      "${CURL_INCLUDES}" HAVE_SETRLIMIT)
543 check_symbol_exists(fcntl          "${CURL_INCLUDES}" HAVE_FCNTL)
544 check_symbol_exists(ioctl          "${CURL_INCLUDES}" HAVE_IOCTL)
545 check_symbol_exists(setsockopt     "${CURL_INCLUDES}" HAVE_SETSOCKOPT)
546
547 # symbol exists in win32, but function does not.
548 check_function_exists(inet_pton HAVE_INET_PTON)
549
550 # sigaction and sigsetjmp are special. Use special mechanism for
551 # detecting those, but only if previous attempt failed.
552 if(HAVE_SIGNAL_H)
553   check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION)
554 endif(HAVE_SIGNAL_H)
555
556 if(NOT HAVE_SIGSETJMP)
557   if(HAVE_SETJMP_H)
558     check_symbol_exists(sigsetjmp "setjmp.h" HAVE_MACRO_SIGSETJMP)
559     if(HAVE_MACRO_SIGSETJMP)
560       set(HAVE_SIGSETJMP 1)
561     endif(HAVE_MACRO_SIGSETJMP)
562   endif(HAVE_SETJMP_H)
563 endif(NOT HAVE_SIGSETJMP)
564
565 # If there is no stricmp(), do not allow LDAP to parse URLs
566 if(NOT HAVE_STRICMP)
567   set(HAVE_LDAP_URL_PARSE 1)
568 endif(NOT HAVE_STRICMP)
569
570 # For other curl specific tests, use this macro.
571 macro(CURL_INTERNAL_TEST CURL_TEST)
572   if("${CURL_TEST}" MATCHES "^${CURL_TEST}$")
573     set(MACRO_CHECK_FUNCTION_DEFINITIONS 
574       "-D${CURL_TEST} ${CURL_TEST_DEFINES} ${CMAKE_REQUIRED_FLAGS}")
575     if(CMAKE_REQUIRED_LIBRARIES)
576       set(CURL_TEST_ADD_LIBRARIES
577         "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
578     endif(CMAKE_REQUIRED_LIBRARIES)
579
580     message(STATUS "Performing Curl Test ${CURL_TEST}")
581     try_compile(${CURL_TEST}
582       ${CMAKE_BINARY_DIR}
583       ${CMAKE_CURRENT_SOURCE_DIR}/CMake/CurlTests.c
584       CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
585       "${CURL_TEST_ADD_LIBRARIES}"
586       OUTPUT_VARIABLE OUTPUT)
587     if(${CURL_TEST})
588       set(${CURL_TEST} 1 CACHE INTERNAL "Curl test ${FUNCTION}")
589       message(STATUS "Performing Curl Test ${CURL_TEST} - Success")
590       file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log 
591         "Performing Curl Test ${CURL_TEST} passed with the following output:\n"
592         "${OUTPUT}\n")
593     else(${CURL_TEST})
594       message(STATUS "Performing Curl Test ${CURL_TEST} - Failed")
595       set(${CURL_TEST} "" CACHE INTERNAL "Curl test ${FUNCTION}")
596       file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log 
597         "Performing Curl Test ${CURL_TEST} failed with the following output:\n"
598         "${OUTPUT}\n")
599     endif(${CURL_TEST})
600   endif("${CURL_TEST}" MATCHES "^${CURL_TEST}$")
601 endmacro(CURL_INTERNAL_TEST) 
602
603 macro(CURL_INTERNAL_TEST_RUN CURL_TEST)
604   if("${CURL_TEST}_COMPILE" MATCHES "^${CURL_TEST}_COMPILE$")
605     set(MACRO_CHECK_FUNCTION_DEFINITIONS 
606       "-D${CURL_TEST} ${CMAKE_REQUIRED_FLAGS}")
607     if(CMAKE_REQUIRED_LIBRARIES)
608       set(CURL_TEST_ADD_LIBRARIES
609         "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
610     endif(CMAKE_REQUIRED_LIBRARIES)
611
612     message(STATUS "Performing Curl Test ${CURL_TEST}")
613     try_run(${CURL_TEST} ${CURL_TEST}_COMPILE
614       ${CMAKE_BINARY_DIR}
615       ${CMAKE_CURRENT_SOURCE_DIR}/CMake/CurlTests.c
616       CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
617       "${CURL_TEST_ADD_LIBRARIES}"
618       OUTPUT_VARIABLE OUTPUT)
619     if(${CURL_TEST}_COMPILE AND NOT ${CURL_TEST})
620       set(${CURL_TEST} 1 CACHE INTERNAL "Curl test ${FUNCTION}")
621       message(STATUS "Performing Curl Test ${CURL_TEST} - Success")
622     else(${CURL_TEST}_COMPILE AND NOT ${CURL_TEST})
623       message(STATUS "Performing Curl Test ${CURL_TEST} - Failed")
624       set(${CURL_TEST} "" CACHE INTERNAL "Curl test ${FUNCTION}")
625       file(APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log"
626         "Performing Curl Test ${CURL_TEST} failed with the following output:\n"
627         "${OUTPUT}")
628       if(${CURL_TEST}_COMPILE)
629         file(APPEND 
630           "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log" 
631           "There was a problem running this test\n")
632       endif(${CURL_TEST}_COMPILE)
633       file(APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log" 
634         "\n\n")
635     endif(${CURL_TEST}_COMPILE AND NOT ${CURL_TEST})
636   endif("${CURL_TEST}_COMPILE" MATCHES "^${CURL_TEST}_COMPILE$")
637 endmacro(CURL_INTERNAL_TEST_RUN) 
638
639 # Do curl specific tests
640 foreach(CURL_TEST 
641     HAVE_FCNTL_O_NONBLOCK
642     HAVE_IOCTLSOCKET
643     HAVE_IOCTLSOCKET_CAMEL
644     HAVE_IOCTLSOCKET_CAMEL_FIONBIO
645     HAVE_IOCTLSOCKET_FIONBIO
646     HAVE_IOCTL_FIONBIO
647     HAVE_IOCTL_SIOCGIFADDR
648     HAVE_SETSOCKOPT_SO_NONBLOCK
649     HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
650     TIME_WITH_SYS_TIME
651     HAVE_O_NONBLOCK
652     HAVE_GETHOSTBYADDR_R_5
653     HAVE_GETHOSTBYADDR_R_7
654     HAVE_GETHOSTBYADDR_R_8
655     HAVE_GETHOSTBYADDR_R_5_REENTRANT
656     HAVE_GETHOSTBYADDR_R_7_REENTRANT
657     HAVE_GETHOSTBYADDR_R_8_REENTRANT
658     HAVE_GETHOSTBYNAME_R_3
659     HAVE_GETHOSTBYNAME_R_5
660     HAVE_GETHOSTBYNAME_R_6
661     HAVE_GETHOSTBYNAME_R_3_REENTRANT
662     HAVE_GETHOSTBYNAME_R_5_REENTRANT
663     HAVE_GETHOSTBYNAME_R_6_REENTRANT
664     HAVE_SOCKLEN_T
665     HAVE_IN_ADDR_T
666     HAVE_BOOL_T
667     STDC_HEADERS
668     RETSIGTYPE_TEST
669     HAVE_INET_NTOA_R_DECL
670     HAVE_INET_NTOA_R_DECL_REENTRANT
671     HAVE_GETADDRINFO
672     HAVE_FILE_OFFSET_BITS
673     )
674   curl_internal_test(${CURL_TEST})
675 endforeach(CURL_TEST)
676 if(HAVE_FILE_OFFSET_BITS)
677   set(_FILE_OFFSET_BITS 64)
678 endif(HAVE_FILE_OFFSET_BITS)
679 foreach(CURL_TEST 
680     HAVE_GLIBC_STRERROR_R
681     HAVE_POSIX_STRERROR_R
682     )
683   curl_internal_test_run(${CURL_TEST})
684 endforeach(CURL_TEST)
685
686 # Check for reentrant
687 foreach(CURL_TEST
688     HAVE_GETHOSTBYADDR_R_5
689     HAVE_GETHOSTBYADDR_R_7
690     HAVE_GETHOSTBYADDR_R_8
691     HAVE_GETHOSTBYNAME_R_3
692     HAVE_GETHOSTBYNAME_R_5
693     HAVE_GETHOSTBYNAME_R_6
694     HAVE_INET_NTOA_R_DECL_REENTRANT)
695   if(NOT ${CURL_TEST})
696     if(${CURL_TEST}_REENTRANT)
697       set(NEED_REENTRANT 1)
698     endif(${CURL_TEST}_REENTRANT)
699   endif(NOT ${CURL_TEST})
700 endforeach(CURL_TEST)
701
702 if(NEED_REENTRANT)
703   foreach(CURL_TEST
704       HAVE_GETHOSTBYADDR_R_5
705       HAVE_GETHOSTBYADDR_R_7
706       HAVE_GETHOSTBYADDR_R_8
707       HAVE_GETHOSTBYNAME_R_3
708       HAVE_GETHOSTBYNAME_R_5
709       HAVE_GETHOSTBYNAME_R_6)
710     set(${CURL_TEST} 0)
711     if(${CURL_TEST}_REENTRANT)
712       set(${CURL_TEST} 1)
713     endif(${CURL_TEST}_REENTRANT)
714   endforeach(CURL_TEST)
715 endif(NEED_REENTRANT)
716
717 if(HAVE_INET_NTOA_R_DECL_REENTRANT)
718   set(HAVE_INET_NTOA_R_DECL 1)
719   set(NEED_REENTRANT 1)
720 endif(HAVE_INET_NTOA_R_DECL_REENTRANT)
721
722 # Some other minor tests
723
724 if(NOT HAVE_IN_ADDR_T)
725   set(in_addr_t "unsigned long")
726 endif(NOT HAVE_IN_ADDR_T)
727
728 # Fix libz / zlib.h
729
730 if(NOT CURL_SPECIAL_LIBZ)
731   if(NOT HAVE_LIBZ)
732     set(HAVE_ZLIB_H 0)
733   endif(NOT HAVE_LIBZ)
734
735   if(NOT HAVE_ZLIB_H)
736     set(HAVE_LIBZ 0)
737   endif(NOT HAVE_ZLIB_H)
738 endif(NOT CURL_SPECIAL_LIBZ)
739
740 if(_FILE_OFFSET_BITS)
741   set(_FILE_OFFSET_BITS 64)
742 endif(_FILE_OFFSET_BITS)
743 set(CMAKE_REQUIRED_FLAGS "-D_FILE_OFFSET_BITS=64")
744 set(CMAKE_EXTRA_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/curl/curl.h")
745 check_type_size("curl_off_t" SIZEOF_CURL_OFF_T)
746 set(CMAKE_EXTRA_INCLUDE_FILES)
747 set(CMAKE_REQUIRED_FLAGS)
748
749
750 # Check for nonblocking
751 set(HAVE_DISABLED_NONBLOCKING 1)
752 if(HAVE_FIONBIO OR 
753     HAVE_IOCTLSOCKET OR
754     HAVE_IOCTLSOCKET_CASE OR
755     HAVE_O_NONBLOCK)
756   set(HAVE_DISABLED_NONBLOCKING)
757 endif(HAVE_FIONBIO OR 
758   HAVE_IOCTLSOCKET OR
759   HAVE_IOCTLSOCKET_CASE OR
760   HAVE_O_NONBLOCK)
761
762 if(RETSIGTYPE_TEST)
763   set(RETSIGTYPE void)
764 else(RETSIGTYPE_TEST)
765   set(RETSIGTYPE int)
766 endif(RETSIGTYPE_TEST)
767
768 if(CMAKE_COMPILER_IS_GNUCC AND APPLE)
769   include(CheckCCompilerFlag)
770   check_c_compiler_flag(-Wno-long-double HAVE_C_FLAG_Wno_long_double)
771   if(HAVE_C_FLAG_Wno_long_double)
772     # The Mac version of GCC warns about use of long double.  Disable it.
773     get_source_file_property(MPRINTF_COMPILE_FLAGS mprintf.c COMPILE_FLAGS)
774     if(MPRINTF_COMPILE_FLAGS)
775       set(MPRINTF_COMPILE_FLAGS "${MPRINTF_COMPILE_FLAGS} -Wno-long-double")
776     else(MPRINTF_COMPILE_FLAGS)
777       set(MPRINTF_COMPILE_FLAGS "-Wno-long-double")
778     endif(MPRINTF_COMPILE_FLAGS)
779     set_source_files_properties(mprintf.c PROPERTIES
780       COMPILE_FLAGS ${MPRINTF_COMPILE_FLAGS})
781   endif(HAVE_C_FLAG_Wno_long_double)
782 endif(CMAKE_COMPILER_IS_GNUCC AND APPLE)
783
784 if(HAVE_SOCKLEN_T)
785   set(CURL_TYPEOF_CURL_SOCKLEN_T "socklen_t")
786   check_type_size("socklen_t" CURL_SIZEOF_CURL_SOCKLEN_T)
787 else()
788   set(CURL_TYPEOF_CURL_SOCKLEN_T int)
789   set(CURL_SIZEOF_CURL_SOCKLEN_T ${SIZEOF_INT})
790 endif()
791
792 include(CMake/OtherTests.cmake)
793
794 add_definitions(-DHAVE_CONFIG_H)
795
796 # For windows, do not allow the compiler to use default target (Vista).
797 if(WIN32)
798   add_definitions(-D_WIN32_WINNT=0x0501)
799 endif(WIN32)
800
801 if(MSVC)
802   add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
803 endif(MSVC)
804
805 # Sets up the dependencies (zlib, OpenSSL, etc.) of a cURL subproject according to options.
806 # TODO This is far to be complete!
807 function(SETUP_CURL_DEPENDENCIES TARGET_NAME)
808   if(CURL_ZLIB AND ZLIB_FOUND)
809     include_directories(${ZLIB_INCLUDE_DIR})
810   endif()
811   if(CURL_ZLIB AND ZLIB_FOUND)
812     target_link_libraries(${TARGET_NAME} ${ZLIB_LIBRARIES})
813     #ADD_DEFINITIONS( -DHAVE_ZLIB_H -DHAVE_ZLIB -DHAVE_LIBZ )
814   endif()
815
816   if(CMAKE_USE_OPENSSL AND OPENSSL_FOUND)
817     include_directories(${OPENSSL_INCLUDE_DIR})
818   endif()
819   if(CURL_SSL AND CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
820     target_link_libraries(${TARGET_NAME} ${OPENSSL_LIBRARIES})
821     #ADD_DEFINITIONS( -DUSE_SSLEAY )
822   endif()
823 endfunction()
824
825 # Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).
826 function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
827   file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT)
828   string(REPLACE "$(top_srcdir)"   "\${CURL_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
829   string(REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
830
831   string(REGEX REPLACE "\\\\\n" "§!§" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
832   string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*\n)" "SET(\\1 \\2)\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
833   string(REPLACE "§!§" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
834
835   string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})    # Replace $() with ${}
836   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.
837   file(WRITE ${OUTPUT_FILE} ${MAKEFILE_INC_TEXT})
838
839   ### BUGGY METHOD 1
840   # FILE(STRINGS Makefile.inc MAKEFILE_INC_TEXT)
841   # STRING(REPLACE "# ./lib/Makefile.inc" "" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
842   # STRING(REPLACE "  " " " MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})    # Replace tabs with spaces
843
844   # #STRING(REGEX MATCH "CSOURCES *=" AAA ${MAKEFILE_INC_TEXT})
845   # #MESSAGE(STATUS ${AAA})
846
847   # STRING(REPLACE "CSOURCES =" "" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
848   # STRING(REPLACE "HHEADERS =" "" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
849
850   # STRING(REGEX REPLACE "[^ ]+\\.c" "" ${HEADERS_VAR} ${MAKEFILE_INC_TEXT})    # Remove source files and store into headers var
851   # STRING(REGEX REPLACE "  +" " " ${HEADERS_VAR} ${${HEADERS_VAR}})
852   # STRING(REGEX REPLACE " " ";" ${HEADERS_VAR} ${${HEADERS_VAR}})
853
854   # STRING(REGEX REPLACE "[^ ]+\\.h" "" ${SOURCES_VAR} ${MAKEFILE_INC_TEXT})    # Remove headers and store into source files var
855   # STRING(REGEX REPLACE "  +" " " ${SOURCES_VAR} ${${SOURCES_VAR}})
856   # STRING(REGEX REPLACE " " ";" ${SOURCES_VAR} ${${SOURCES_VAR}})
857
858   # SET(${HEADERS_VAR} ${${HEADERS_VAR}} PARENT_SCOPE)
859   # SET(${SOURCES_VAR} ${${SOURCES_VAR}} PARENT_SCOPE)
860
861   ### BUGGY METHOD 2
862   # FILE(READ Makefile.inc MAKEFILE_INC_TEXT)
863   # #STRING(REPLACE "\t" " " MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})    # Replace tabs with spaces
864   # #STRING(REGEX REPLACE "\n+" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})    # Remove empty lines (allow a simplification in the script)
865   # STRING(REGEX REPLACE "([A-Z]+)[\t ]*=[\t ]*" "SET(\\1 " MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
866   # #STRING(REGEX REPLACE "^(.*)[\t ]*[^\\]$" ")" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
867   # STRING(REGEX REPLACE "([^\\])\n" "\\1)\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
868   # # STRING(REGEX REPLACE "CSOURCES *=" "SET(libCurl_SRCS " MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
869   # # STRING(REGEX REPLACE "HHEADERS *=" "SET(libCurl_HEADERS " MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
870   # FILE(WRITE Makefile.inc.cmake ${MAKEFILE_INC_TEXT})
871 endfunction()
872
873 add_subdirectory(lib)
874 if(BUILD_CURL_EXE)
875   add_subdirectory(src)
876 endif()
877 if(BUILD_CURL_TESTS)
878   add_subdirectory(tests)
879 endif()
880
881 # This needs to be run very last so other parts of the scripts can take advantage of this.
882 if(NOT CURL_CONFIG_HAS_BEEN_RUN_BEFORE)
883   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")
884 endif()