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 ()