1 CMAKE_MINIMUM_REQUIRED (VERSION 3.1.0)
3 INCLUDE (CheckIncludeFiles)
4 INCLUDE (CheckTypeSize)
5 INCLUDE (CheckFunctionExists)
6 INCLUDE (CheckSymbolExists)
7 INCLUDE (CheckCSourceCompiles)
8 INCLUDE (CheckStructHasMember)
9 INCLUDE (CheckLibraryExists)
11 PROJECT (c-ares LANGUAGES C VERSION "1.18.0" )
13 # Set this version before release
14 SET (CARES_VERSION "1.18.1")
16 INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are wrong.
18 # This is for libtool compatibility, and specified in a form that is easily
19 # translatable from libtool (even if the actual form doesn't make sense).
20 # For instance, in an autotools project, in Makefile.am there is a line that
21 # contains something like:
23 # This breaks down into sections of current:revision:age
24 # This then generates a version of "(current-age).age.revision" with an
25 # interface version of "(current-age)"
26 # For example, a version of 4:0:2 would generate output such as:
27 # libname.so -> libname.so.2
28 # libname.so.2 -> libname.so.2.2.0
29 SET (CARES_LIB_VERSIONINFO "7:1:5")
32 OPTION (CARES_STATIC "Build as a static library" OFF)
33 OPTION (CARES_SHARED "Build as a shared library" ON)
34 OPTION (CARES_INSTALL "Create installation targets (chain builders may want to disable this)" ON)
35 OPTION (CARES_STATIC_PIC "Build the static library as PIC (position independent)" OFF)
36 OPTION (CARES_BUILD_TESTS "Build and run tests" OFF)
37 OPTION (CARES_BUILD_CONTAINER_TESTS "Build and run container tests (implies CARES_BUILD_TESTS, Linux only)" OFF)
38 OPTION (CARES_BUILD_TOOLS "Build tools" ON)
40 # Tests require static to be enabled on Windows to be able to access otherwise hidden symbols
41 IF (CARES_BUILD_TESTS AND (NOT CARES_STATIC) AND WIN32)
43 SET (CARES_STATIC_PIC ON)
44 MESSAGE (WARNING "Static building was requested be disabled, but reenabled to support tests")
47 # allow linking against the static runtime library in msvc
49 OPTION (CARES_MSVC_STATIC_RUNTIME "Link against the static runtime library" OFF)
50 IF (CARES_MSVC_STATIC_RUNTIME)
51 # CMAKE_CONFIGURATION_TYPES is empty on non-IDE generators (Ninja, NMake)
52 # and that's why we also use CMAKE_BUILD_TYPE to cover for those generators.
53 # For IDE generators, CMAKE_BUILD_TYPE is usually empty
54 FOREACH (config_type ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE})
55 STRING (TOUPPER ${config_type} upper_config_type)
56 SET (flag_var "CMAKE_C_FLAGS_${upper_config_type}")
57 IF (${flag_var} MATCHES "/MD")
58 STRING (REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
63 SET (upper_config_type)
69 # Keep build organized.
70 SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}")
71 SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
72 SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
73 SET (PACKAGE_DIRECTORY ${PROJECT_BINARY_DIR}/package)
75 # Destinations for installing different kinds of targets (pass to install command).
76 SET (TARGETS_INST_DEST
77 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
78 BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}
79 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
80 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
84 # CHECK_LIBRARY_EXISTS can't be used as it will return true if the function
85 # is found in a different dependent library.
86 MACRO (CARES_FUNCTION_IN_LIBRARY func lib var)
87 CHECK_FUNCTION_EXISTS ("${func}" "_CARES_FUNC_IN_LIB_GLOBAL_${func}")
88 IF ("${_CARES_FUNC_IN_LIB_GLOBAL_${func}}")
91 CHECK_LIBRARY_EXISTS ("${lib}" "${func}" "" ${var})
95 # Look for dependent/required libraries
96 CARES_FUNCTION_IN_LIBRARY (res_servicename resolv HAVE_RES_SERVICENAME_IN_LIBRESOLV)
97 IF (HAVE_RES_SERVICENAME_IN_LIBRESOLV)
98 SET (HAVE_LIBRESOLV 1)
102 CHECK_C_SOURCE_COMPILES ("
104 #include <TargetConditionals.h>
106 #if TARGET_OS_IPHONE == 0
107 #error Not an iPhone target
114 CHECK_C_SOURCE_COMPILES ("
116 #include <TargetConditionals.h>
118 #if TARGET_OS_IPHONE == 0 || __IPHONE_OS_VERSION_MIN_REQUIRED < 100000
126 CHECK_C_SOURCE_COMPILES ("
128 #include <AvailabilityMacros.h>
129 #ifndef MAC_OS_X_VERSION_10_12
130 # define MAC_OS_X_VERSION_10_12 101200
133 #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
134 # error Not MacOSX 10.12 or higher
142 IF ((IOS OR APPLE OR ZOS) AND HAVE_LIBRESOLV)
143 SET (CARES_USE_LIBRESOLV 1)
147 CARES_FUNCTION_IN_LIBRARY (gethostbyname nsl HAVE_LIBNSL)
148 CARES_FUNCTION_IN_LIBRARY (gethostbyname socket HAVE_GHBN_LIBSOCKET)
149 CARES_FUNCTION_IN_LIBRARY (gethostbyname network HAVE_LIBNETWORK)
150 CARES_FUNCTION_IN_LIBRARY (socket socket HAVE_SOCKET_LIBSOCKET)
151 IF (HAVE_GHBN_LIBSOCKET OR HAVE_SOCKET_LIBSOCKET)
152 SET(HAVE_LIBSOCKET TRUE)
154 CARES_FUNCTION_IN_LIBRARY (socket network HAVE_LIBNETWORK)
155 CARES_FUNCTION_IN_LIBRARY (clock_gettime rt HAVE_LIBRT)
158 # Look for necessary includes
159 CHECK_INCLUDE_FILES (sys/types.h HAVE_SYS_TYPES_H)
160 CHECK_INCLUDE_FILES (sys/socket.h HAVE_SYS_SOCKET_H)
161 CHECK_INCLUDE_FILES (sys/sockio.h HAVE_SYS_SOCKIO_H)
162 CHECK_INCLUDE_FILES (arpa/inet.h HAVE_ARPA_INET_H)
163 CHECK_INCLUDE_FILES (arpa/nameser_compat.h HAVE_ARPA_NAMESER_COMPAT_H)
164 CHECK_INCLUDE_FILES (arpa/nameser.h HAVE_ARPA_NAMESER_H)
165 CHECK_INCLUDE_FILES (assert.h HAVE_ASSERT_H)
166 CHECK_INCLUDE_FILES (errno.h HAVE_ERRNO_H)
167 CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H)
168 CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H)
169 CHECK_INCLUDE_FILES (limits.h HAVE_LIMITS_H)
170 CHECK_INCLUDE_FILES (malloc.h HAVE_MALLOC_H)
171 CHECK_INCLUDE_FILES (memory.h HAVE_MEMORY_H)
172 CHECK_INCLUDE_FILES (netdb.h HAVE_NETDB_H)
173 CHECK_INCLUDE_FILES (netinet/in.h HAVE_NETINET_IN_H)
174 CHECK_INCLUDE_FILES (net/if.h HAVE_NET_IF_H)
175 CHECK_INCLUDE_FILES (signal.h HAVE_SIGNAL_H)
176 CHECK_INCLUDE_FILES (socket.h HAVE_SOCKET_H)
177 CHECK_INCLUDE_FILES (stdbool.h HAVE_STDBOOL_H)
178 CHECK_INCLUDE_FILES (stdint.h HAVE_STDINT_H)
179 CHECK_INCLUDE_FILES (stdlib.h HAVE_STDLIB_H)
180 CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H)
181 CHECK_INCLUDE_FILES (string.h HAVE_STRING_H)
182 CHECK_INCLUDE_FILES (stropts.h HAVE_STROPTS_H)
183 CHECK_INCLUDE_FILES (sys/ioctl.h HAVE_SYS_IOCTL_H)
184 CHECK_INCLUDE_FILES (sys/param.h HAVE_SYS_PARAM_H)
185 CHECK_INCLUDE_FILES (sys/select.h HAVE_SYS_SELECT_H)
186 CHECK_INCLUDE_FILES (sys/stat.h HAVE_SYS_STAT_H)
187 CHECK_INCLUDE_FILES (sys/time.h HAVE_SYS_TIME_H)
188 CHECK_INCLUDE_FILES (sys/uio.h HAVE_SYS_UIO_H)
189 CHECK_INCLUDE_FILES (time.h HAVE_TIME_H)
190 CHECK_INCLUDE_FILES (dlfcn.h HAVE_DLFCN_H)
191 CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
193 # On OpenBSD, you must include sys/types.h before netinet/tcp.h
194 IF (HAVE_SYS_TYPES_H)
195 CHECK_INCLUDE_FILES ("sys/types.h;netinet/tcp.h" HAVE_NETINET_TCP_H)
197 CHECK_INCLUDE_FILES (netinet/tcp.h HAVE_NETINET_TCP_H)
200 # Include order matters for these windows files.
201 # As cygwin environment has both socket.h and winsock2.h
202 # headers check WIN32 not to include the later one here
204 CHECK_INCLUDE_FILES ("winsock2.h;windows.h" HAVE_WINSOCK2_H)
205 CHECK_INCLUDE_FILES ("winsock2.h;ws2tcpip.h;windows.h" HAVE_WS2TCPIP_H)
206 CHECK_INCLUDE_FILES ("winsock.h;windows.h" HAVE_WINSOCK_H)
207 CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H)
210 # Set system-specific compiler flags
211 IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
212 LIST (APPEND SYSFLAGS -D_DARWIN_C_SOURCE)
213 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "Linux")
214 LIST (APPEND SYSFLAGS -D_GNU_SOURCE -D_POSIX_C_SOURCE=199309L -D_XOPEN_SOURCE=600)
215 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
216 LIST (APPEND SYSFLAGS -D__EXTENSIONS__ -D_REENTRANT -D_XOPEN_SOURCE=600)
217 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX")
218 LIST (APPEND SYSFLAGS -D_ALL_SOURCE -D_XOPEN_SOURCE=600 -D_USE_IRS)
219 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
220 # Don't define _XOPEN_SOURCE on FreeBSD, it actually reduces visibility instead of increasing it
222 LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_WIN32_WINNT=0x0600)
224 ADD_DEFINITIONS(${SYSFLAGS})
228 # Tell C-Ares about libraries to depend on
230 LIST (APPEND CARES_DEPENDENT_LIBS resolv)
233 LIST (APPEND CARES_DEPENDENT_LIBS nsl)
236 LIST (APPEND CARES_DEPENDENT_LIBS socket)
239 LIST (APPEND CARES_DEPENDENT_LIBS network)
242 LIST (APPEND CARES_DEPENDENT_LIBS rt)
245 LIST (APPEND CARES_DEPENDENT_LIBS ws2_32 advapi32 iphlpapi)
249 # When checking for symbols, we need to make sure we set the proper
250 # headers, libraries, and definitions for the detection to work properly
251 # CMAKE_REQUIRED_DEFINITIONS, CMAKE_REQUIRED_LIBRARIES, and
252 # CMAKE_EXTRA_INCLUDE_FILES. When we're done with the detection, we'll
255 SET (CMAKE_REQUIRED_DEFINITIONS ${SYSFLAGS})
256 LIST (APPEND CMAKE_REQUIRED_LIBRARIES ${CARES_DEPENDENT_LIBS})
258 MACRO (CARES_EXTRAINCLUDE_IFSET var include)
260 LIST (APPEND CMAKE_EXTRA_INCLUDE_FILES ${include})
264 CARES_EXTRAINCLUDE_IFSET (HAVE_STDBOOL_H stdbool.h)
265 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_TYPES_H sys/types.h)
266 CARES_EXTRAINCLUDE_IFSET (HAVE_ARPA_INET_H arpa/inet.h)
267 CARES_EXTRAINCLUDE_IFSET (HAVE_ARPA_NAMESER_H arpa/nameser.h)
268 CARES_EXTRAINCLUDE_IFSET (HAVE_NETDB_H netdb.h)
269 CARES_EXTRAINCLUDE_IFSET (HAVE_NET_IF_H net/if.h)
270 CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_IN_H netinet/in.h)
271 CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_TCP_H netinet/tcp.h)
272 CARES_EXTRAINCLUDE_IFSET (HAVE_SIGNAL_H signal.h)
273 CARES_EXTRAINCLUDE_IFSET (HAVE_STDLIB_H stdlib.h)
274 CARES_EXTRAINCLUDE_IFSET (HAVE_STRING_H string.h)
275 CARES_EXTRAINCLUDE_IFSET (HAVE_STRINGS_H strings.h)
276 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_IOCTL_H sys/ioctl.h)
277 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SELECT_H sys/select.h)
278 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKET_H sys/socket.h)
279 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKIO_H sys/sockio.h)
280 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_TIME_H sys/time.h)
281 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_UIO_H sys/uio.h)
282 CARES_EXTRAINCLUDE_IFSET (HAVE_TIME_H time.h)
283 CARES_EXTRAINCLUDE_IFSET (HAVE_FCNTL_H fcntl.h)
284 CARES_EXTRAINCLUDE_IFSET (HAVE_UNISTD_H unistd.h)
285 CARES_EXTRAINCLUDE_IFSET (HAVE_WINSOCK2_H winsock2.h)
286 CARES_EXTRAINCLUDE_IFSET (HAVE_WS2TCPIP_H ws2tcpip.h)
287 CARES_EXTRAINCLUDE_IFSET (HAVE_WINDOWS_H windows.h)
290 # CHECK_TYPE_SIZE can't be used to see if a type exists because on Apple when
291 # building multi-arch, it will throw an error. So we need to wrap
292 # CHECK_C_SOURCE_COMPILES for our tests.
293 MACRO (CARES_TYPE_EXISTS type var)
294 SET(_CARES_C_SOURCE "
298 FOREACH(_C_HEADER ${CMAKE_EXTRA_INCLUDE_FILES})
299 SET(_CARES_C_SOURCE "${_CARES_C_SOURCE}
300 #include <${_C_HEADER}>")
301 ENDFOREACH(_C_HEADER)
303 SET(_CARES_C_SOURCE "${_CARES_C_SOURCE}
310 CHECK_C_SOURCE_COMPILES ("${_CARES_C_SOURCE}" ${var})
313 CARES_TYPE_EXISTS (socklen_t HAVE_SOCKLEN_T)
314 CARES_TYPE_EXISTS (SOCKET HAVE_TYPE_SOCKET)
315 CARES_TYPE_EXISTS (bool HAVE_BOOL_T)
316 CARES_TYPE_EXISTS (ssize_t HAVE_SSIZE_T)
317 CARES_TYPE_EXISTS ("long long" HAVE_LONGLONG)
318 CARES_TYPE_EXISTS (sig_atomic_t HAVE_SIG_ATOMIC_T)
319 CARES_TYPE_EXISTS ("struct addrinfo" HAVE_STRUCT_ADDRINFO)
320 CARES_TYPE_EXISTS ("struct in6_addr" HAVE_STRUCT_IN6_ADDR)
321 CARES_TYPE_EXISTS ("struct sockaddr_in6" HAVE_STRUCT_SOCKADDR_IN6)
322 CARES_TYPE_EXISTS ("struct sockaddr_storage" HAVE_STRUCT_SOCKADDR_STORAGE)
323 CARES_TYPE_EXISTS ("struct timeval" HAVE_STRUCT_TIMEVAL)
326 # Check for preprocessor defines
327 CHECK_SYMBOL_EXISTS (AF_INET6 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_AF_INET6)
328 CHECK_SYMBOL_EXISTS (O_NONBLOCK "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_O_NONBLOCK)
329 CHECK_SYMBOL_EXISTS (FIONBIO "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_FIONBIO)
330 CHECK_SYMBOL_EXISTS (SIOCGIFADDR "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTL_SIOCGIFADDR)
331 CHECK_SYMBOL_EXISTS (MSG_NOSIGNAL "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_MSG_NOSIGNAL)
332 CHECK_SYMBOL_EXISTS (PF_INET6 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PF_INET6)
333 CHECK_SYMBOL_EXISTS (SO_NONBLOCK "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SO_NONBLOCK)
335 # XCode v8 bug: iOS when targeting less than v10, or MacOS when targeting less than v10.12 will
336 # say clock_gettime exists, it is a weak symbol that only exists in iOS10/MacOS10.12 and will
337 # cause a crash at runtime when running on older versions. Skip finding CLOCK_MONOTONIC on older
339 IF ((NOT APPLE) OR IOS_V10 OR MACOS_V1012)
340 CHECK_SYMBOL_EXISTS (CLOCK_MONOTONIC "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOCK_GETTIME_MONOTONIC)
343 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6" sin6_scope_id "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID LANGUAGE C)
345 # Check for "LL" numeric suffix support
346 CHECK_C_SOURCE_COMPILES ("int main() { int n=1234LL; return 0; }" HAVE_LL)
349 CHECK_SYMBOL_EXISTS (bitncmp "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_BITNCMP)
350 CHECK_SYMBOL_EXISTS (closesocket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOSESOCKET)
351 CHECK_SYMBOL_EXISTS (CloseSocket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOSESOCKET_CAMEL)
352 CHECK_SYMBOL_EXISTS (connect "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CONNECT)
353 CHECK_SYMBOL_EXISTS (fcntl "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_FCNTL)
354 CHECK_SYMBOL_EXISTS (freeaddrinfo "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_FREEADDRINFO)
355 CHECK_SYMBOL_EXISTS (getaddrinfo "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETADDRINFO)
356 CHECK_SYMBOL_EXISTS (getenv "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETENV)
357 CHECK_SYMBOL_EXISTS (gethostbyaddr "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETHOSTBYADDR)
358 CHECK_SYMBOL_EXISTS (gethostbyname "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETHOSTBYNAME)
359 CHECK_SYMBOL_EXISTS (gethostname "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETHOSTNAME)
360 CHECK_SYMBOL_EXISTS (getnameinfo "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETNAMEINFO)
361 CHECK_SYMBOL_EXISTS (getservbyport_r "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETSERVBYPORT_R)
362 CHECK_SYMBOL_EXISTS (getservbyname_r "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETSERVBYNAME_R)
363 CHECK_SYMBOL_EXISTS (gettimeofday "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETTIMEOFDAY)
364 CHECK_SYMBOL_EXISTS (if_indextoname "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IF_INDEXTONAME)
365 CHECK_SYMBOL_EXISTS (inet_net_pton "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_INET_NET_PTON)
367 # Disabled on Windows, because these functions are only really supported on Windows
368 # Vista or newer (_WIN32_WINNT >= 0x0600). Older versions of Windows may provide
369 # them as experimental non-working features, so we have to disable them manually.
370 CHECK_SYMBOL_EXISTS (inet_ntop "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_INET_NTOP)
371 CHECK_SYMBOL_EXISTS (inet_pton "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_INET_PTON)
373 CHECK_SYMBOL_EXISTS (ioctl "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTL)
374 CHECK_SYMBOL_EXISTS (ioctlsocket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTLSOCKET)
375 CHECK_SYMBOL_EXISTS (IoctlSocket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTLSOCKET_CAMEL)
376 CHECK_SYMBOL_EXISTS (recv "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_RECV)
377 CHECK_SYMBOL_EXISTS (recvfrom "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_RECVFROM)
378 CHECK_SYMBOL_EXISTS (send "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SEND)
379 CHECK_SYMBOL_EXISTS (setsockopt "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SETSOCKOPT)
380 CHECK_SYMBOL_EXISTS (socket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKET)
381 CHECK_SYMBOL_EXISTS (strcasecmp "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRCASECMP)
382 CHECK_SYMBOL_EXISTS (strcmpi "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRCMPI)
383 CHECK_SYMBOL_EXISTS (strdup "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRDUP)
384 CHECK_SYMBOL_EXISTS (stricmp "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRICMP)
385 CHECK_SYMBOL_EXISTS (strncasecmp "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNCASECMP)
386 CHECK_SYMBOL_EXISTS (strncmpi "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNCMPI)
387 CHECK_SYMBOL_EXISTS (strnicmp "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNICMP)
388 CHECK_SYMBOL_EXISTS (writev "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_WRITEV)
390 # On Android, the system headers may define __system_property_get(), but excluded
391 # from libc. We need to perform a link test instead of a header/symbol test.
392 CHECK_FUNCTION_EXISTS (__system_property_get HAVE___SYSTEM_PROPERTY_GET)
394 # Unset temporary data
395 SET (CMAKE_EXTRA_INCLUDE_FILES)
396 SET (CMAKE_REQUIRED_DEFINITIONS)
397 SET (CMAKE_REQUIRED_LIBRARIES)
400 find_file(CARES_RANDOM_FILE urandom /dev)
401 mark_as_advanced(CARES_RANDOM_FILE)
404 ################################################################################
405 # recv, recvfrom, send, getnameinfo, gethostname
406 # ARGUMENTS AND RETURN VALUES
408 # The AutoTools build tries to be really thorough here. So much so that it
409 # takes forever. We really don't want to do that. Lets make some educated
410 # guesses based on datatypes we have available, and for others, use some 'sane'
411 # defaults. This should be much quicker and nearly as accurate ... and even
412 # if not, it probably won't matter in the least.
414 IF (HAVE_SSIZE_T AND HAVE_SOCKLEN_T)
415 # If we have ssize_t and socklen_t, the API is usually sane and uses ssize_t and size_t for lengths
416 SET (RECVFROM_TYPE_RETV ssize_t)
417 SET (RECVFROM_TYPE_ARG3 size_t)
419 SET (RECVFROM_TYPE_RETV int)
420 SET (RECVFROM_TYPE_ARG3 int)
423 IF (HAVE_TYPE_SOCKET)
424 # If the SOCKET type is defined, it uses socket ... should be windows only
425 SET (RECVFROM_TYPE_ARG1 SOCKET)
427 SET (RECVFROM_TYPE_ARG1 int)
431 # If we have socklen_t the APIs pretty much always actually use it
432 SET (RECVFROM_TYPE_ARG6 "socklen_t *")
433 SET (GETNAMEINFO_TYPE_ARG2 socklen_t)
434 SET (GETNAMEINFO_TYPE_ARG46 socklen_t)
436 SET (RECVFROM_TYPE_ARG6 "int *")
437 SET (GETNAMEINFO_TYPE_ARG2 int)
438 SET (GETNAMEINFO_TYPE_ARG46 int)
442 SET (RECV_TYPE_ARG2 "char *")
444 SET (RECV_TYPE_ARG2 "void *")
447 # Functions are typically consistent so the equivalent fields map ... equivalently
448 SET (RECV_TYPE_RETV ${RECVFROM_TYPE_RETV})
449 SET (SEND_TYPE_RETV ${RECVFROM_TYPE_RETV})
450 SET (RECV_TYPE_ARG1 ${RECVFROM_TYPE_ARG1})
451 SET (RECVFROM_TYPE_ARG2 ${RECV_TYPE_ARG2})
452 SET (SEND_TYPE_ARG1 ${RECVFROM_TYPE_ARG1})
453 SET (RECV_TYPE_ARG3 ${RECVFROM_TYPE_ARG3})
454 SET (SEND_TYPE_ARG3 ${RECVFROM_TYPE_ARG3})
455 SET (GETHOSTNAME_TYPE_ARG2 ${RECVFROM_TYPE_ARG3})
457 # These should always be "sane" values to use always
458 SET (RECVFROM_QUAL_ARG5 )
459 SET (RECVFROM_TYPE_ARG4 int)
460 SET (RECVFROM_TYPE_ARG5 "struct sockaddr *")
461 SET (RECV_TYPE_ARG4 int)
462 SET (GETNAMEINFO_TYPE_ARG1 "struct sockaddr *")
463 SET (GETNAMEINFO_TYPE_ARG7 int)
464 SET (SEND_TYPE_ARG2 "void *")
465 SET (SEND_TYPE_ARG4 int)
466 ################################################################################
470 # HAVE_SIG_ATOMIC_T_VOLATILE ??
473 # Set a few variables by hand that C-Ares wants, logically, based on detection
477 Set (CARES_TYPEOF_ARES_SOCKLEN_T "socklen_t")
479 Set (CARES_TYPEOF_ARES_SOCKLEN_T "int")
483 Set (CARES_TYPEOF_ARES_SSIZE_T "ssize_t")
486 IF ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
487 Set (CARES_TYPEOF_ARES_SSIZE_T "__int64")
489 Set (CARES_TYPEOF_ARES_SSIZE_T "int")
492 Set (CARES_TYPEOF_ARES_SSIZE_T "long")
496 IF (HAVE_FCNTL AND HAVE_O_NONBLOCK)
497 SET (HAVE_FCNTL_O_NONBLOCK 1)
500 IF (HAVE_IOCTL AND HAVE_FIONBIO)
501 SET (HAVE_IOCTL_FIONBIO 1)
504 IF (HAVE_IOCTLSOCKET AND HAVE_FIONBIO)
505 SET (HAVE_IOCTLSOCKET_FIONBIO 1)
508 IF (HAVE_IOCTLSOCKET_CAMEL AND HAVE_FIONBIO)
509 SET (HAVE_IOCTLSOCKET_CAMEL_FIONBIO 1)
512 IF (HAVE_GETADDRINFO)
513 IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR
514 CMAKE_SYSTEM_NAME STREQUAL "HPUX" OR
515 CMAKE_SYSTEM_NAME STREQUAL "NetBSD" OR
516 CMAKE_SYSTEM_NAME STREQUAL "SunOS" OR
517 CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR
518 CMAKE_SYSTEM_NAME STREQUAL "AIX" OR
520 SET (HAVE_GETADDRINFO_THREADSAFE 1)
524 IF (HAVE_TIME_H AND HAVE_SYS_TIME_H)
525 SET (TIME_WITH_SYS_TIME 1)
528 IF (HAVE_GETSERVBYPORT_R)
529 # TODO : Should probably autodetect
530 IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
531 SET (GETSERVBYPORT_R_ARGS 5)
532 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX" OR
533 CMAKE_SYSTEM_NAME STREQUAL "OpenBSD" OR
535 SET (GETSERVBYPORT_R_ARGS 4)
538 SET (GETSERVBYPORT_R_ARGS 6)
542 IF (HAVE_GETSERVBYNAME_R)
543 # TODO : Should probably autodetect
544 IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
545 SET (GETSERVBYNAME_R_ARGS 5)
546 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX" OR
547 CMAKE_SYSTEM_NAME STREQUAL "OpenBSD" OR
549 SET (GETSERVBYNAME_R_ARGS 4)
552 SET (GETSERVBYNAME_R_ARGS 6)
556 # Set some aliases used for ares_build.h
557 IF (HAVE_SYS_TYPES_H)
558 SET (CARES_HAVE_SYS_TYPES_H 1)
560 IF (HAVE_SYS_SOCKET_H)
561 SET (CARES_HAVE_SYS_SOCKET_H 1)
564 SET (CARES_HAVE_WS2TCPIP_H 1)
567 SET (CARES_HAVE_WINSOCK2_H 1)
570 SET (CARES_HAVE_WINDOWS_H 1)
572 IF (HAVE_ARPA_NAMESER_H)
573 SET (CARES_HAVE_ARPA_NAMESER_H 1)
575 IF (HAVE_ARPA_NAMESER_COMPAT_H)
576 SET (CARES_HAVE_ARPA_NAMESER_COMPAT_H 1)
579 # Record toplevel CMakeLists.txt path
580 set(CARES_TOPLEVEL_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
583 # TRANSFORM_MAKEFILE_INC
585 # This function consumes the "Makefile.inc" autotools file, and converts it into
586 # "Makefile.inc.cmake", a cmake include file; transforming this:
588 # CSOURCES = ares__close_sockets.c \
589 # ares__get_hostent.c \
590 # ares__read_line.c \
596 # ares__close_sockets.c
597 # ares__get_hostent.c
600 function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
601 file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT)
602 string(REPLACE "$(top_srcdir)" "\${PROJECT_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
603 string(REPLACE "$(top_builddir)" "\${PROJECT_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
605 string(REGEX REPLACE "\\\\\n" "ß!ß" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
606 string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
607 string(REPLACE "ß!ß" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
609 string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace $() with ${}
610 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.
611 file(WRITE ${OUTPUT_FILE} ${MAKEFILE_INC_TEXT})
614 # Directory for includes
615 ADD_SUBDIRECTORY (include)
617 # Directory for lib and tools
618 ADD_SUBDIRECTORY (src)
621 ADD_SUBDIRECTORY (docs)
624 IF (CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS)
626 ADD_SUBDIRECTORY (test)
632 SET (CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
633 INCLUDE (CMakePackageConfigHelpers)
634 CONFIGURE_PACKAGE_CONFIG_FILE (${PROJECT_NAME}-config.cmake.in ${PROJECT_NAME}-config.cmake
635 INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}
636 PATH_VARS CMAKE_INSTALL_INCLUDEDIR
637 NO_CHECK_REQUIRED_COMPONENTS_MACRO
640 WRITE_BASIC_PACKAGE_VERSION_FILE(${PROJECT_NAME}-config-version.cmake VERSION "${CARES_VERSION}" COMPATIBILITY SameMajorVersion)
641 INSTALL (EXPORT ${PROJECT_NAME}-targets COMPONENT Devel DESTINATION ${CMAKECONFIG_INSTALL_DIR} NAMESPACE ${PROJECT_NAME}::)
642 INSTALL (FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" COMPONENT Devel DESTINATION ${CMAKECONFIG_INSTALL_DIR})
645 IF (NOT CARES_SHARED)
646 SET (CPPFLAG_CARES_STATICLIB "-DCARES_STATICLIB")
647 FOREACH (LIB ${CARES_DEPENDENT_LIBS})
648 SET (CARES_PRIVATE_LIBS "${CARES_PRIVATE_LIBS} -l${LIB}")
651 CONFIGURE_FILE("libcares.pc.cmake" "libcares.pc" @ONLY)
652 INSTALL (FILES "${CMAKE_CURRENT_BINARY_DIR}/libcares.pc" COMPONENT Devel DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
656 # Legacy chain-building variables (provided for compatibility with old code).
657 # Don't use these, external code should be updated to refer to the aliases directly (e.g., Cares::cares).
658 SET (CARES_FOUND 1 CACHE INTERNAL "CARES LIBRARY FOUND")
659 SET (CARES_LIBRARIES ${PROJECT_NAME}::cares CACHE INTERNAL "CARES LIBRARIES")
664 set( CPACK_PACKAGE_NAME ${PROJECT_NAME} )
665 set( CPACK_PACKAGE_VENDOR "Daniel Stenberg" ) # Github project owner
666 set( CPACK_PACKAGE_DESCRIPTION_SUMMARY "A C library for asynchronous DNS requests" )
667 set( CPACK_PACKAGE_HOMEPAGE_URL "https://c-ares.org/" )
668 set( CPACK_PACKAGE_CONTACT "https://c-ares.org/" )
669 set( CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR} )
670 set( CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR} )
671 set( CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH} )
672 set( CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH} )
673 set( CPACK_PACKAGE_INSTALL_DIRECTORY ${PROJECT_NAME} )
674 set( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md" )
675 set( CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md" )
677 set( CPACK_COMPONENT_Library_DISPLAY_NAME "c-ares Library" )
678 set( CPACK_COMPONENT_Library_DESCRIPTION "The c-ares binary library." )
679 set( CPACK_COMPONENT_Library_REQUIRED 1 )
680 set( CPACK_COMPONENT_Devel_DISPLAY_NAME "c-ares Development Files" )
681 set( CPACK_COMPONENT_Devel_DESCRIPTION "Development files for compiling against c-ares." )
682 set( CPACK_COMPONENT_Devel_REQUIRED 0 )
683 IF (CARES_BUILD_TOOLS)
684 set( CPACK_COMPONENT_Tools_DISPLAY_NAME "c-ares Tools" )
685 set( CPACK_COMPONENT_Tools_DESCRIPTION "Tools for using c-ares." )
686 set( CPACK_COMPONENT_Tools_REQUIRED 0 )
689 if( ${CMAKE_SYSTEM_NAME} STREQUAL "Linux" )
691 if ( "${CPACK_PACKAGE_ARCHITECTURE}" STREQUAL "" )
692 # Note: the architecture should default to the local architecture, but it
693 # in fact comes up empty. We call `uname -m` to ask the kernel instead.
694 EXECUTE_PROCESS( COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE )
697 set( CPACK_INCLUDE_TOPLEVEL_DIRECTORY 1 )
698 set( CPACK_PACKAGE_RELEASE 1 )
701 # RPM - https://cmake.org/cmake/help/latest/cpack_gen/rpm.html
702 set( CPACK_RPM_PACKAGE_RELEASE ${CPACK_PACKAGE_RELEASE} )
703 set( CPACK_RPM_PACKAGE_ARCHITECTURE ${CPACK_PACKAGE_ARCHITECTURE} )
704 set( CPACK_RPM_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION_SUMMARY} )
705 set( CPACK_RPM_PACKAGE_URL ${CPACK_PACKAGE_HOMEPAGE_URL} )
706 set( CPACK_RPM_PACKAGE_LICENSE "MIT" )
707 set( CPACK_RPM_COMPONENT_INSTALL 1 )
708 set( CPACK_RPM_COMPRESSION_TYPE "xz" )
709 set( CPACK_RPM_PACKAGE_AUTOPROV 1 )
711 set( CPACK_RPM_Library_PACKAGE_SUMMARY ${CPACK_COMPONENT_Library_DESCRIPTION} )
712 set( CPACK_RPM_Library_PACKAGE_ARCHITECTURE ${CPACK_RPM_PACKAGE_ARCHITECTURE} )
713 set( CPACK_RPM_Library_PACKAGE_NAME "libcares${CARES_LIB_VERSION_MAJOR}" )
714 set( CPACK_RPM_Library_FILE_NAME "RPM-DEFAULT" )
716 set( CPACK_RPM_Devel_PACKAGE_REQUIRES "cmake >= ${CMAKE_MINIMUM_REQUIRED_VERSION}, ${CPACK_RPM_Library_PACKAGE_NAME} >= ${CPACK_PACKAGE_VERSION}" )
717 set( CPACK_RPM_Devel_PACKAGE_SUMMARY ${CPACK_COMPONENT_Devel_DESCRIPTION} )
718 set( CPACK_RPM_Devel_PACKAGE_ARCHITECTURE ${CPACK_RPM_PACKAGE_ARCHITECTURE} )
719 set( CPACK_RPM_Devel_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-devel" )
720 set( CPACK_RPM_Devel_FILE_NAME "RPM-DEFAULT" )
722 IF (CARES_BUILD_TOOLS)
723 set( CPACK_RPM_Tools_PACKAGE_REQUIRES "${CPACK_RPM_Library_PACKAGE_NAME} >= ${CPACK_PACKAGE_VERSION}" )
724 set( CPACK_RPM_Tools_PACKAGE_SUMMARY ${CPACK_COMPONENT_Tools_DESCRIPTION} )
725 set( CPACK_RPM_Tools_PACKAGE_ARCHITECTURE ${CPACK_RPM_PACKAGE_ARCHITECTURE} )
726 set( CPACK_RPM_Tools_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-tools" )
727 set( CPACK_RPM_Tools_FILE_NAME "RPM-DEFAULT" )
731 # DEB - https://cmake.org/cmake/help/latest/cpack_gen/deb.html
732 set( CPACK_DEBIAN_PACKAGE_RELEASE ${CPACK_PACKAGE_RELEASE} )
733 set( CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CPACK_PACKAGE_HOMEPAGE_URL} )
734 set( CPACK_DEB_COMPONENT_INSTALL 1 )
735 set( CPACK_DEBIAN_COMPRESSION_TYPE "xz")
736 set( CPACK_DEBIAN_PACKAGE_SHLIBDEPS 1 )
738 if ( ${CPACK_PACKAGE_ARCHITECTURE} STREQUAL "x86_64" )
739 set( CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64" ) # DEB doesn't always use the kernel's arch name
741 set( CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${CPACK_PACKAGE_ARCHITECTURE} )
744 set( CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT" ) # Use default naming scheme
746 set( CPACK_DEBIAN_LIBRARY_PACKAGE_NAME ${CPACK_RPM_Library_PACKAGE_NAME} )
748 set( CPACK_DEBIAN_DEVEL_PACKAGE_DEPENDS "cmake (>= ${CMAKE_MINIMUM_REQUIRED_VERSION}), ${CPACK_DEBIAN_LIBRARY_PACKAGE_NAME} (>= ${CPACK_PACKAGE_VERSION})" )
749 set( CPACK_DEBIAN_DEVEL_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-dev" )
751 IF (CARES_BUILD_TOOLS)
752 set( CPACK_DEBIAN_TOOLS_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-tools" )
753 set( CPACK_DEBIAN_TOOLS_PACKAGE_SHLIBDEPS OFF ) # dpkg-shlibdeps can't find the libs we built
754 set( CPACK_DEBIAN_TOOLS_PACKAGE_DEPENDS "${CPACK_DEBIAN_LIBRARY_PACKAGE_NAME} (>= ${CPACK_PACKAGE_VERSION})" )
757 elseif( ${CMAKE_HOST_WIN32} )
758 set( CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON )
759 set( CPACK_NSIS_DISPLAY_NAME ${PROJECT_NAME} )
760 set( CPACK_NSIS_PACKAGE_NAME ${PROJECT_NAME} )
761 set( CPACK_NSIS_URL_INFO_ABOUT ${CPACK_PACKAGE_HOMEPAGE_URL} )
764 # This must always be last!