quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

CMakeLists.txt (38460B)


      1 # Copyright (C) The c-ares project and its contributors
      2 # SPDX-License-Identifier: MIT
      3 CMAKE_MINIMUM_REQUIRED (VERSION 3.5.0...3.10.0)
      4 
      5 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
      6 
      7 INCLUDE (CheckIncludeFiles)
      8 INCLUDE (CheckTypeSize)
      9 INCLUDE (CheckFunctionExists)
     10 INCLUDE (CheckSymbolExists)
     11 INCLUDE (CheckCSourceCompiles)
     12 INCLUDE (CheckStructHasMember)
     13 INCLUDE (CheckLibraryExists)
     14 
     15 PROJECT (c-ares LANGUAGES C VERSION "1.34.5" )
     16 
     17 # Set this version before release
     18 SET (CARES_VERSION "${PROJECT_VERSION}")
     19 
     20 INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are wrong.
     21 
     22 # This is for libtool compatibility, and specified in a form that is easily
     23 # translatable from libtool (even if the actual form doesn't make sense).
     24 # For instance, in an autotools project, in Makefile.am there is a line that
     25 # contains something like:
     26 #     -version-info 4:0:2
     27 # This breaks down into sections of current:revision:age
     28 # This then generates a version of  "(current-age).age.revision"  with an
     29 # interface version of "(current-age)"
     30 # For example, a version of 4:0:2 would generate output such as:
     31 #    libname.so   -> libname.so.2
     32 #    libname.so.2 -> libname.so.2.2.0
     33 SET (CARES_LIB_VERSIONINFO "21:4:19")
     34 
     35 
     36 OPTION (CARES_STATIC        "Build as a static library"                                             OFF)
     37 OPTION (CARES_SHARED        "Build as a shared library"                                             ON)
     38 OPTION (CARES_INSTALL       "Create installation targets (chain builders may want to disable this)" ON)
     39 OPTION (CARES_STATIC_PIC    "Build the static library as PIC (position independent)"                OFF)
     40 OPTION (CARES_BUILD_TESTS   "Build and run tests"                                                   OFF)
     41 OPTION (CARES_BUILD_CONTAINER_TESTS "Build and run container tests (implies CARES_BUILD_TESTS, Linux only)" OFF)
     42 OPTION (CARES_BUILD_TOOLS   "Build tools"                                                           ON)
     43 OPTION (CARES_SYMBOL_HIDING "Hide private symbols in shared libraries"                              OFF)
     44 OPTION (CARES_THREADS       "Build with thread-safety support"                                      ON)
     45 OPTION (CARES_COVERAGE      "Build for code coverage"                                               OFF)
     46 SET    (CARES_RANDOM_FILE "/dev/urandom" CACHE STRING "Suitable File / Device Path for entropy, such as /dev/urandom")
     47 SET    (CARES_C_STANDARD 90 CACHE STRING "C language standard used to build c-ares")
     48 
     49 
     50 # Tests require a C++14 compiler
     51 IF (CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS)
     52 	set(CMAKE_CXX_STANDARD 14)
     53 	set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
     54 	set(CMAKE_CXX_EXTENSIONS FALSE)
     55 	enable_language(CXX)
     56 ENDIF ()
     57 
     58 # Tests require static to be enabled on Windows to be able to access otherwise hidden symbols
     59 IF ((CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS) AND (NOT CARES_STATIC) AND WIN32)
     60 	SET (CARES_STATIC ON)
     61 	SET (CARES_STATIC_PIC ON)
     62 	MESSAGE (WARNING "Static building was requested be disabled, but re-enabled to support tests")
     63 ENDIF ()
     64 
     65 INCLUDE (EnableWarnings)
     66 
     67 IF (MSVC)
     68 	# allow linking against the static runtime library in msvc
     69 	OPTION (CARES_MSVC_STATIC_RUNTIME "Link against the static runtime library" OFF)
     70 	IF (CARES_MSVC_STATIC_RUNTIME)
     71 		# CMAKE_CONFIGURATION_TYPES is empty on non-IDE generators (Ninja, NMake)
     72 		# and that's why we also use CMAKE_BUILD_TYPE to cover for those generators.
     73 		# For IDE generators, CMAKE_BUILD_TYPE is usually empty
     74 		FOREACH (config_type ${CMAKE_CONFIGURATION_TYPES} ${CMAKE_BUILD_TYPE})
     75 			STRING (TOUPPER ${config_type} upper_config_type)
     76 			SET (flag_var "CMAKE_C_FLAGS_${upper_config_type}")
     77 			IF (${flag_var} MATCHES "/MD")
     78 				STRING (REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
     79 			ENDIF ()
     80 		ENDFOREACH ()
     81 
     82 		# clean up
     83 		SET (upper_config_type)
     84 		SET (config_type)
     85 		SET (flag_var)
     86 	ENDIF ()
     87 ENDIF ()
     88 
     89 IF (CARES_SYMBOL_HIDING)
     90 	IF (CMAKE_VERSION VERSION_LESS 3.12)
     91 		MESSAGE (FATAL_ERROR "Hiding symbols requires CMake 3.12")
     92 	ENDIF ()
     93 	CMAKE_POLICY (SET CMP0063 NEW)
     94 ENDIF ()
     95 
     96 # Keep build organized, but only if it is the top-level project.
     97 # CMake 3.21 or later has PROJECT_IS_TOP_LEVEL, but we aren't yet depending on
     98 # that version.
     99 IF (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
    100 	SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}")
    101 	SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
    102 	SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
    103 	SET (CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
    104 ENDIF ()
    105 
    106 # Destinations for installing different kinds of targets (pass to install command).
    107 SET (TARGETS_INST_DEST
    108 	RUNTIME DESTINATION  ${CMAKE_INSTALL_BINDIR}
    109 	BUNDLE DESTINATION   ${CMAKE_INSTALL_BINDIR}
    110 	LIBRARY DESTINATION  ${CMAKE_INSTALL_LIBDIR}
    111 	ARCHIVE DESTINATION  ${CMAKE_INSTALL_LIBDIR}
    112 )
    113 
    114 # Function in Library
    115 # CHECK_LIBRARY_EXISTS can't be used as it will return true if the function
    116 # is found in a different required/dependent library.
    117 MACRO (CARES_FUNCTION_IN_LIBRARY func lib var)
    118 	SET (_ORIG_FIL_CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
    119 	SET (CMAKE_REQUIRED_LIBRARIES )
    120 	CHECK_FUNCTION_EXISTS ("${func}" "_CARES_FUNC_IN_LIB_GLOBAL_${func}")
    121 	SET (CMAKE_REQUIRED_LIBRARIES "${_ORIG_FIL_CMAKE_REQUIRED_LIBRARIES}")
    122 
    123 	IF ("${_CARES_FUNC_IN_LIB_GLOBAL_${func}}")
    124 		SET (${var} FALSE)
    125 	ELSE ()
    126 		CHECK_LIBRARY_EXISTS ("${lib}" "${func}" "" ${var})
    127 	ENDIF ()
    128 ENDMACRO ()
    129 
    130 # Look for dependent/required libraries
    131 CARES_FUNCTION_IN_LIBRARY (res_servicename resolv HAVE_RES_SERVICENAME_IN_LIBRESOLV)
    132 IF (HAVE_RES_SERVICENAME_IN_LIBRESOLV)
    133 	SET (HAVE_LIBRESOLV 1)
    134 ENDIF ()
    135 
    136 IF (APPLE)
    137 	CHECK_C_SOURCE_COMPILES ("
    138 	#include <stdio.h>
    139 	#include <TargetConditionals.h>
    140 	int main() {
    141 #if TARGET_OS_IPHONE == 0
    142 #error Not an iPhone target
    143 #endif
    144 return 0;
    145 	}
    146 	"
    147 	IOS)
    148 
    149 	CHECK_C_SOURCE_COMPILES ("
    150 #include <stdio.h>
    151 #include <TargetConditionals.h>
    152 	int main() {
    153 #if TARGET_OS_IPHONE == 0 || __IPHONE_OS_VERSION_MIN_REQUIRED < 100000
    154 #  error Not iOS v10
    155 #endif
    156 return 0;
    157 	}
    158 	"
    159 	IOS_V10)
    160 
    161 	CHECK_C_SOURCE_COMPILES ("
    162 #include <stdio.h>
    163 #include <AvailabilityMacros.h>
    164 #ifndef MAC_OS_X_VERSION_10_12
    165 #  define MAC_OS_X_VERSION_10_12 101200
    166 #endif
    167 	int main() {
    168 #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
    169 #  error Not MacOSX 10.12 or higher
    170 #endif
    171 return 0;
    172 	}
    173 	"
    174 	MACOS_V1012)
    175 ENDIF ()
    176 
    177 IF (ZOS AND HAVE_LIBRESOLV)
    178 	SET (CARES_USE_LIBRESOLV 1)
    179 ENDIF()
    180 
    181 
    182 CARES_FUNCTION_IN_LIBRARY (gethostbyname nsl HAVE_LIBNSL)
    183 CARES_FUNCTION_IN_LIBRARY (gethostbyname socket HAVE_GHBN_LIBSOCKET)
    184 CARES_FUNCTION_IN_LIBRARY (gethostbyname network HAVE_LIBNETWORK)
    185 CARES_FUNCTION_IN_LIBRARY (socket socket HAVE_SOCKET_LIBSOCKET)
    186 IF (HAVE_GHBN_LIBSOCKET OR HAVE_SOCKET_LIBSOCKET)
    187 	SET(HAVE_LIBSOCKET TRUE)
    188 ENDIF ()
    189 CARES_FUNCTION_IN_LIBRARY (socket network HAVE_LIBNETWORK)
    190 CARES_FUNCTION_IN_LIBRARY (clock_gettime rt HAVE_LIBRT)
    191 
    192 
    193 # Look for necessary includes
    194 CHECK_INCLUDE_FILES (AvailabilityMacros.h  HAVE_AVAILABILITYMACROS_H)
    195 CHECK_INCLUDE_FILES (sys/types.h           HAVE_SYS_TYPES_H)
    196 CHECK_INCLUDE_FILES (sys/random.h          HAVE_SYS_RANDOM_H)
    197 CHECK_INCLUDE_FILES (sys/socket.h          HAVE_SYS_SOCKET_H)
    198 CHECK_INCLUDE_FILES (sys/sockio.h          HAVE_SYS_SOCKIO_H)
    199 CHECK_INCLUDE_FILES (arpa/inet.h           HAVE_ARPA_INET_H)
    200 CHECK_INCLUDE_FILES (arpa/nameser_compat.h HAVE_ARPA_NAMESER_COMPAT_H)
    201 CHECK_INCLUDE_FILES (arpa/nameser.h        HAVE_ARPA_NAMESER_H)
    202 CHECK_INCLUDE_FILES (assert.h              HAVE_ASSERT_H)
    203 CHECK_INCLUDE_FILES (errno.h               HAVE_ERRNO_H)
    204 CHECK_INCLUDE_FILES (fcntl.h               HAVE_FCNTL_H)
    205 CHECK_INCLUDE_FILES (inttypes.h            HAVE_INTTYPES_H)
    206 CHECK_INCLUDE_FILES (limits.h              HAVE_LIMITS_H)
    207 CHECK_INCLUDE_FILES (malloc.h              HAVE_MALLOC_H)
    208 CHECK_INCLUDE_FILES (memory.h              HAVE_MEMORY_H)
    209 CHECK_INCLUDE_FILES (netdb.h               HAVE_NETDB_H)
    210 CHECK_INCLUDE_FILES (netinet/in.h          HAVE_NETINET_IN_H)
    211 CHECK_INCLUDE_FILES (netinet6/in6.h        HAVE_NETINET6_IN6_H)
    212 # On old MacOS SDK versions, you must include sys/socket.h before net/if.h
    213 IF (HAVE_SYS_SOCKET_H)
    214   CHECK_INCLUDE_FILES ("sys/socket.h;net/if.h"  HAVE_NET_IF_H)
    215 ELSE ()
    216   CHECK_INCLUDE_FILES (net/if.h                 HAVE_NET_IF_H)
    217 ENDIF ()
    218 CHECK_INCLUDE_FILES (signal.h              HAVE_SIGNAL_H)
    219 CHECK_INCLUDE_FILES (socket.h              HAVE_SOCKET_H)
    220 CHECK_INCLUDE_FILES (stdbool.h             HAVE_STDBOOL_H)
    221 CHECK_INCLUDE_FILES (stdint.h              HAVE_STDINT_H)
    222 CHECK_INCLUDE_FILES (stdlib.h              HAVE_STDLIB_H)
    223 CHECK_INCLUDE_FILES (strings.h             HAVE_STRINGS_H)
    224 CHECK_INCLUDE_FILES (string.h              HAVE_STRING_H)
    225 CHECK_INCLUDE_FILES (stropts.h             HAVE_STROPTS_H)
    226 CHECK_INCLUDE_FILES (sys/ioctl.h           HAVE_SYS_IOCTL_H)
    227 CHECK_INCLUDE_FILES (sys/param.h           HAVE_SYS_PARAM_H)
    228 CHECK_INCLUDE_FILES (sys/select.h          HAVE_SYS_SELECT_H)
    229 CHECK_INCLUDE_FILES (sys/stat.h            HAVE_SYS_STAT_H)
    230 CHECK_INCLUDE_FILES (sys/time.h            HAVE_SYS_TIME_H)
    231 CHECK_INCLUDE_FILES (sys/uio.h             HAVE_SYS_UIO_H)
    232 CHECK_INCLUDE_FILES (sys/event.h           HAVE_SYS_EVENT_H)
    233 CHECK_INCLUDE_FILES (sys/epoll.h           HAVE_SYS_EPOLL_H)
    234 CHECK_INCLUDE_FILES (ifaddrs.h             HAVE_IFADDRS_H)
    235 CHECK_INCLUDE_FILES (time.h                HAVE_TIME_H)
    236 CHECK_INCLUDE_FILES (poll.h                HAVE_POLL_H)
    237 CHECK_INCLUDE_FILES (dlfcn.h               HAVE_DLFCN_H)
    238 CHECK_INCLUDE_FILES (unistd.h              HAVE_UNISTD_H)
    239 # On OpenBSD, you must include sys/types.h before netinet/tcp.h
    240 IF (HAVE_SYS_TYPES_H)
    241   CHECK_INCLUDE_FILES ("sys/types.h;netinet/tcp.h"         HAVE_NETINET_TCP_H)
    242 ELSE ()
    243   CHECK_INCLUDE_FILES (netinet/tcp.h                       HAVE_NETINET_TCP_H)
    244 ENDIF ()
    245 
    246 # Include order matters for these windows files.
    247 # As cygwin environment has both socket.h and winsock2.h
    248 # headers check WIN32 not to include the later one here
    249 IF (WIN32)
    250 CHECK_INCLUDE_FILES ("winsock2.h;windows.h"            HAVE_WINSOCK2_H)
    251 CHECK_INCLUDE_FILES ("winsock2.h;ws2tcpip.h;windows.h" HAVE_WS2TCPIP_H)
    252 CHECK_INCLUDE_FILES ("winsock2.h;iphlpapi.h;windows.h" HAVE_IPHLPAPI_H)
    253 CHECK_INCLUDE_FILES ("winsock2.h;netioapi.h;windows.h" HAVE_NETIOAPI_H)
    254 CHECK_INCLUDE_FILES ("winsock2.h;mswsock.h;windows.h"  HAVE_MSWSOCK_H)
    255 CHECK_INCLUDE_FILES ("winsock.h;windows.h"             HAVE_WINSOCK_H)
    256 CHECK_INCLUDE_FILES (windows.h                         HAVE_WINDOWS_H)
    257 CHECK_INCLUDE_FILES ("windows.h;winternl.h"            HAVE_WINTERNL_H)
    258 CHECK_INCLUDE_FILES ("windows.h;ntdef.h"               HAVE_NTDEF_H)
    259 CHECK_INCLUDE_FILES ("windows.h;ntdef.h;ntstatus.h"    HAVE_NTSTATUS_H)
    260 
    261 
    262 ENDIF ()
    263 
    264 # Set system-specific compiler flags
    265 IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
    266 	LIST (APPEND SYSFLAGS -D_DARWIN_C_SOURCE)
    267 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android")
    268 	LIST (APPEND SYSFLAGS -D_GNU_SOURCE -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700)
    269 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
    270 	LIST (APPEND SYSFLAGS -D__EXTENSIONS__ -D_REENTRANT -D_XOPEN_SOURCE=600)
    271 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX")
    272 	LIST (APPEND SYSFLAGS -D_ALL_SOURCE -D_XOPEN_SOURCE=700 -D_USE_IRS)
    273 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
    274 	# Don't define _XOPEN_SOURCE on FreeBSD, it actually reduces visibility instead of increasing it
    275 ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "QNX")
    276 	LIST (APPEND SYSFLAGS -D_QNX_SOURCE)
    277 ELSEIF (WIN32)
    278 	LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
    279 	IF (NOT CMAKE_C_FLAGS MATCHES ".*-D_WIN32_WINNT=.*")
    280 		LIST (APPEND SYSFLAGS -D_WIN32_WINNT=0x0602)
    281 	ENDIF ()
    282 ENDIF ()
    283 ADD_DEFINITIONS(${SYSFLAGS})
    284 
    285 
    286 # Tell C-Ares about libraries to depend on
    287 IF (HAVE_LIBRESOLV)
    288 	LIST (APPEND CARES_DEPENDENT_LIBS resolv)
    289 ENDIF ()
    290 IF (HAVE_LIBNSL)
    291 	LIST (APPEND CARES_DEPENDENT_LIBS nsl)
    292 ENDIF ()
    293 IF (HAVE_LIBSOCKET)
    294 	LIST (APPEND CARES_DEPENDENT_LIBS socket)
    295 ENDIF ()
    296 IF (HAVE_LIBNETWORK)
    297 	LIST (APPEND CARES_DEPENDENT_LIBS network)
    298 ENDIF ()
    299 IF (HAVE_LIBRT)
    300 	LIST (APPEND CARES_DEPENDENT_LIBS rt)
    301 ENDIF ()
    302 IF (WIN32)
    303 	LIST (APPEND CARES_DEPENDENT_LIBS ws2_32 advapi32 iphlpapi)
    304 ENDIF ()
    305 
    306 
    307 # When checking for symbols, we need to make sure we set the proper
    308 # headers, libraries, and definitions for the detection to work properly
    309 # CMAKE_REQUIRED_DEFINITIONS, CMAKE_REQUIRED_LIBRARIES, and
    310 # CMAKE_EXTRA_INCLUDE_FILES.  When we're done with the detection, we'll
    311 # restore them to their original values (otherwise a parent project
    312 # that tries to set these won't be maintained, see Issue #729)
    313 SET (ORIG_CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEEFINITIONS})
    314 SET (ORIG_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
    315 SET (ORIG_CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES})
    316 
    317 SET (CMAKE_REQUIRED_DEFINITIONS ${SYSFLAGS})
    318 LIST (APPEND CMAKE_REQUIRED_LIBRARIES ${CARES_DEPENDENT_LIBS})
    319 
    320 MACRO (CARES_EXTRAINCLUDE_IFSET var include)
    321 	IF (${var})
    322 		LIST (APPEND CMAKE_EXTRA_INCLUDE_FILES ${include})
    323 	ENDIF ()
    324 ENDMACRO ()
    325 
    326 CARES_EXTRAINCLUDE_IFSET (HAVE_AVAILABILITYMACROS_H AvailabilityMacros.h)
    327 CARES_EXTRAINCLUDE_IFSET (HAVE_STDBOOL_H      stdbool.h)
    328 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_TYPES_H    sys/types.h)
    329 CARES_EXTRAINCLUDE_IFSET (HAVE_ARPA_INET_H    arpa/inet.h)
    330 CARES_EXTRAINCLUDE_IFSET (HAVE_ARPA_NAMESER_H arpa/nameser.h)
    331 CARES_EXTRAINCLUDE_IFSET (HAVE_NETDB_H        netdb.h)
    332 CARES_EXTRAINCLUDE_IFSET (HAVE_NET_IF_H       net/if.h)
    333 CARES_EXTRAINCLUDE_IFSET (HAVE_IFADDRS_H      ifaddrs.h)
    334 CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_IN_H   netinet/in.h)
    335 CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET6_IN6_H netinet6/in6.h)
    336 CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_TCP_H  netinet/tcp.h)
    337 CARES_EXTRAINCLUDE_IFSET (HAVE_SIGNAL_H       signal.h)
    338 CARES_EXTRAINCLUDE_IFSET (HAVE_STDLIB_H       stdlib.h)
    339 CARES_EXTRAINCLUDE_IFSET (HAVE_STRING_H       string.h)
    340 CARES_EXTRAINCLUDE_IFSET (HAVE_STRINGS_H      strings.h)
    341 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_IOCTL_H    sys/ioctl.h)
    342 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_RANDOM_H   sys/random.h)
    343 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SELECT_H   sys/select.h)
    344 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKET_H   sys/socket.h)
    345 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKIO_H	sys/sockio.h)
    346 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_TIME_H     sys/time.h)
    347 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_STAT_H     sys/stat.h)
    348 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_UIO_H      sys/uio.h)
    349 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_EVENT_H    sys/event.h)
    350 CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_EPOLL_H    sys/epoll.h)
    351 CARES_EXTRAINCLUDE_IFSET (HAVE_TIME_H         time.h)
    352 CARES_EXTRAINCLUDE_IFSET (HAVE_POLL_H         poll.h)
    353 CARES_EXTRAINCLUDE_IFSET (HAVE_FCNTL_H        fcntl.h)
    354 CARES_EXTRAINCLUDE_IFSET (HAVE_UNISTD_H       unistd.h)
    355 CARES_EXTRAINCLUDE_IFSET (HAVE_WINSOCK2_H     winsock2.h)
    356 CARES_EXTRAINCLUDE_IFSET (HAVE_WS2TCPIP_H     ws2tcpip.h)
    357 CARES_EXTRAINCLUDE_IFSET (HAVE_IPHLPAPI_H     iphlpapi.h)
    358 CARES_EXTRAINCLUDE_IFSET (HAVE_WINDOWS_H      windows.h)
    359 
    360 # Check Types
    361 # CHECK_TYPE_SIZE can't be used to see if a type exists because on Apple when
    362 # building multi-arch, it will throw an error.  So we need to wrap
    363 # CHECK_C_SOURCE_COMPILES for our tests.
    364 MACRO (CARES_TYPE_EXISTS type var)
    365 	SET(_CARES_C_SOURCE "
    366 		#include <stdio.h>
    367 		#include <stdlib.h>
    368 	")
    369 	FOREACH(_C_HEADER ${CMAKE_EXTRA_INCLUDE_FILES})
    370 		SET(_CARES_C_SOURCE "${_CARES_C_SOURCE}
    371 		#include <${_C_HEADER}>")
    372 	ENDFOREACH(_C_HEADER)
    373 
    374 	SET(_CARES_C_SOURCE "${_CARES_C_SOURCE}
    375 		int main() {
    376 			${type} var_exists;
    377 			(void)var_exists;
    378 			return 0;
    379 		}
    380 	")
    381 	CHECK_C_SOURCE_COMPILES ("${_CARES_C_SOURCE}" ${var})
    382 ENDMACRO ()
    383 
    384 CARES_TYPE_EXISTS (socklen_t                 HAVE_SOCKLEN_T)
    385 CARES_TYPE_EXISTS (SOCKET                    HAVE_TYPE_SOCKET)
    386 CARES_TYPE_EXISTS (ssize_t                   HAVE_SSIZE_T)
    387 CARES_TYPE_EXISTS ("long long"               HAVE_LONGLONG)
    388 CARES_TYPE_EXISTS ("struct addrinfo"         HAVE_STRUCT_ADDRINFO)
    389 CARES_TYPE_EXISTS ("struct in6_addr"         HAVE_STRUCT_IN6_ADDR)
    390 CARES_TYPE_EXISTS ("struct sockaddr_in6"     HAVE_STRUCT_SOCKADDR_IN6)
    391 CARES_TYPE_EXISTS ("struct sockaddr_storage" HAVE_STRUCT_SOCKADDR_STORAGE)
    392 CARES_TYPE_EXISTS ("struct timeval"          HAVE_STRUCT_TIMEVAL)
    393 
    394 
    395 # Check for preprocessor defines
    396 CHECK_SYMBOL_EXISTS (AF_INET6        "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_AF_INET6)
    397 CHECK_SYMBOL_EXISTS (O_NONBLOCK      "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_O_NONBLOCK)
    398 CHECK_SYMBOL_EXISTS (FIONBIO         "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_FIONBIO)
    399 CHECK_SYMBOL_EXISTS (SIOCGIFADDR     "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTL_SIOCGIFADDR)
    400 CHECK_SYMBOL_EXISTS (MSG_NOSIGNAL    "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_MSG_NOSIGNAL)
    401 CHECK_SYMBOL_EXISTS (PF_INET6        "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PF_INET6)
    402 CHECK_SYMBOL_EXISTS (SO_NONBLOCK     "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SO_NONBLOCK)
    403 
    404 # XCode v8 bug: iOS when targeting less than v10, or MacOS when targeting less than v10.12 will
    405 # say clock_gettime exists, it is a weak symbol that only exists in iOS10/MacOS10.12 and will
    406 # cause a crash at runtime when running on older versions.  Skip finding CLOCK_MONOTONIC on older
    407 # OS's.
    408 IF ((NOT APPLE) OR IOS_V10 OR MACOS_V1012)
    409 	CHECK_SYMBOL_EXISTS (CLOCK_MONOTONIC "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOCK_GETTIME_MONOTONIC)
    410 ENDIF ()
    411 
    412 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6" sin6_scope_id "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID LANGUAGE C)
    413 
    414 CHECK_SYMBOL_EXISTS (strnlen         "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNLEN)
    415 CHECK_SYMBOL_EXISTS (memmem          "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_MEMMEM)
    416 CHECK_SYMBOL_EXISTS (closesocket     "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOSESOCKET)
    417 CHECK_SYMBOL_EXISTS (CloseSocket     "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOSESOCKET_CAMEL)
    418 CHECK_SYMBOL_EXISTS (connect         "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CONNECT)
    419 CHECK_SYMBOL_EXISTS (connectx        "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CONNECTX)
    420 CHECK_SYMBOL_EXISTS (fcntl           "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_FCNTL)
    421 CHECK_SYMBOL_EXISTS (freeaddrinfo    "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_FREEADDRINFO)
    422 CHECK_SYMBOL_EXISTS (getaddrinfo     "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETADDRINFO)
    423 CHECK_SYMBOL_EXISTS (getenv          "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETENV)
    424 CHECK_SYMBOL_EXISTS (gethostname     "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETHOSTNAME)
    425 CHECK_SYMBOL_EXISTS (getnameinfo     "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETNAMEINFO)
    426 CHECK_SYMBOL_EXISTS (getrandom       "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETRANDOM)
    427 CHECK_SYMBOL_EXISTS (getservbyport_r "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETSERVBYPORT_R)
    428 CHECK_SYMBOL_EXISTS (getservbyname_r "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETSERVBYNAME_R)
    429 CHECK_SYMBOL_EXISTS (gettimeofday    "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETTIMEOFDAY)
    430 CHECK_SYMBOL_EXISTS (if_indextoname  "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IF_INDEXTONAME)
    431 CHECK_SYMBOL_EXISTS (if_nametoindex  "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IF_NAMETOINDEX)
    432 CHECK_SYMBOL_EXISTS (GetBestRoute2   "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETBESTROUTE2)
    433 CHECK_SYMBOL_EXISTS (ConvertInterfaceIndexToLuid  "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CONVERTINTERFACEINDEXTOLUID)
    434 CHECK_SYMBOL_EXISTS (ConvertInterfaceLuidToNameA  "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CONVERTINTERFACELUIDTONAMEA)
    435 CHECK_SYMBOL_EXISTS (NotifyIpInterfaceChange      "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_NOTIFYIPINTERFACECHANGE)
    436 CHECK_SYMBOL_EXISTS (RegisterWaitForSingleObject  "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_REGISTERWAITFORSINGLEOBJECT)
    437 
    438 
    439 CHECK_SYMBOL_EXISTS (inet_net_pton   "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_INET_NET_PTON)
    440 IF (NOT WIN32)
    441 	# Disabled on Windows, because these functions are only really supported on Windows
    442 	# Vista or newer (_WIN32_WINNT >= 0x0600). Older versions of Windows may provide
    443 	# them as experimental non-working features, so we have to disable them manually.
    444 	CHECK_SYMBOL_EXISTS (inet_ntop       "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_INET_NTOP)
    445 	CHECK_SYMBOL_EXISTS (inet_pton       "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_INET_PTON)
    446 ENDIF ()
    447 CHECK_SYMBOL_EXISTS (ioctl           "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTL)
    448 CHECK_SYMBOL_EXISTS (ioctlsocket     "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTLSOCKET)
    449 CHECK_SYMBOL_EXISTS (IoctlSocket     "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTLSOCKET_CAMEL)
    450 CHECK_SYMBOL_EXISTS (recv            "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_RECV)
    451 CHECK_SYMBOL_EXISTS (recvfrom        "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_RECVFROM)
    452 CHECK_SYMBOL_EXISTS (send            "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SEND)
    453 CHECK_SYMBOL_EXISTS (sendto          "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SENDTO)
    454 CHECK_SYMBOL_EXISTS (setsockopt      "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SETSOCKOPT)
    455 CHECK_SYMBOL_EXISTS (socket          "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKET)
    456 CHECK_SYMBOL_EXISTS (strcasecmp      "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRCASECMP)
    457 CHECK_SYMBOL_EXISTS (strcmpi         "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRCMPI)
    458 CHECK_SYMBOL_EXISTS (strdup          "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRDUP)
    459 CHECK_SYMBOL_EXISTS (stricmp         "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRICMP)
    460 CHECK_SYMBOL_EXISTS (strncasecmp     "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNCASECMP)
    461 CHECK_SYMBOL_EXISTS (strncmpi        "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNCMPI)
    462 CHECK_SYMBOL_EXISTS (strnicmp        "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNICMP)
    463 CHECK_SYMBOL_EXISTS (writev          "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_WRITEV)
    464 CHECK_SYMBOL_EXISTS (arc4random_buf  "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_ARC4RANDOM_BUF)
    465 CHECK_SYMBOL_EXISTS (stat            "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STAT)
    466 CHECK_SYMBOL_EXISTS (getifaddrs      "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETIFADDRS)
    467 CHECK_SYMBOL_EXISTS (poll            "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_POLL)
    468 CHECK_SYMBOL_EXISTS (pipe            "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PIPE)
    469 CHECK_SYMBOL_EXISTS (pipe2           "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PIPE2)
    470 CHECK_SYMBOL_EXISTS (kqueue          "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_KQUEUE)
    471 CHECK_SYMBOL_EXISTS (epoll_create1   "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_EPOLL)
    472 
    473 
    474 # On Android, the system headers may define __system_property_get(), but excluded
    475 # from libc.  We need to perform a link test instead of a header/symbol test.
    476 CHECK_FUNCTION_EXISTS (__system_property_get HAVE___SYSTEM_PROPERTY_GET)
    477 
    478 # Restore original values (as per Issue #729)
    479 SET (CMAKE_REQUIRED_DEFINITIONS ${ORIG_CMAKE_REQUIRED_DEEFINITIONS})
    480 SET (CMAKE_REQUIRED_LIBRARIES ${ORIG_CMAKE_REQUIRED_LIBRARIES})
    481 SET (CMAKE_EXTRA_INCLUDE_FILES ${ORIG_CMAKE_EXTRA_INCLUDE_FILES})
    482 
    483 
    484 ################################################################################
    485 # Threading Support
    486 #
    487 IF (CARES_THREADS)
    488 	IF (WIN32)
    489 		# Do nothing, always has threads
    490 	ELSE ()
    491 		# Need to prefer pthreads on platforms that may have more threading choices
    492 		# (e.g. Solaris)
    493 		SET (CMAKE_THREAD_PREFER_PTHREAD TRUE)
    494 		FIND_PACKAGE (Threads)
    495 
    496 		IF (Threads_FOUND)
    497 			# Fix solaris9 bug due to libc having pthread_create() stubs that always fail.  CMake
    498 			# doesn't realize that the real pthread functions aren't in libc, so sets the pthread
    499 			# library CAKE_THREAD_LIBS_INIT variable to blank instead of to the correct "-lpthread".
    500 			IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND NOT CMAKE_THREAD_LIBS_INIT)
    501 				SET (CMAKE_THREAD_LIBS_INIT "-lpthread")
    502 			ENDIF ()
    503 
    504 			# PThread functions.
    505 			CHECK_INCLUDE_FILES (pthread.h                                 HAVE_PTHREAD_H)
    506 			CHECK_INCLUDE_FILES (pthread_np.h                              HAVE_PTHREAD_NP_H)
    507 			CARES_EXTRAINCLUDE_IFSET (HAVE_PTHREAD_H                       pthread.h)
    508 			CARES_EXTRAINCLUDE_IFSET (HAVE_PTHREAD_NP_H                    pthread_np.h)
    509 			CHECK_SYMBOL_EXISTS (pthread_init  "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PTHREAD_INIT)
    510 			LIST (APPEND CARES_DEPENDENT_LIBS ${CMAKE_THREAD_LIBS_INIT})
    511 		ELSE ()
    512 			MESSAGE (WARNING "Threading support not found, disabling...")
    513 			SET (CARES_THREADS OFF)
    514 		ENDIF ()
    515 	ENDIF ()
    516 ENDIF ()
    517 
    518 
    519 
    520 ################################################################################
    521 # recv, recvfrom, send, getnameinfo, gethostname
    522 # ARGUMENTS AND RETURN VALUES
    523 #
    524 # The AutoTools build tries to be really thorough here.  So much so that it
    525 # takes forever.  We really don't want to do that.  Lets make some educated
    526 # guesses based on datatypes we have available, and for others, use some 'sane'
    527 # defaults.  This should be much quicker and nearly as accurate ... and even
    528 # if not, it probably won't matter in the least.
    529 
    530 IF (HAVE_SSIZE_T AND HAVE_SOCKLEN_T AND NOT WIN32)
    531 	# If we have ssize_t and socklen_t, the API is usually sane and uses ssize_t and size_t for lengths
    532 	SET (RECVFROM_TYPE_RETV ssize_t)
    533 	SET (RECVFROM_TYPE_ARG3 size_t)
    534 ELSE ()
    535 	SET (RECVFROM_TYPE_RETV int)
    536 	SET (RECVFROM_TYPE_ARG3 int)
    537 ENDIF ()
    538 
    539 IF (HAVE_TYPE_SOCKET)
    540 	# If the SOCKET type is defined, it uses socket ... should be windows only
    541 	SET (RECVFROM_TYPE_ARG1 SOCKET)
    542 ELSE ()
    543 	SET (RECVFROM_TYPE_ARG1 int)
    544 ENDIF()
    545 
    546 IF (HAVE_SOCKLEN_T)
    547 	# If we have socklen_t the APIs pretty much always actually use it
    548 	SET (RECVFROM_TYPE_ARG6 "socklen_t *")
    549 	SET (GETNAMEINFO_TYPE_ARG2 socklen_t)
    550 	SET (GETNAMEINFO_TYPE_ARG46 socklen_t)
    551 ELSE ()
    552 	SET (RECVFROM_TYPE_ARG6 "int *")
    553 	SET (GETNAMEINFO_TYPE_ARG2 int)
    554 	SET (GETNAMEINFO_TYPE_ARG46 int)
    555 ENDIF ()
    556 
    557 IF (WIN32)
    558 	SET (RECV_TYPE_ARG2 "char *")
    559 ELSE ()
    560 	SET (RECV_TYPE_ARG2 "void *")
    561 ENDIF ()
    562 
    563 # Functions are typically consistent so the equivalent fields map ... equivalently
    564 SET (RECV_TYPE_RETV ${RECVFROM_TYPE_RETV})
    565 SET (SEND_TYPE_RETV ${RECVFROM_TYPE_RETV})
    566 SET (RECV_TYPE_ARG1 ${RECVFROM_TYPE_ARG1})
    567 SET (RECVFROM_TYPE_ARG2 ${RECV_TYPE_ARG2})
    568 SET (SEND_TYPE_ARG1 ${RECVFROM_TYPE_ARG1})
    569 SET (RECV_TYPE_ARG3 ${RECVFROM_TYPE_ARG3})
    570 SET (SEND_TYPE_ARG3 ${RECVFROM_TYPE_ARG3})
    571 SET (GETHOSTNAME_TYPE_ARG2 ${RECVFROM_TYPE_ARG3})
    572 
    573 # These should always be "sane" values to use always
    574 SET (RECVFROM_QUAL_ARG5 )
    575 SET (RECVFROM_TYPE_ARG4 int)
    576 SET (RECVFROM_TYPE_ARG5 "struct sockaddr *")
    577 SET (RECV_TYPE_ARG4 int)
    578 SET (GETNAMEINFO_TYPE_ARG1 "struct sockaddr *")
    579 SET (GETNAMEINFO_TYPE_ARG7 int)
    580 SET (SEND_TYPE_ARG2 "const void *")
    581 SET (SEND_TYPE_ARG4 int)
    582 ################################################################################
    583 
    584 
    585 # HAVE_CXX11  ??
    586 # HAVE_SIG_ATOMIC_T_VOLATILE  ??
    587 
    588 
    589 # Set a few variables by hand that C-Ares wants, logically, based on detection
    590 # data.
    591 
    592 IF (HAVE_SOCKLEN_T)
    593 	Set (CARES_TYPEOF_ARES_SOCKLEN_T "socklen_t")
    594 ELSE ()
    595 	Set (CARES_TYPEOF_ARES_SOCKLEN_T "int")
    596 ENDIF ()
    597 
    598 IF (HAVE_SSIZE_T)
    599 	Set (CARES_TYPEOF_ARES_SSIZE_T "ssize_t")
    600 ELSE ()
    601 	IF (WIN32)
    602 		IF ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
    603 			Set (CARES_TYPEOF_ARES_SSIZE_T "__int64")
    604 		ELSE ()
    605 			Set (CARES_TYPEOF_ARES_SSIZE_T "int")
    606 		ENDIF ()
    607 	ELSE ()
    608 		Set (CARES_TYPEOF_ARES_SSIZE_T "long")
    609 	ENDIF ()
    610 ENDIF ()
    611 
    612 IF (HAVE_FCNTL AND HAVE_O_NONBLOCK)
    613 	SET (HAVE_FCNTL_O_NONBLOCK 1)
    614 ENDIF ()
    615 
    616 IF (HAVE_IOCTL AND HAVE_FIONBIO)
    617 	SET (HAVE_IOCTL_FIONBIO 1)
    618 ENDIF ()
    619 
    620 IF (HAVE_IOCTLSOCKET AND HAVE_FIONBIO)
    621 	SET (HAVE_IOCTLSOCKET_FIONBIO 1)
    622 ENDIF ()
    623 
    624 IF (HAVE_IOCTLSOCKET_CAMEL AND HAVE_FIONBIO)
    625 	SET (HAVE_IOCTLSOCKET_CAMEL_FIONBIO 1)
    626 ENDIF ()
    627 
    628 IF (HAVE_GETADDRINFO)
    629 	IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR
    630 		CMAKE_SYSTEM_NAME STREQUAL "HPUX" OR
    631 		CMAKE_SYSTEM_NAME STREQUAL "NetBSD" OR
    632 		CMAKE_SYSTEM_NAME STREQUAL "SunOS" OR
    633 		CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR
    634 		CMAKE_SYSTEM_NAME STREQUAL "AIX" OR
    635 		WIN32)
    636 			SET (HAVE_GETADDRINFO_THREADSAFE 1)
    637 	ENDIF ()
    638 ENDIF ()
    639 
    640 IF (HAVE_TIME_H AND HAVE_SYS_TIME_H)
    641 	SET (TIME_WITH_SYS_TIME 1)
    642 ENDIF ()
    643 
    644 IF (HAVE_GETSERVBYPORT_R)
    645 	# TODO : Should probably autodetect
    646 	IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
    647 		SET (GETSERVBYPORT_R_ARGS 5)
    648 	ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX" OR
    649 		CMAKE_SYSTEM_NAME STREQUAL "OpenBSD" OR
    650 		HAIKU)
    651 		SET (GETSERVBYPORT_R_ARGS 4)
    652 	ELSE ()
    653 		# Probably linux
    654 		SET (GETSERVBYPORT_R_ARGS 6)
    655 	ENDIF ()
    656 ENDIF ()
    657 
    658 IF (HAVE_GETSERVBYNAME_R)
    659 	# TODO : Should probably autodetect
    660 	IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
    661 		SET (GETSERVBYNAME_R_ARGS 5)
    662 	ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX" OR
    663 		CMAKE_SYSTEM_NAME STREQUAL "OpenBSD" OR
    664 		HAIKU)
    665 		SET (GETSERVBYNAME_R_ARGS 4)
    666 	ELSE ()
    667 		# Probably linux
    668 		SET (GETSERVBYNAME_R_ARGS 6)
    669 	ENDIF ()
    670 ENDIF ()
    671 
    672 # Set some aliases used for ares_build.h
    673 IF (HAVE_SYS_TYPES_H)
    674 	SET (CARES_HAVE_SYS_TYPES_H 1)
    675 ENDIF ()
    676 IF (HAVE_SYS_SOCKET_H)
    677 	SET (CARES_HAVE_SYS_SOCKET_H 1)
    678 ENDIF()
    679 IF (HAVE_SYS_SELECT_H)
    680 	SET (CARES_HAVE_SYS_SELECT_H 1)
    681 ENDIF()
    682 IF (HAVE_WS2TCPIP_H)
    683 	SET (CARES_HAVE_WS2TCPIP_H 1)
    684 ENDIF()
    685 IF (HAVE_WINSOCK2_H)
    686 	SET (CARES_HAVE_WINSOCK2_H 1)
    687 ENDIF()
    688 IF (HAVE_WINDOWS_H)
    689 	SET (CARES_HAVE_WINDOWS_H 1)
    690 ENDIF()
    691 IF (HAVE_ARPA_NAMESER_H)
    692 	SET (CARES_HAVE_ARPA_NAMESER_H 1)
    693 ENDIF()
    694 IF (HAVE_ARPA_NAMESER_COMPAT_H)
    695 	SET (CARES_HAVE_ARPA_NAMESER_COMPAT_H 1)
    696 ENDIF()
    697 
    698 # Coverage
    699 IF (CARES_COVERAGE)
    700 	# set compiler flags
    701 	SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftest-coverage -fprofile-arcs")
    702 	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftest-coverage -fprofile-arcs")
    703 
    704 	# find required tools
    705 	FIND_PROGRAM(LCOV lcov REQUIRED)
    706 	FIND_PROGRAM(GENHTML genhtml REQUIRED)
    707 
    708 	# add coverage target
    709 	ADD_CUSTOM_TARGET(coverage
    710 		# gather data
    711 		COMMAND ${LCOV} --directory . --capture --output-file coverage.info
    712 		# generate report
    713 		COMMAND ${GENHTML} --demangle-cpp -o coverage coverage.info
    714 		WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    715 	)
    716 ENDIF()
    717 
    718 # TRANSFORM_MAKEFILE_INC
    719 #
    720 # This function consumes the "Makefile.inc" autotools file, and converts it into
    721 #  "Makefile.inc.cmake", a cmake include file; transforming this:
    722 #
    723 # CSOURCES = ares__close_sockets.c	\
    724 #   ares__get_hostent.c			\
    725 #   ares__read_line.c			\
    726 #   ...
    727 #
    728 #   into this:
    729 #
    730 # SET (CSOURCES
    731 # 	ares__close_sockets.c
    732 # 	ares__get_hostent.c
    733 # 	ares__read_line.c
    734 #	...
    735 function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
    736 	file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT)
    737 	string(REPLACE "$(top_srcdir)"   "\${PROJECT_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
    738 	string(REPLACE "$(top_builddir)" "\${PROJECT_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
    739 
    740 	string(REGEX REPLACE "\\\\\n" "ß!ß" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
    741 	string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
    742 	string(REPLACE "ß!ß" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
    743 
    744 	string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})    # Replace $() with ${}
    745 	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.
    746 	file(WRITE ${OUTPUT_FILE} ${MAKEFILE_INC_TEXT})
    747 endfunction()
    748 
    749 # Directory for includes
    750 ADD_SUBDIRECTORY (include)
    751 
    752 # Directory for lib and tools
    753 ADD_SUBDIRECTORY (src)
    754 
    755 # Docs
    756 ADD_SUBDIRECTORY (docs)
    757 
    758 # Tests
    759 IF (CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS)
    760 	ENABLE_TESTING ()
    761 	ADD_SUBDIRECTORY (test)
    762 ENDIF ()
    763 
    764 # Export targets
    765 IF (CARES_INSTALL)
    766 	SET (CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
    767 	INCLUDE (CMakePackageConfigHelpers)
    768 	CONFIGURE_PACKAGE_CONFIG_FILE (${PROJECT_NAME}-config.cmake.in ${PROJECT_NAME}-config.cmake
    769 		INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}
    770 		PATH_VARS CMAKE_INSTALL_INCLUDEDIR
    771 		NO_CHECK_REQUIRED_COMPONENTS_MACRO
    772 	)
    773 
    774 	WRITE_BASIC_PACKAGE_VERSION_FILE(${PROJECT_NAME}-config-version.cmake VERSION "${CARES_VERSION}" COMPATIBILITY SameMajorVersion)
    775 	INSTALL (EXPORT ${PROJECT_NAME}-targets COMPONENT Devel DESTINATION ${CMAKECONFIG_INSTALL_DIR} NAMESPACE ${PROJECT_NAME}::)
    776 	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})
    777 
    778 	# pkgconfig support for static builds
    779 	FOREACH (LIB ${CARES_DEPENDENT_LIBS})
    780 		IF (NOT LIB MATCHES "^-")
    781 			SET (LIB "-l${LIB}")
    782 		ENDIF ()
    783 		SET (CARES_PRIVATE_LIBS "${CARES_PRIVATE_LIBS} ${LIB}")
    784 	ENDFOREACH ()
    785 
    786 	CONFIGURE_FILE("libcares.pc.cmake" "libcares.pc" @ONLY)
    787 	INSTALL (FILES "${CMAKE_CURRENT_BINARY_DIR}/libcares.pc" COMPONENT Devel DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
    788 ENDIF ()
    789 
    790 # Legacy chain-building variables (provided for compatibility with old code).
    791 # Don't use these, external code should be updated to refer to the aliases directly (e.g., Cares::cares).
    792 SET (CARES_FOUND 1 CACHE INTERNAL "CARES LIBRARY FOUND")
    793 SET (CARES_LIBRARIES ${PROJECT_NAME}::cares CACHE INTERNAL "CARES LIBRARIES")
    794 
    795 
    796 IF (CARES_INSTALL)
    797     # Package creation
    798     set( CPACK_PACKAGE_NAME ${PROJECT_NAME} )
    799     set( CPACK_PACKAGE_VENDOR "Daniel Stenberg" ) # Github project owner
    800     set( CPACK_PACKAGE_DESCRIPTION_SUMMARY "A C library for asynchronous DNS requests" )
    801     set( CPACK_PACKAGE_HOMEPAGE_URL "https://c-ares.org/" )
    802     set( CPACK_PACKAGE_CONTACT      "https://c-ares.org/" )
    803     set( CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR} )
    804     set( CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR} )
    805     set( CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH} )
    806     set( CPACK_PACKAGE_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH} )
    807     set( CPACK_PACKAGE_INSTALL_DIRECTORY ${PROJECT_NAME} )
    808     set( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md" )
    809     set( CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md" )
    810 
    811     set( CPACK_COMPONENT_Library_DISPLAY_NAME "c-ares Library" )
    812     set( CPACK_COMPONENT_Library_DESCRIPTION "The c-ares binary library." )
    813     set( CPACK_COMPONENT_Library_REQUIRED 1 )
    814     set( CPACK_COMPONENT_Devel_DISPLAY_NAME "c-ares Development Files" )
    815     set( CPACK_COMPONENT_Devel_DESCRIPTION "Development files for compiling against c-ares." )
    816     set( CPACK_COMPONENT_Devel_REQUIRED 0 )
    817     IF (CARES_BUILD_TOOLS)
    818         set( CPACK_COMPONENT_Tools_DISPLAY_NAME "c-ares Tools" )
    819         set( CPACK_COMPONENT_Tools_DESCRIPTION "Tools for using c-ares." )
    820         set( CPACK_COMPONENT_Tools_REQUIRED 0 )
    821     ENDIF ()
    822 
    823     if( ${CMAKE_SYSTEM_NAME} STREQUAL "Linux" )
    824 
    825         if ( "${CPACK_PACKAGE_ARCHITECTURE}" STREQUAL "" )
    826             set( CPACK_PACKAGE_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}" )
    827         endif()
    828         if ( "${CPACK_PACKAGE_ARCHITECTURE}" STREQUAL "" )
    829             if ( "${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows" )
    830                 message( FATAL_ERROR "Failed to determine CPACK_PACKAGE_ARCHITECTURE. Is CMAKE_SYSTEM_PROCESSOR set?" )
    831             endif()
    832             # Note: the architecture should default to the local architecture, but it
    833             # in fact comes up empty.  We call `uname -m` to ask the kernel instead.
    834             EXECUTE_PROCESS( COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE )
    835         endif()
    836 
    837         set( CPACK_INCLUDE_TOPLEVEL_DIRECTORY 1 )
    838         set( CPACK_PACKAGE_RELEASE 1 )
    839 
    840 
    841         # RPM - https://cmake.org/cmake/help/latest/cpack_gen/rpm.html
    842         set( CPACK_RPM_PACKAGE_RELEASE ${CPACK_PACKAGE_RELEASE} )
    843         set( CPACK_RPM_PACKAGE_ARCHITECTURE ${CPACK_PACKAGE_ARCHITECTURE} )
    844         set( CPACK_RPM_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION_SUMMARY} )
    845         set( CPACK_RPM_PACKAGE_URL ${CPACK_PACKAGE_HOMEPAGE_URL} )
    846         set( CPACK_RPM_PACKAGE_LICENSE "MIT" )
    847         set( CPACK_RPM_COMPONENT_INSTALL 1 )
    848         set( CPACK_RPM_COMPRESSION_TYPE "xz" )
    849         set( CPACK_RPM_PACKAGE_AUTOPROV 1 )
    850 
    851         set( CPACK_RPM_Library_PACKAGE_SUMMARY ${CPACK_COMPONENT_Library_DESCRIPTION} )
    852         set( CPACK_RPM_Library_PACKAGE_ARCHITECTURE ${CPACK_RPM_PACKAGE_ARCHITECTURE} )
    853         set( CPACK_RPM_Library_PACKAGE_NAME "libcares${CARES_LIB_VERSION_MAJOR}" )
    854         set( CPACK_RPM_Library_FILE_NAME "RPM-DEFAULT" )
    855 
    856         set( CPACK_RPM_Devel_PACKAGE_REQUIRES "cmake >= ${CMAKE_MINIMUM_REQUIRED_VERSION}, ${CPACK_RPM_Library_PACKAGE_NAME} >= ${CPACK_PACKAGE_VERSION}" )
    857         set( CPACK_RPM_Devel_PACKAGE_SUMMARY ${CPACK_COMPONENT_Devel_DESCRIPTION} )
    858         set( CPACK_RPM_Devel_PACKAGE_ARCHITECTURE ${CPACK_RPM_PACKAGE_ARCHITECTURE} )
    859         set( CPACK_RPM_Devel_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-devel" )
    860         set( CPACK_RPM_Devel_FILE_NAME "RPM-DEFAULT" )
    861 
    862         IF (CARES_BUILD_TOOLS)
    863             set( CPACK_RPM_Tools_PACKAGE_REQUIRES "${CPACK_RPM_Library_PACKAGE_NAME} >= ${CPACK_PACKAGE_VERSION}" )
    864             set( CPACK_RPM_Tools_PACKAGE_SUMMARY ${CPACK_COMPONENT_Tools_DESCRIPTION} )
    865             set( CPACK_RPM_Tools_PACKAGE_ARCHITECTURE ${CPACK_RPM_PACKAGE_ARCHITECTURE} )
    866             set( CPACK_RPM_Tools_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-tools" )
    867             set( CPACK_RPM_Tools_FILE_NAME "RPM-DEFAULT" )
    868         ENDIF ()
    869 
    870 
    871         # DEB - https://cmake.org/cmake/help/latest/cpack_gen/deb.html
    872         set( CPACK_DEBIAN_PACKAGE_RELEASE ${CPACK_PACKAGE_RELEASE} )
    873         set( CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CPACK_PACKAGE_HOMEPAGE_URL} )
    874         set( CPACK_DEB_COMPONENT_INSTALL 1 )
    875         set( CPACK_DEBIAN_COMPRESSION_TYPE "xz")
    876         set( CPACK_DEBIAN_PACKAGE_SHLIBDEPS 1 )
    877 
    878         if ( ${CPACK_PACKAGE_ARCHITECTURE} STREQUAL "x86_64" )
    879             set( CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64" )  # DEB doesn't always use the kernel's arch name
    880         else()
    881             set( CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${CPACK_PACKAGE_ARCHITECTURE} )
    882         endif()
    883 
    884         set( CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT" ) # Use default naming scheme
    885 
    886         set( CPACK_DEBIAN_LIBRARY_PACKAGE_NAME ${CPACK_RPM_Library_PACKAGE_NAME} )
    887 
    888         set( CPACK_DEBIAN_DEVEL_PACKAGE_DEPENDS "cmake (>= ${CMAKE_MINIMUM_REQUIRED_VERSION}), ${CPACK_DEBIAN_LIBRARY_PACKAGE_NAME} (>= ${CPACK_PACKAGE_VERSION})" )
    889         set( CPACK_DEBIAN_DEVEL_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-dev" )
    890 
    891         IF (CARES_BUILD_TOOLS)
    892             set( CPACK_DEBIAN_TOOLS_PACKAGE_NAME "${CPACK_PACKAGE_NAME}-tools" )
    893             set( CPACK_DEBIAN_TOOLS_PACKAGE_SHLIBDEPS OFF ) # dpkg-shlibdeps can't find the libs we built
    894             set( CPACK_DEBIAN_TOOLS_PACKAGE_DEPENDS "${CPACK_DEBIAN_LIBRARY_PACKAGE_NAME} (>= ${CPACK_PACKAGE_VERSION})" )
    895         ENDIF ()
    896 
    897     elseif( ${CMAKE_HOST_WIN32} )
    898         set( CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON )
    899         set( CPACK_NSIS_DISPLAY_NAME ${PROJECT_NAME} )
    900         set( CPACK_NSIS_PACKAGE_NAME ${PROJECT_NAME} )
    901         set( CPACK_NSIS_URL_INFO_ABOUT ${CPACK_PACKAGE_HOMEPAGE_URL} )
    902     endif()
    903 
    904     # This must always be last!
    905     include( CPack )
    906 ENDIF ()