From e4fe33edb70a9a7becbcef4ff428e09e4d670ef7 Mon Sep 17 00:00:00 2001 From: Brad House Date: Tue, 27 Sep 2016 19:59:05 -0400 Subject: [PATCH 01/11] Adds cmake build system support to C-Ares. The patch does not modify any source files, it only adds 3 new files (CMakelists.txt, ares_build.h.cmake, ares_config.h.cmake) which form the build system. I've tried to go through as much of the autotools tests and extracted what I thought was appropriate, though many of the tests aren't as in-depth in CMake as they are for autotools ... it is unclear why some of them exist at all, I'm guessing for legacy systems that CMake probably doesn't support anyhow. Building the library, and examples (adig, ahost, acountry) plus installation should work across a large number of tested platforms. The tests have not yet been integrated. --- CMakeLists.txt | 571 ++++++++++++++++++++++++++++++++++++++++++++ ares_build.h.cmake | 39 +++ ares_config.h.cmake | 433 +++++++++++++++++++++++++++++++++ 3 files changed, 1043 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 ares_build.h.cmake create mode 100644 ares_config.h.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..0763545d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,571 @@ +CMAKE_MINIMUM_REQUIRED (VERSION 2.8) +INCLUDE (CheckIncludeFiles) +INCLUDE (CheckTypeSize) +INCLUDE (CheckFunctionExists) +INCLUDE (CheckSymbolExists) +INCLUDE (CheckCSourceCompiles) +INCLUDE (CheckStructHasMember) +INCLUDE (CheckLibraryExists) + +PROJECT (cares C) + + +OPTION (CARES_STATIC "Build as a static library" OFF) +OPTION (CARES_SHARED "Build as a shared library" ON) +OPTION (CARES_INSTALL "Create installation targets (chain builders may want to disable this)" ON) +OPTION (CARES_STATIC_PIC "Build the static library as PIC (position independent)" OFF) + + +# Keep build organized. +SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) +SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) +SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) +SET (PACKAGE_DIRECTORY ${PROJECT_BINARY_DIR}/package) + + +# Install path helpers +IF ("${CARES_INSTALL_LOCATION_LIBS}" STREQUAL "") + SET (CARES_INSTALL_LOCATION_LIBS ${CMAKE_INSTALL_PREFIX}/lib CACHE INTERNAL "") +ENDIF () +IF ("${CARES_INSTALL_LOCATION_HEADERS}" STREQUAL "") + SET (CARES_INSTALL_LOCATION_HEADERS ${CMAKE_INSTALL_PREFIX}/include CACHE INTERNAL "") +ENDIF () +IF ("${CARES_INSTALL_LOCATION_BIN}" STREQUAL "") + SET (CARES_INSTALL_LOCATION_BIN ${CMAKE_INSTALL_PREFIX}/bin CACHE INTERNAL "") +ENDIF () + + +# When chain building C-Ares, we should set some of the same variables that a +# standard Find_Package(CAres) would set. It just references the internal +# build paths rather than an already-installed version. +SET (CARES_FOUND 1 CACHE INTERNAL "CARES LIBRARY FOUND") +SET (CARES_INCLUDE_DIRS "${PROJECT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "CARES INCLUDE DIRECTORIES") +SET (CARES_LIBRARIES ${PROJECT_NAME} CACHE INTERNAL "CARES LIBRARIES") +IF (${CARES_STATIC} AND NOT ${CARES_SHARED}) + SET (CARES_DEFINITIONS "-DCARES_STATICLIB" CACHE INTERNAL "CARES DEFINITIONS") +ENDIF () + + +# Look for dependent/required libraries +CHECK_LIBRARY_EXISTS (resolv res_servicename "" HAVE_RES_SERVICENAME_IN_LIBRESOLV) +IF (HAVE_RES_SERVICENAME_IN_LIBRESOLV) + SET (HAVE_LIBRESOLV 1) +ENDIF () + +IF (APPLE) + CHECK_C_SOURCE_COMPILES (" + #include + #include + int main() { +#if TARGET_OS_IPHONE == 0 +#error Not an iPhone target +#endif +return 0; + } + " + IOS) +ENDIF () + +IF (IOS AND HAVE_LIBRESOLV) + SET (CARES_USE_LIBRESOLV 1) +ENDIF() + +CHECK_LIBRARY_EXISTS (nsl gethostbyname "" HAVE_LIBNSL) +CHECK_LIBRARY_EXISTS (socket gethostbyname "" HAVE_LIBSOCKET) +IF (NOT ${HAVE_LIBSOCKET}) + CHECK_LIBRARY_EXISTS (socket socket "" HAVE_LIBSOCKET) +ENDIF () +CHECK_LIBRARY_EXISTS (rt clock_gettime "" HAVE_LIBRT) + + +# Look for necessary includes +CHECK_INCLUDE_FILES (sys/types.h HAVE_SYS_TYPES_H) +CHECK_INCLUDE_FILES (sys/socket.h HAVE_SYS_SOCKET_H) +CHECK_INCLUDE_FILES (arpa/inet.h HAVE_ARPA_INET_H) +CHECK_INCLUDE_FILES (arpa/nameser_compat.h HAVE_ARPA_NAMESER_COMPAT_H) +CHECK_INCLUDE_FILES (arpa/nameser.h HAVE_ARPA_NAMESER_H) +CHECK_INCLUDE_FILES (assert.h HAVE_ASSERT_H) +CHECK_INCLUDE_FILES (errno.h HAVE_ERRNO_H) +CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H) +CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H) +CHECK_INCLUDE_FILES (limits.h HAVE_LIMITS_H) +CHECK_INCLUDE_FILES (malloc.h HAVE_MALLOC_H) +CHECK_INCLUDE_FILES (memory.h HAVE_MEMORY_H) +CHECK_INCLUDE_FILES (netdb.h HAVE_NETDB_H) +CHECK_INCLUDE_FILES (netinet/in.h HAVE_NETINET_IN_H) +CHECK_INCLUDE_FILES (netinet/tcp.h HAVE_NETINET_TCP_H) +CHECK_INCLUDE_FILES (net/if.h HAVE_NET_IF_H) +CHECK_INCLUDE_FILES (signal.h HAVE_SIGNAL_H) +CHECK_INCLUDE_FILES (socket.h HAVE_SOCKET_H) +CHECK_INCLUDE_FILES (stdbool.h HAVE_STDBOOL_H) +CHECK_INCLUDE_FILES (stdint.h HAVE_STDINT_H) +CHECK_INCLUDE_FILES (stdlib.h HAVE_STDLIB_H) +CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H) +CHECK_INCLUDE_FILES (string.h HAVE_STRING_H) +CHECK_INCLUDE_FILES (stropts.h HAVE_STROPTS_H) +CHECK_INCLUDE_FILES (sys/ioctl.h HAVE_SYS_IOCTL_H) +CHECK_INCLUDE_FILES (sys/param.h HAVE_SYS_PARAM_H) +CHECK_INCLUDE_FILES (sys/select.h HAVE_SYS_SELECT_H) +CHECK_INCLUDE_FILES (sys/socket.h HAVE_SYS_SOCKET_H) +CHECK_INCLUDE_FILES (sys/stat.h HAVE_SYS_STAT_H) +CHECK_INCLUDE_FILES (sys/time.h HAVE_SYS_TIME_H) +CHECK_INCLUDE_FILES (sys/types.h HAVE_SYS_TYPES_H) +CHECK_INCLUDE_FILES (sys/uio.h HAVE_SYS_UIO_H) +CHECK_INCLUDE_FILES (time.h HAVE_TIME_H) +CHECK_INCLUDE_FILES (dlfcn.h HAVE_DLFCN_H) +CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H) + +# Include order matters for these windows files. +CHECK_INCLUDE_FILES ("winsock2.h;windows.h" HAVE_WINSOCK2_H) +CHECK_INCLUDE_FILES ("winsock2.h;ws2tcpip.h;windows.h" HAVE_WS2TCPIP_H) +CHECK_INCLUDE_FILES ("winsock.h;windows.h" HAVE_WINSOCK_H) +CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H) + + +# Set system-specific compiler flags +IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin") + LIST (APPEND SYSFLAGS -D_DARWIN_C_SOURCE) +ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "Linux") + LIST (APPEND SYSFLAGS -D_GNU_SOURCE -D_POSIX_C_SOURCE=199309L -D_XOPEN_SOURCE=600) +ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "SunOS") + LIST (APPEND SYSFLAGS -D__EXTENSIONS__ -D_REENTRANT -D_XOPEN_SOURCE=600) +ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX") + LIST (APPEND SYSFLAGS -D_ALL_SOURCE -D_XOPEN_SOURCE=600) +ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + # Don't define _XOPEN_SOURCE on FreeBSD, it actually reduces visibility instead of increasing it +ELSEIF (WIN32) + LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) +ENDIF () +ADD_DEFINITIONS(${SYSFLAGS}) + + + +# Tell C-Ares about libraries to depend on +IF (${HAVE_LIBRESOLV}) + LIST (APPEND CARES_DEPENDENT_LIBS resolv) +ENDIF () +IF (${HAVE_LIBNSL}) + LIST (APPEND CARES_DEPENDENT_LIBS nsl) +ENDIF () +IF (${HAVE_LIBSOCKET}) + LIST (APPEND CARES_DEPENDENT_LIBS socket) +ENDIF () +IF (${HAVE_LIBRT}) + LIST (APPEND CARES_DEPENDENT_LIBS rt) +ENDIF () +IF (WIN32) + LIST (APPEND CARES_DEPENDENT_LIBS ws2_32) +ENDIF () + + +# When checking for symbols, we need to make sure we set the proper +# headers, libraries, and definitions for the detection to work properly +# CMAKE_REQUIRED_DEFINITIONS, CMAKE_REQUIRED_LIBRARIES, and +# CMAKE_EXTRA_INCLUDE_FILES. When we're done with the detection, we'll +# unset them. + +SET (CMAKE_REQUIRED_DEFINITIONS ${SYSFLAGS}) +LIST (APPEND CMAKE_REQUIRED_LIBRARIES ${CARES_DEPENDENT_LIBS}) + +MACRO (CARES_EXTRAINCLUDE_IFSET var include) + IF (${var}) + LIST (APPEND CMAKE_EXTRA_INCLUDE_FILES ${include}) + ENDIF () +ENDMACRO () + +CARES_EXTRAINCLUDE_IFSET (HAVE_STDBOOL_H stdbool.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_TYPES_H sys/types.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_ARPA_INET_H arpa/inet.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_ARPA_NAMESER_H arpa/nameser.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_NETDB_H netdb.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_IN_H netinet/in.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_TCP_H netinet/tcp.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_SIGNAL_H signal.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_IOCTL_H sys/ioctl.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SELECT_H sys/select.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKET_H sys/socket.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_TIME_H sys/time.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_TIME_H time.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_FCNTL_H fcntl.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_UNISTD_H unistd.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_WINSOCK2_H winsock2.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_WS2TCPIP_H ws2tcpip.h) +CARES_EXTRAINCLUDE_IFSET (HAVE_WINDOWS_H windows.h) + +# Check Types +# CHECK_TYPE_SIZE can't be used to see if a type exists because on Apple when +# building multi-arch, it will throw an error. So we need to wrap +# CHECK_C_SOURCE_COMPILES for our tests. +MACRO (CARES_TYPE_EXISTS type var) + SET(_CARES_C_SOURCE " + #include + #include + ") + FOREACH(_C_HEADER ${CMAKE_EXTRA_INCLUDE_FILES}) + SET(_CARES_C_SOURCE "${_CARES_C_SOURCE} + #include <${_C_HEADER}>") + ENDFOREACH(_C_HEADER) + + SET(_CARES_C_SOURCE "${_CARES_C_SOURCE} + int main() { + ${type} var_exists; + return 0; + } + ") + CHECK_C_SOURCE_COMPILES ("${_CARES_C_SOURCE}" ${var}) +ENDMACRO () + +CARES_TYPE_EXISTS (socklen_t HAVE_SOCKLEN_T) +CARES_TYPE_EXISTS (SOCKET HAVE_TYPE_SOCKET) +CARES_TYPE_EXISTS (bool HAVE_BOOL_T) +CARES_TYPE_EXISTS (ssize_t HAVE_SSIZE_T) +CARES_TYPE_EXISTS ("long long" HAVE_LONGLONG) +CARES_TYPE_EXISTS (sig_atomic_t HAVE_SIG_ATOMIC_T) +CARES_TYPE_EXISTS ("struct addrinfo" HAVE_STRUCT_ADDRINFO) +CARES_TYPE_EXISTS ("struct in6_addr" HAVE_STRUCT_IN6_ADDR) +CARES_TYPE_EXISTS ("struct sockaddr_in6" HAVE_STRUCT_SOCKADDR_IN6) +CARES_TYPE_EXISTS ("struct sockaddr_storage" HAVE_STRUCT_SOCKADDR_STORAGE) +CARES_TYPE_EXISTS ("struct timeval" HAVE_STRUCT_TIMEVAL) + + +# Check for preprocessor defines +CHECK_SYMBOL_EXISTS (AF_INET6 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_AF_INET6) +CHECK_SYMBOL_EXISTS (O_NONBLOCK "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_O_NONBLOCK) +CHECK_SYMBOL_EXISTS (FIONBIO "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_FIONBIO) +CHECK_SYMBOL_EXISTS (SIOCGIFADDR "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTL_SIOCGIFADDR) +CHECK_SYMBOL_EXISTS (MSG_NOSIGNAL "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_MSG_NOSIGNAL) +CHECK_SYMBOL_EXISTS (PF_INET6 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PF_INET6) +CHECK_SYMBOL_EXISTS (SO_NONBLOCK "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SO_NONBLOCK) +CHECK_SYMBOL_EXISTS (CLOCK_MONOTONIC "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOCK_GETTIME_MONOTONIC) + +CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6" sin6_scope_id "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID LANGUAGE C) + +# Check for "LL" numeric suffix support +CHECK_C_SOURCE_COMPILES ("int main() { int n=1234LL; return 0; }" HAVE_LL) + + +# NOTE: CHECK_FUNCTION_EXISTS appears to be broken on 32bit Windows with VS2005 +# at least. It does not appear to honor CMAKE_REQUIRED_LIBRARIES for some +# reason so does not find functions that are not in the standard C library. +# For this reason, we are going to at least just make sure it is in the +# headers by using CHECK_SYMBOL_EXISTS. But we wrap it in a Macro to allow +# it to work on other systems +MACRO (CARES_FUNCTION_EXISTS func var) + IF (WIN32 AND MSVC) + CHECK_SYMBOL_EXISTS("${func}" "${CMAKE_EXTRA_INCLUDE_FILES}" "${var}") + ELSE () + CHECK_FUNCTION_EXISTS("${func}" "${var}") + ENDIF () +ENDMACRO () + +CARES_FUNCTION_EXISTS (bitncmp HAVE_BITNCMP) +CARES_FUNCTION_EXISTS (closesocket HAVE_CLOSESOCKET) +CARES_FUNCTION_EXISTS (CloseSocket HAVE_CLOSESOCKET_CAMEL) +CARES_FUNCTION_EXISTS (connect HAVE_CONNECT) +CARES_FUNCTION_EXISTS (fcntl HAVE_FCNTL) +CARES_FUNCTION_EXISTS (freeaddrinfo HAVE_FREEADDRINFO) +CARES_FUNCTION_EXISTS (getaddrinfo HAVE_GETADDRINFO) +CARES_FUNCTION_EXISTS (getenv HAVE_GETENV) +CARES_FUNCTION_EXISTS (gethostbyaddr HAVE_GETHOSTBYADDR) +CARES_FUNCTION_EXISTS (gethostbyname HAVE_GETHOSTBYNAME) +CARES_FUNCTION_EXISTS (gethostname HAVE_GETHOSTNAME) +CARES_FUNCTION_EXISTS (getnameinfo HAVE_GETNAMEINFO) +CARES_FUNCTION_EXISTS (getservbyport_r HAVE_GETSERVBYPORT_R) +CARES_FUNCTION_EXISTS (gettimeofday HAVE_GETTIMEOFDAY) +CARES_FUNCTION_EXISTS (if_indextoname HAVE_IF_INDEXTONAME) +CARES_FUNCTION_EXISTS (inet_net_pton HAVE_INET_NET_PTON) +IF (NOT WIN32) + # Disabled on windows. CARES_FUNCTION_EXISTS will say they exist, but + # it doesn't appear as though proper headers really exist for these functions + # as there are prototype warnings during the build. + CARES_FUNCTION_EXISTS (inet_ntop HAVE_INET_NTOP) + CARES_FUNCTION_EXISTS (inet_pton HAVE_INET_PTON) +ENDIF () +CARES_FUNCTION_EXISTS (ioctl HAVE_IOCTL) +CARES_FUNCTION_EXISTS (ioctlsocket HAVE_IOCTLSOCKET) +CARES_FUNCTION_EXISTS (IoctlSocket HAVE_IOCTLSOCKET_CAMEL) +CARES_FUNCTION_EXISTS (recv HAVE_RECV) +CARES_FUNCTION_EXISTS (recvfrom HAVE_RECVFROM) +CARES_FUNCTION_EXISTS (send HAVE_SEND) +CARES_FUNCTION_EXISTS (setsockopt HAVE_SETSOCKOPT) +CARES_FUNCTION_EXISTS (socket HAVE_SOCKET) +CARES_FUNCTION_EXISTS (strcasecmp HAVE_STRCASECMP) +CARES_FUNCTION_EXISTS (strcmpi HAVE_STRCMPI) +CARES_FUNCTION_EXISTS (strdup HAVE_STRDUP) +CARES_FUNCTION_EXISTS (stricmp HAVE_STRICMP) +CARES_FUNCTION_EXISTS (strncasecmp HAVE_STRNCASECMP) +CARES_FUNCTION_EXISTS (strncmpi HAVE_STRNCMPI) +CARES_FUNCTION_EXISTS (strnicmp HAVE_STRNICMP) +CARES_FUNCTION_EXISTS (writev HAVE_WRITEV) + +# Unset temporary data +SET (CMAKE_EXTRA_INCLUDE_FILES) +SET (CMAKE_REQUIRED_DEFINITIONS) +SET (CMAKE_REQUIRED_LIBRARIES) + + +################################################################################ +# recv, recvfrom, send, getnameinfo, gethostname +# ARGUMENTS AND RETURN VALUES +# +# The AutoTools build tries to be really thorough here. So much so that it +# takes forever. We really don't want to do that. Lets make some educated +# guesses based on datatypes we have available, and for others, use some 'sane' +# defaults. This should be much quicker and nearly as accurate ... and even +# if not, it probably won't matter in the least. + +IF ("${HAVE_SSIZE_T}" AND "${HAVE_SOCKLEN_T}") + # If we have ssize_t and socklen_t, the API is usually sane and uses ssize_t and size_t for lengths + SET (RECVFROM_TYPE_RETV ssize_t) + SET (RECVFROM_TYPE_ARG3 size_t) +ELSE () + SET (RECVFROM_TYPE_RETV int) + SET (RECVFROM_TYPE_ARG3 int) +ENDIF () + +IF ("${HAVE_TYPE_SOCKET}") + # If the SOCKET type is defined, it uses socket ... should be windows only + SET (RECVFROM_TYPE_ARG1 SOCKET) +ELSE () + SET (RECVFROM_TYPE_ARG1 int) +ENDIF() + +IF ("${HAVE_SOCKLEN_T}") + # If we have socklen_t the APIs pretty much always actually use it + SET (RECVFROM_TYPE_ARG6 "socklen_t *") + SET (GETNAMEINFO_TYPE_ARG2 socklen_t) + SET (GETNAMEINFO_TYPE_ARG46 socklen_t) +ELSE () + SET (RECVFROM_TYPE_ARG6 "int *") + SET (GETNAMEINFO_TYPE_ARG2 int) + SET (GETNAMEINFO_TYPE_ARG46 int) +ENDIF () + +# Functions are typically consistent so the equivalent fields map ... equivalently +SET (RECV_TYPE_RETV ${RECVFROM_TYPE_RETV}) +SET (SEND_TYPE_RETV ${RECVFROM_TYPE_RETV}) +SET (RECV_TYPE_ARG1 ${RECVFROM_TYPE_ARG1}) +SET (SEND_TYPE_ARG1 ${RECVFROM_TYPE_ARG1}) +SET (RECV_TYPE_ARG3 ${RECVFROM_TYPE_ARG3}) +SET (SEND_TYPE_ARG3 ${RECVFROM_TYPE_ARG3}) +SET (GETHOSTNAME_TYPE_ARG2 ${RECVFROM_TYPE_ARG3}) + +# These should always be "sane" values to use always +SET (RECVFROM_QUAL_ARG5 ) +SET (RECVFROM_TYPE_ARG2 "void *") +SET (RECVFROM_TYPE_ARG4 int) +SET (RECVFROM_TYPE_ARG5 "struct sockaddr *") +SET (RECV_TYPE_ARG2 "void *") +SET (RECV_TYPE_ARG4 int) +SET (GETNAMEINFO_TYPE_ARG1 "struct sockaddr *") +SET (GETNAMEINFO_TYPE_ARG7 int) +SET (SEND_TYPE_ARG2 "void *") +SET (SEND_TYPE_ARG4 int) +################################################################################ + + +# HAVE_CXX11 ?? +# HAVE_SIG_ATOMIC_T_VOLATILE ?? + + +# Set a few variables by hand that C-Ares wants, logically, based on detection +# data. + +IF (${HAVE_SOCKLEN_T}) + Set (CARES_TYPEOF_ARES_SOCKLEN_T "socklen_t") +ELSE () + Set (CARES_TYPEOF_ARES_SOCKLEN_T "int") +ENDIF () + +IF ("${HAVE_FCNTL}" AND "${HAVE_O_NONBLOCK}") + SET (HAVE_FCNTL_O_NONBLOCK 1) +ENDIF () + +IF ("${HAVE_IOCTL}" AND "${HAVE_FIONBIO}") + SET (HAVE_IOCTL_FIONBIO 1) +ENDIF () + +IF ("${HAVE_IOCTLSOCKET}" AND "${HAVE_FIONBIO}") + SET (HAVE_IOCTLSOCKET_FIONBIO 1) +ENDIF () + +IF ("${HAVE_IOCTLSOCKET_CAMEL}" AND "${HAVE_FIONBIO}") + SET (HAVE_IOCTLSOCKET_CAMEL_FIONBIO 1) +ENDIF () + +IF (${HAVE_GETADDRINFO}) + IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR + CMAKE_SYSTEM_NAME STREQUAL "HPUX" OR + CMAKE_SYSTEM_NAME STREQUAL "NetBSD" OR + CMAKE_SYSTEM_NAME STREQUAL "SunOS" OR + CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR + CMAKE_SYSTEM_NAME STREQUAL "AIX" OR + WIN32) + SET (HAVE_GETADDRINFO_THREADSAFE 1) + ENDIF () +ENDIF () + +IF ("${HAVE_TIME_H}" AND "${HAVE_SYS_TIME_H}") + SET (TIME_WITH_SYS_TIME 1) +ENDIF () + +IF (${HAVE_GETSERVBYPORT_R}) + # TODO : Should probably autodetect + IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS") + SET (GETSERVBYPORT_R_ARGS 5) + ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX") + SET (GETSERVBYPORT_R_ARGS 4) + ELSE () + # Probably linux + SET (GETSERVBYPORT_R_ARGS 6) + ENDIF () +ENDIF () + +# Set some aliases used for ares_build.h +IF (${HAVE_SYS_TYPES_H}) + SET (CARES_HAVE_SYS_TYPES_H 1) +ENDIF () +IF (${HAVE_SYS_SOCKET_H}) + SET (CARES_HAVE_SYS_SOCKET_H 1) +ENDIF() +IF (${HAVE_WS2TCPIP_H}) + SET (CARES_HAVE_WS2TCPIP_H 1) +ENDIF() +IF (${HAVE_WINSOCK2_H}) + SET (CARES_HAVE_WINSOCK2_H 1) +ENDIF() +IF (${HAVE_WINDOWS_H}) + SET (CARES_HAVE_WINDOWS_H 1) +ENDIF() + +# Write ares_build.h configuration file. This is an installed file. +CONFIGURE_FILE (ares_build.h.cmake ${PROJECT_BINARY_DIR}/ares_build.h) + +# Write ares_config.h configuration file. This is used only for the build. +CONFIGURE_FILE (ares_config.h.cmake ${PROJECT_BINARY_DIR}/ares_config.h) + + +INCLUDE_DIRECTORIES ( + ${CARES_INCLUDE_DIRS} +) + +# Source files. +SET (CARES_SOURCES + ares__close_sockets.c + ares__get_hostent.c + ares__read_line.c + ares__timeval.c + ares_cancel.c + ares_data.c + ares_destroy.c + ares_expand_name.c + ares_expand_string.c + ares_fds.c + ares_free_hostent.c + ares_free_string.c + ares_getenv.c + ares_gethostbyaddr.c + ares_gethostbyname.c + ares_getnameinfo.c + ares_getsock.c + ares_init.c + ares_library_init.c + ares_llist.c + ares_mkquery.c + ares_create_query.c + ares_nowarn.c + ares_options.c + ares_parse_a_reply.c + ares_parse_aaaa_reply.c + ares_parse_mx_reply.c + ares_parse_naptr_reply.c + ares_parse_ns_reply.c + ares_parse_ptr_reply.c + ares_parse_soa_reply.c + ares_parse_srv_reply.c + ares_parse_txt_reply.c + ares_platform.c + ares_process.c + ares_query.c + ares_search.c + ares_send.c + ares_strcasecmp.c + ares_strdup.c + ares_strerror.c + ares_timeout.c + ares_version.c + ares_writev.c + bitncmp.c + inet_net_pton.c + inet_ntop.c + windows_port.c +) + +# Build the dynamic/shared library +IF (${CARES_SHARED}) + ADD_LIBRARY (${PROJECT_NAME} SHARED ${CARES_SOURCES}) + SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_BUILDING_LIBRARY") + SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES SOVERSION 3.0.1) + TARGET_LINK_LIBRARIES (${PROJECT_NAME} ${CARES_DEPENDENT_LIBS}) + IF (${CARES_INSTALL}) + INSTALL (TARGETS ${PROJECT_NAME} DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) + ENDIF () + + # Set a static suffix if building both shared and static libs + SET (STATIC_SUFFIX "_static") +ENDIF () + +# Build the static library +IF (${CARES_STATIC}) + ADD_LIBRARY (${PROJECT_NAME}${STATIC_SUFFIX} STATIC ${CARES_SOURCES}) + SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_STATICLIB" OUTPUT_NAME ${PROJECT_NAME}) + SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES SOVERSION 3.0.1) + IF (${CARES_STATIC_PIC}) + SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES POSITION_INDEPENDENT_CODE True) + ENDIF () + TARGET_LINK_LIBRARIES (${PROJECT_NAME}${STATIC_SUFFIX} ${CARES_DEPENDENT_LIBS}) + IF (${CARES_INSTALL}) + INSTALL (TARGETS ${PROJECT_NAME}${STATIC_SUFFIX} DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) + ENDIF () +ENDIF () + + +# Headers installation target +IF (${CARES_INSTALL}) + SET (CARES_HEADERS ares.h ares_version.h ares_dns.h "${PROJECT_BINARY_DIR}/ares_build.h" ares_rules.h) + INSTALL (FILES ${CARES_HEADERS} DESTINATION ${CARES_INSTALL_LOCATION_HEADERS}) +ENDIF () + + +# Common sources for all examples +SET (CARES_EXAMPLE_SOURCES + ares_getopt.c + ares_nowarn.c + ares_strcasecmp.c +) + +# Build ahost +ADD_EXECUTABLE (ahost ahost.c ${CARES_EXAMPLE_SOURCES}) +SET_TARGET_PROPERTIES(ahost PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 ${CARES_DEFINITIONS}") +TARGET_LINK_LIBRARIES (ahost ${CARES_LIBRARIES} ${CARES_DEPENDENT_LIBS}) +IF (${CARES_INSTALL}) + INSTALL (TARGETS ahost RUNTIME DESTINATION ${CARES_INSTALL_LOCATION_BIN}) +ENDIF () + + +# Build adig +ADD_EXECUTABLE (adig adig.c ${CARES_EXAMPLE_SOURCES}) +SET_TARGET_PROPERTIES(adig PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 ${CARES_DEFINITIONS}") +TARGET_LINK_LIBRARIES (adig ${CARES_LIBRARIES} ${CARES_DEPENDENT_LIBS}) +IF (${CARES_INSTALL}) + INSTALL (TARGETS adig RUNTIME DESTINATION ${CARES_INSTALL_LOCATION_BIN}) +ENDIF () + + +# Build acountry +ADD_EXECUTABLE (acountry acountry.c ${CARES_EXAMPLE_SOURCES}) +SET_TARGET_PROPERTIES(acountry PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 ${CARES_DEFINITIONS}") +TARGET_LINK_LIBRARIES (acountry ${CARES_LIBRARIES} ${CARES_DEPENDENT_LIBS}) +IF (${CARES_INSTALL}) + INSTALL (TARGETS acountry RUNTIME DESTINATION ${CARES_INSTALL_LOCATION_BIN}) +ENDIF () diff --git a/ares_build.h.cmake b/ares_build.h.cmake new file mode 100644 index 00000000..e1e746dd --- /dev/null +++ b/ares_build.h.cmake @@ -0,0 +1,39 @@ +#ifndef __CARES_BUILD_H +#define __CARES_BUILD_H + +#define CARES_TYPEOF_ARES_SOCKLEN_T @CARES_TYPEOF_ARES_SOCKLEN_T@ + +/* Prefix names with CARES_ to make sure they don't conflict with other config.h + * files. We need to include some dependent headers that may be system specific + * for C-Ares */ +#cmakedefine CARES_HAVE_SYS_TYPES_H +#cmakedefine CARES_HAVE_SYS_SOCKET_H +#cmakedefine CARES_HAVE_WINDOWS_H +#cmakedefine CARES_HAVE_WS2TCPIP_H +#cmakedefine CARES_HAVE_WINSOCK2_H +#cmakedefine CARES_HAVE_WINDOWS_H + +#ifdef CARES_HAVE_SYS_TYPES_H +# include +#endif + +#ifdef CARES_HAVE_SYS_SOCKET_H +# include +#endif + +#ifdef CARES_HAVE_WINSOCK2_H +# include +#endif + +#ifdef CARES_HAVE_WS2TCPIP_H +# include +#endif + +#ifdef CARES_HAVE_WINDOWS_H +# include +#endif + + +typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t; + +#endif /* __CARES_BUILD_H */ diff --git a/ares_config.h.cmake b/ares_config.h.cmake new file mode 100644 index 00000000..acbef810 --- /dev/null +++ b/ares_config.h.cmake @@ -0,0 +1,433 @@ +/* Generated from ares_config.h.cmake*/ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* define this if ares is built for a big endian system */ +#undef ARES_BIG_ENDIAN + +/* when building as static part of libcurl */ +#undef BUILDING_LIBCURL + +/* Defined for build that exposes internal static functions for testing. */ +#undef CARES_EXPOSE_STATICS + +/* Defined for build with symbol hiding. */ +#undef CARES_SYMBOL_HIDING + +/* Definition to make a library symbol externally visible. */ +#undef CARES_SYMBOL_SCOPE_EXTERN + +/* Use resolver library to configure cares */ +#cmakedefine CARES_USE_LIBRESOLV + +/* if a /etc/inet dir is being used */ +#undef ETC_INET + +/* Define to the type of arg 2 for gethostname. */ +#define GETHOSTNAME_TYPE_ARG2 @GETHOSTNAME_TYPE_ARG2@ + +/* Define to the type qualifier of arg 1 for getnameinfo. */ +#define GETNAMEINFO_QUAL_ARG1 @GETNAMEINFO_QUAL_ARG1@ + +/* Define to the type of arg 1 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG1 @GETNAMEINFO_TYPE_ARG1@ + +/* Define to the type of arg 2 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG2 @GETNAMEINFO_TYPE_ARG2@ + +/* Define to the type of args 4 and 6 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG46 @GETNAMEINFO_TYPE_ARG46@ + +/* Define to the type of arg 7 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG7 @GETNAMEINFO_TYPE_ARG7@ + +/* Specifies the number of arguments to getservbyport_r */ +#define GETSERVBYPORT_R_ARGS @GETSERVBYPORT_R_ARGS@ + +/* Define to 1 if you have AF_INET6. */ +#cmakedefine HAVE_AF_INET6 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ARPA_INET_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ARPA_NAMESER_COMPAT_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ARPA_NAMESER_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ASSERT_H + +/* Define to 1 if you have the `bitncmp' function. */ +#cmakedefine HAVE_BITNCMP + +/* Define to 1 if bool is an available type. */ +#cmakedefine HAVE_BOOL_T + +/* Define to 1 if you have the clock_gettime function and monotonic timer. */ +#cmakedefine HAVE_CLOCK_GETTIME_MONOTONIC + +/* Define to 1 if you have the closesocket function. */ +#cmakedefine HAVE_CLOSESOCKET + +/* Define to 1 if you have the CloseSocket camel case function. */ +#cmakedefine HAVE_CLOSESOCKET_CAMEL + +/* Define to 1 if you have the connect function. */ +#cmakedefine HAVE_CONNECT + +/* define if the compiler supports basic C++11 syntax */ +#cmakedefine HAVE_CXX11 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ERRNO_H + +/* Define to 1 if you have the fcntl function. */ +#cmakedefine HAVE_FCNTL + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_FCNTL_H + +/* Define to 1 if you have a working fcntl O_NONBLOCK function. */ +#cmakedefine HAVE_FCNTL_O_NONBLOCK + +/* Define to 1 if you have the freeaddrinfo function. */ +#cmakedefine HAVE_FREEADDRINFO + +/* Define to 1 if you have a working getaddrinfo function. */ +#cmakedefine HAVE_GETADDRINFO + +/* Define to 1 if the getaddrinfo function is threadsafe. */ +#cmakedefine HAVE_GETADDRINFO_THREADSAFE + +/* Define to 1 if you have the getenv function. */ +#cmakedefine HAVE_GETENV + +/* Define to 1 if you have the gethostbyaddr function. */ +#cmakedefine HAVE_GETHOSTBYADDR + +/* Define to 1 if you have the gethostbyname function. */ +#cmakedefine HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the gethostname function. */ +#cmakedefine HAVE_GETHOSTNAME + +/* Define to 1 if you have the getnameinfo function. */ +#cmakedefine HAVE_GETNAMEINFO + +/* Define to 1 if you have the getservbyport_r function. */ +#cmakedefine HAVE_GETSERVBYPORT_R + +/* Define to 1 if you have the `gettimeofday' function. */ +#cmakedefine HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `if_indextoname' function. */ +#cmakedefine HAVE_IF_INDEXTONAME + +/* Define to 1 if you have a IPv6 capable working inet_net_pton function. */ +#cmakedefine HAVE_INET_NET_PTON + +/* Define to 1 if you have a IPv6 capable working inet_ntop function. */ +#cmakedefine HAVE_INET_NTOP + +/* Define to 1 if you have a IPv6 capable working inet_pton function. */ +#cmakedefine HAVE_INET_PTON + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_INTTYPES_H + +/* Define to 1 if you have the ioctl function. */ +#cmakedefine HAVE_IOCTL + +/* Define to 1 if you have the ioctlsocket function. */ +#cmakedefine HAVE_IOCTLSOCKET + +/* Define to 1 if you have the IoctlSocket camel case function. */ +#cmakedefine HAVE_IOCTLSOCKET_CAMEL + +/* Define to 1 if you have a working IoctlSocket camel case FIONBIO function. + */ +#cmakedefine HAVE_IOCTLSOCKET_CAMEL_FIONBIO + +/* Define to 1 if you have a working ioctlsocket FIONBIO function. */ +#cmakedefine HAVE_IOCTLSOCKET_FIONBIO + +/* Define to 1 if you have a working ioctl FIONBIO function. */ +#cmakedefine HAVE_IOCTL_FIONBIO + +/* Define to 1 if you have a working ioctl SIOCGIFADDR function. */ +#cmakedefine HAVE_IOCTL_SIOCGIFADDR + +/* Define to 1 if you have the `resolve' library (-lresolve). */ +#cmakedefine HAVE_LIBRESOLV + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LIMITS_H + +/* if your compiler supports LL */ +#cmakedefine HAVE_LL + +/* Define to 1 if the compiler supports the 'long long' data type. */ +#cmakedefine HAVE_LONGLONG + +/* Define to 1 if you have the malloc.h header file. */ +#cmakedefine HAVE_MALLOC_H + +/* Define to 1 if you have the memory.h header file. */ +#cmakedefine HAVE_MEMORY_H + +/* Define to 1 if you have the MSG_NOSIGNAL flag. */ +#cmakedefine HAVE_MSG_NOSIGNAL + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETINET_IN_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETINET_TCP_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NET_IF_H + +/* Define to 1 if you have PF_INET6. */ +#cmakedefine HAVE_PF_INET6 + +/* Define to 1 if you have the recv function. */ +#cmakedefine HAVE_RECV + +/* Define to 1 if you have the recvfrom function. */ +#cmakedefine HAVE_RECVFROM + +/* Define to 1 if you have the send function. */ +#cmakedefine HAVE_SEND + +/* Define to 1 if you have the setsockopt function. */ +#cmakedefine HAVE_SETSOCKOPT + +/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */ +#cmakedefine HAVE_SETSOCKOPT_SO_NONBLOCK + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SIGNAL_H + +/* Define to 1 if sig_atomic_t is an available typedef. */ +#cmakedefine HAVE_SIG_ATOMIC_T + +/* Define to 1 if sig_atomic_t is already defined as volatile. */ +#cmakedefine HAVE_SIG_ATOMIC_T_VOLATILE + +/* Define to 1 if your struct sockaddr_in6 has sin6_scope_id. */ +#cmakedefine HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID + +/* Define to 1 if you have the socket function. */ +#cmakedefine HAVE_SOCKET + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SOCKET_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDLIB_H + +/* Define to 1 if you have the strcasecmp function. */ +#cmakedefine HAVE_STRCASECMP + +/* Define to 1 if you have the strcmpi function. */ +#cmakedefine HAVE_STRCMPI + +/* Define to 1 if you have the strdup function. */ +#cmakedefine HAVE_STRDUP + +/* Define to 1 if you have the stricmp function. */ +#cmakedefine HAVE_STRICMP + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRING_H + +/* Define to 1 if you have the strncasecmp function. */ +#cmakedefine HAVE_STRNCASECMP + +/* Define to 1 if you have the strncmpi function. */ +#cmakedefine HAVE_STRNCMPI + +/* Define to 1 if you have the strnicmp function. */ +#cmakedefine HAVE_STRNICMP + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STROPTS_H + +/* Define to 1 if you have struct addrinfo. */ +#cmakedefine HAVE_STRUCT_ADDRINFO + +/* Define to 1 if you have struct in6_addr. */ +#cmakedefine HAVE_STRUCT_IN6_ADDR + +/* Define to 1 if you have struct sockaddr_in6. */ +#cmakedefine HAVE_STRUCT_SOCKADDR_IN6 + +/* if struct sockaddr_storage is defined */ +#cmakedefine HAVE_STRUCT_SOCKADDR_STORAGE + +/* Define to 1 if you have the timeval struct. */ +#cmakedefine HAVE_STRUCT_TIMEVAL + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_UIO_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_TIME_H + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_UNISTD_H + +/* Define to 1 if you have the windows.h header file. */ +#cmakedefine HAVE_WINDOWS_H + +/* Define to 1 if you have the winsock2.h header file. */ +#cmakedefine HAVE_WINSOCK2_H + +/* Define to 1 if you have the winsock.h header file. */ +#cmakedefine HAVE_WINSOCK_H + +/* Define to 1 if you have the writev function. */ +#cmakedefine HAVE_WRITEV + +/* Define to 1 if you have the ws2tcpip.h header file. */ +#cmakedefine HAVE_WS2TCPIP_H + +/* Define to 1 if you need the malloc.h header file even with stdlib.h */ +#cmakedefine NEED_MALLOC_H + +/* Define to 1 if you need the memory.h header file even with stdlib.h */ +#cmakedefine NEED_MEMORY_H + +/* a suitable file/device to read random data from */ +#cmakedefine RANDOM_FILE + +/* Define to the type qualifier pointed by arg 5 for recvfrom. */ +#define RECVFROM_QUAL_ARG5 @RECVFROM_QUAL_ARG5@ + +/* Define to the type of arg 1 for recvfrom. */ +#define RECVFROM_TYPE_ARG1 @RECVFROM_TYPE_ARG1@ + +/* Define to the type pointed by arg 2 for recvfrom. */ +#define RECVFROM_TYPE_ARG2 @RECVFROM_TYPE_ARG2@ + +/* Define to 1 if the type pointed by arg 2 for recvfrom is void. */ +#cmakedefine01 RECVFROM_TYPE_ARG2_IS_VOID + +/* Define to the type of arg 3 for recvfrom. */ +#define RECVFROM_TYPE_ARG3 @RECVFROM_TYPE_ARG3@ + +/* Define to the type of arg 4 for recvfrom. */ +#define RECVFROM_TYPE_ARG4 @RECVFROM_TYPE_ARG4@ + +/* Define to the type pointed by arg 5 for recvfrom. */ +#define RECVFROM_TYPE_ARG5 @RECVFROM_TYPE_ARG5@ + +/* Define to 1 if the type pointed by arg 5 for recvfrom is void. */ +#cmakedefine01 RECVFROM_TYPE_ARG5_IS_VOID + +/* Define to the type pointed by arg 6 for recvfrom. */ +#define RECVFROM_TYPE_ARG6 @RECVFROM_TYPE_ARG6@ + +/* Define to 1 if the type pointed by arg 6 for recvfrom is void. */ +#cmakedefine01 RECVFROM_TYPE_ARG6_IS_VOID + +/* Define to the function return type for recvfrom. */ +#define RECVFROM_TYPE_RETV @RECVFROM_TYPE_RETV@ + +/* Define to the type of arg 1 for recv. */ +#define RECV_TYPE_ARG1 @RECV_TYPE_ARG1@ + +/* Define to the type of arg 2 for recv. */ +#define RECV_TYPE_ARG2 @RECV_TYPE_ARG2@ + +/* Define to the type of arg 3 for recv. */ +#define RECV_TYPE_ARG3 @RECV_TYPE_ARG3@ + +/* Define to the type of arg 4 for recv. */ +#define RECV_TYPE_ARG4 @RECV_TYPE_ARG4@ + +/* Define to the function return type for recv. */ +#define RECV_TYPE_RETV @RECV_TYPE_RETV@ + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE @RETSIGTYPE@ + +/* Define to the type qualifier of arg 2 for send. */ +#define SEND_QUAL_ARG2 @SEND_QUAL_ARG2@ + +/* Define to the type of arg 1 for send. */ +#define SEND_TYPE_ARG1 @SEND_TYPE_ARG1@ + +/* Define to the type of arg 2 for send. */ +#define SEND_TYPE_ARG2 @SEND_TYPE_ARG2@ + +/* Define to the type of arg 3 for send. */ +#define SEND_TYPE_ARG3 @SEND_TYPE_ARG3@ + +/* Define to the type of arg 4 for send. */ +#define SEND_TYPE_ARG4 @SEND_TYPE_ARG4@ + +/* Define to the function return type for send. */ +#define SEND_TYPE_RETV @SEND_TYPE_RETV@ + +/* Define to 1 if you can safely include both and . */ +#cmakedefine TIME_WITH_SYS_TIME + +/* Define to disable non-blocking sockets. */ +#undef USE_BLOCKING_SOCKETS + +/* Define to avoid automatic inclusion of winsock.h */ +#undef WIN32_LEAN_AND_MEAN + +/* Type to use in place of in_addr_t when system does not provide it. */ +#undef in_addr_t + +#cmakedefine HAVE_SSIZE_T + +/* Create our own ssize_t */ +#ifndef HAVE_SSIZE_T +# ifdef _WIN64 +typedef __int64 ssize_t; +# else +typedef long ssize_t; +# endif +#endif From 7518c26d8ec300f6a05143a0521baef75ebd8cb9 Mon Sep 17 00:00:00 2001 From: Brad House Date: Wed, 28 Sep 2016 12:18:01 -0400 Subject: [PATCH 02/11] XCode v8 introduced clock_gettime() for iOS v10. However, it is a weak symbol, which means when earlier iOS versions try to use clock_gettime() it results in a crash due to the missing symbol. Detect this condition and do not set HAVE_CLOCK_GETTIME_MONOTONIC. --- CMakeLists.txt | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0763545d..56298767 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,18 @@ return 0; } " IOS) + + CHECK_C_SOURCE_COMPILES (" + #include + #include + int main() { +#if TARGET_OS_IPHONE == 0 || __IPHONE_OS_VERSION_MIN_REQUIRED < 100000 +#error Not iOS v10 +#endif +return 0; + } + " + IOS_V10) ENDIF () IF (IOS AND HAVE_LIBRESOLV) @@ -236,7 +248,13 @@ CHECK_SYMBOL_EXISTS (SIOCGIFADDR "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_IOCTL_S CHECK_SYMBOL_EXISTS (MSG_NOSIGNAL "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_MSG_NOSIGNAL) CHECK_SYMBOL_EXISTS (PF_INET6 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PF_INET6) CHECK_SYMBOL_EXISTS (SO_NONBLOCK "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SO_NONBLOCK) -CHECK_SYMBOL_EXISTS (CLOCK_MONOTONIC "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOCK_GETTIME_MONOTONIC) + +# XCode v8 bug: iOS when targeting less than v10 will say clock_gettime exists, it is a weak +# symbol that only exists in iOS10 and will cause a crash at runtime when running on versions +# less than 10. Skip finding CLOCK_MONOTONIC on iOS target < 10. +IF ((NOT IOS) OR IOS_V10) + CHECK_SYMBOL_EXISTS (CLOCK_MONOTONIC "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOCK_GETTIME_MONOTONIC) +ENDIF () CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6" sin6_scope_id "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID LANGUAGE C) From 503d8712f2d7cc37f7356f420b3e210b23e06dea Mon Sep 17 00:00:00 2001 From: Brad House Date: Thu, 29 Sep 2016 06:51:41 -0400 Subject: [PATCH 03/11] CMake: Unify library versioning with the libtool methodology to make keeping library versions in sync easier with the autotools build system --- CMakeLists.txt | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 56298767..7a94f3ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,19 @@ INCLUDE (CheckLibraryExists) PROJECT (cares C) +# This is for libtool compatibility, and specified in a form that is easily +# translatable from libtool (even if the actual form doesn't make sense). +# For instance, in an autotools project, in Makefile.am there is a line that +# contains something like: +# -version-info 4:0:2 +# This breaks down into sections of current:revision:age +# This then generates a version of "(current-age).age.revision" with an +# interface version of "(current-age)" +# For example, a version of 4:0:2 would generate output such as: +# libname.so -> libname.so.2 +# libname.so.2 -> libname.so.2.2.0 +SET (CARES_LIB_VERSIONINFO "4:0:2") + OPTION (CARES_STATIC "Build as a static library" OFF) OPTION (CARES_SHARED "Build as a shared library" ON) @@ -523,7 +536,19 @@ SET (CARES_SOURCES IF (${CARES_SHARED}) ADD_LIBRARY (${PROJECT_NAME} SHARED ${CARES_SOURCES}) SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_BUILDING_LIBRARY") - SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES SOVERSION 3.0.1) + + # Convert CARES_LIB_VERSIONINFO libtool version format into VERSION and SOVERSION + # Convert from ":" separated into CMake list format using ";" + STRING (REPLACE ":" ";" CARES_LIB_VERSIONINFO ${CARES_LIB_VERSIONINFO}) + LIST (GET CARES_LIB_VERSIONINFO 0 CARES_LIB_VERSION_CURRENT) + LIST (GET CARES_LIB_VERSIONINFO 1 CARES_LIB_VERSION_REVISION) + LIST (GET CARES_LIB_VERSIONINFO 2 CARES_LIB_VERSION_AGE) + MATH (EXPR CARES_LIB_VERSION_MAJOR "${CARES_LIB_VERSION_CURRENT} - ${CARES_LIB_VERSION_AGE}") + SET (CARES_LIB_VERSION_MINOR "${CARES_LIB_VERSION_AGE}") + SET (CARES_LIB_VERSION_RELEASE "${CARES_LIB_VERSION_REVISION}") + SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES VERSION "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}") + SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES SOVERSION "${CARES_LIB_VERSION_MAJOR}") + TARGET_LINK_LIBRARIES (${PROJECT_NAME} ${CARES_DEPENDENT_LIBS}) IF (${CARES_INSTALL}) INSTALL (TARGETS ${PROJECT_NAME} DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) @@ -537,7 +562,6 @@ ENDIF () IF (${CARES_STATIC}) ADD_LIBRARY (${PROJECT_NAME}${STATIC_SUFFIX} STATIC ${CARES_SOURCES}) SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_STATICLIB" OUTPUT_NAME ${PROJECT_NAME}) - SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES SOVERSION 3.0.1) IF (${CARES_STATIC_PIC}) SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES POSITION_INDEPENDENT_CODE True) ENDIF () From bb764c88c6696145b419f47ff2c6741e62ea1f6a Mon Sep 17 00:00:00 2001 From: Brad House Date: Thu, 29 Sep 2016 22:18:38 -0400 Subject: [PATCH 04/11] cleanups as per @gjasny ... Use naked IF statements and use NOT DEFINED --- CMakeLists.txt | 68 +++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a94f3ea..f6a779d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,13 +37,13 @@ SET (PACKAGE_DIRECTORY ${PROJECT_BINARY_DIR}/package) # Install path helpers -IF ("${CARES_INSTALL_LOCATION_LIBS}" STREQUAL "") +IF (NOT DEFINED CARES_INSTALL_LOCATION_LIBS) SET (CARES_INSTALL_LOCATION_LIBS ${CMAKE_INSTALL_PREFIX}/lib CACHE INTERNAL "") ENDIF () -IF ("${CARES_INSTALL_LOCATION_HEADERS}" STREQUAL "") +IF (NOT DEFINED CARES_INSTALL_LOCATION_HEADERS) SET (CARES_INSTALL_LOCATION_HEADERS ${CMAKE_INSTALL_PREFIX}/include CACHE INTERNAL "") ENDIF () -IF ("${CARES_INSTALL_LOCATION_BIN}" STREQUAL "") +IF (NOT DEFINED CARES_INSTALL_LOCATION_BIN) SET (CARES_INSTALL_LOCATION_BIN ${CMAKE_INSTALL_PREFIX}/bin CACHE INTERNAL "") ENDIF () @@ -54,7 +54,7 @@ ENDIF () SET (CARES_FOUND 1 CACHE INTERNAL "CARES LIBRARY FOUND") SET (CARES_INCLUDE_DIRS "${PROJECT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "CARES INCLUDE DIRECTORIES") SET (CARES_LIBRARIES ${PROJECT_NAME} CACHE INTERNAL "CARES LIBRARIES") -IF (${CARES_STATIC} AND NOT ${CARES_SHARED}) +IF (CARES_STATIC AND NOT CARES_SHARED) SET (CARES_DEFINITIONS "-DCARES_STATICLIB" CACHE INTERNAL "CARES DEFINITIONS") ENDIF () @@ -97,7 +97,7 @@ ENDIF() CHECK_LIBRARY_EXISTS (nsl gethostbyname "" HAVE_LIBNSL) CHECK_LIBRARY_EXISTS (socket gethostbyname "" HAVE_LIBSOCKET) -IF (NOT ${HAVE_LIBSOCKET}) +IF (NOT HAVE_LIBSOCKET) CHECK_LIBRARY_EXISTS (socket socket "" HAVE_LIBSOCKET) ENDIF () CHECK_LIBRARY_EXISTS (rt clock_gettime "" HAVE_LIBRT) @@ -166,16 +166,16 @@ ADD_DEFINITIONS(${SYSFLAGS}) # Tell C-Ares about libraries to depend on -IF (${HAVE_LIBRESOLV}) +IF (HAVE_LIBRESOLV) LIST (APPEND CARES_DEPENDENT_LIBS resolv) ENDIF () -IF (${HAVE_LIBNSL}) +IF (HAVE_LIBNSL) LIST (APPEND CARES_DEPENDENT_LIBS nsl) ENDIF () -IF (${HAVE_LIBSOCKET}) +IF (HAVE_LIBSOCKET) LIST (APPEND CARES_DEPENDENT_LIBS socket) ENDIF () -IF (${HAVE_LIBRT}) +IF (HAVE_LIBRT) LIST (APPEND CARES_DEPENDENT_LIBS rt) ENDIF () IF (WIN32) @@ -345,7 +345,7 @@ SET (CMAKE_REQUIRED_LIBRARIES) # defaults. This should be much quicker and nearly as accurate ... and even # if not, it probably won't matter in the least. -IF ("${HAVE_SSIZE_T}" AND "${HAVE_SOCKLEN_T}") +IF (HAVE_SSIZE_T AND HAVE_SOCKLEN_T) # If we have ssize_t and socklen_t, the API is usually sane and uses ssize_t and size_t for lengths SET (RECVFROM_TYPE_RETV ssize_t) SET (RECVFROM_TYPE_ARG3 size_t) @@ -354,14 +354,14 @@ ELSE () SET (RECVFROM_TYPE_ARG3 int) ENDIF () -IF ("${HAVE_TYPE_SOCKET}") +IF (HAVE_TYPE_SOCKET) # If the SOCKET type is defined, it uses socket ... should be windows only SET (RECVFROM_TYPE_ARG1 SOCKET) ELSE () SET (RECVFROM_TYPE_ARG1 int) ENDIF() -IF ("${HAVE_SOCKLEN_T}") +IF (HAVE_SOCKLEN_T) # If we have socklen_t the APIs pretty much always actually use it SET (RECVFROM_TYPE_ARG6 "socklen_t *") SET (GETNAMEINFO_TYPE_ARG2 socklen_t) @@ -402,29 +402,29 @@ SET (SEND_TYPE_ARG4 int) # Set a few variables by hand that C-Ares wants, logically, based on detection # data. -IF (${HAVE_SOCKLEN_T}) +IF (HAVE_SOCKLEN_T) Set (CARES_TYPEOF_ARES_SOCKLEN_T "socklen_t") ELSE () Set (CARES_TYPEOF_ARES_SOCKLEN_T "int") ENDIF () -IF ("${HAVE_FCNTL}" AND "${HAVE_O_NONBLOCK}") +IF (HAVE_FCNTL AND HAVE_O_NONBLOCK) SET (HAVE_FCNTL_O_NONBLOCK 1) ENDIF () -IF ("${HAVE_IOCTL}" AND "${HAVE_FIONBIO}") +IF (HAVE_IOCTL AND HAVE_FIONBIO) SET (HAVE_IOCTL_FIONBIO 1) ENDIF () -IF ("${HAVE_IOCTLSOCKET}" AND "${HAVE_FIONBIO}") +IF (HAVE_IOCTLSOCKET AND HAVE_FIONBIO) SET (HAVE_IOCTLSOCKET_FIONBIO 1) ENDIF () -IF ("${HAVE_IOCTLSOCKET_CAMEL}" AND "${HAVE_FIONBIO}") +IF (HAVE_IOCTLSOCKET_CAMEL AND HAVE_FIONBIO) SET (HAVE_IOCTLSOCKET_CAMEL_FIONBIO 1) ENDIF () -IF (${HAVE_GETADDRINFO}) +IF (HAVE_GETADDRINFO) IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "HPUX" OR CMAKE_SYSTEM_NAME STREQUAL "NetBSD" OR @@ -436,11 +436,11 @@ IF (${HAVE_GETADDRINFO}) ENDIF () ENDIF () -IF ("${HAVE_TIME_H}" AND "${HAVE_SYS_TIME_H}") +IF (HAVE_TIME_H AND HAVE_SYS_TIME_H) SET (TIME_WITH_SYS_TIME 1) ENDIF () -IF (${HAVE_GETSERVBYPORT_R}) +IF (HAVE_GETSERVBYPORT_R) # TODO : Should probably autodetect IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS") SET (GETSERVBYPORT_R_ARGS 5) @@ -453,19 +453,19 @@ IF (${HAVE_GETSERVBYPORT_R}) ENDIF () # Set some aliases used for ares_build.h -IF (${HAVE_SYS_TYPES_H}) +IF (HAVE_SYS_TYPES_H) SET (CARES_HAVE_SYS_TYPES_H 1) ENDIF () -IF (${HAVE_SYS_SOCKET_H}) +IF (HAVE_SYS_SOCKET_H) SET (CARES_HAVE_SYS_SOCKET_H 1) ENDIF() -IF (${HAVE_WS2TCPIP_H}) +IF (HAVE_WS2TCPIP_H) SET (CARES_HAVE_WS2TCPIP_H 1) ENDIF() -IF (${HAVE_WINSOCK2_H}) +IF (HAVE_WINSOCK2_H) SET (CARES_HAVE_WINSOCK2_H 1) ENDIF() -IF (${HAVE_WINDOWS_H}) +IF (HAVE_WINDOWS_H) SET (CARES_HAVE_WINDOWS_H 1) ENDIF() @@ -533,7 +533,7 @@ SET (CARES_SOURCES ) # Build the dynamic/shared library -IF (${CARES_SHARED}) +IF (CARES_SHARED) ADD_LIBRARY (${PROJECT_NAME} SHARED ${CARES_SOURCES}) SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_BUILDING_LIBRARY") @@ -550,7 +550,7 @@ IF (${CARES_SHARED}) SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES SOVERSION "${CARES_LIB_VERSION_MAJOR}") TARGET_LINK_LIBRARIES (${PROJECT_NAME} ${CARES_DEPENDENT_LIBS}) - IF (${CARES_INSTALL}) + IF (CARES_INSTALL) INSTALL (TARGETS ${PROJECT_NAME} DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) ENDIF () @@ -559,21 +559,21 @@ IF (${CARES_SHARED}) ENDIF () # Build the static library -IF (${CARES_STATIC}) +IF (CARES_STATIC) ADD_LIBRARY (${PROJECT_NAME}${STATIC_SUFFIX} STATIC ${CARES_SOURCES}) SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_STATICLIB" OUTPUT_NAME ${PROJECT_NAME}) - IF (${CARES_STATIC_PIC}) + IF (CARES_STATIC_PIC) SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES POSITION_INDEPENDENT_CODE True) ENDIF () TARGET_LINK_LIBRARIES (${PROJECT_NAME}${STATIC_SUFFIX} ${CARES_DEPENDENT_LIBS}) - IF (${CARES_INSTALL}) + IF (CARES_INSTALL) INSTALL (TARGETS ${PROJECT_NAME}${STATIC_SUFFIX} DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) ENDIF () ENDIF () # Headers installation target -IF (${CARES_INSTALL}) +IF (CARES_INSTALL) SET (CARES_HEADERS ares.h ares_version.h ares_dns.h "${PROJECT_BINARY_DIR}/ares_build.h" ares_rules.h) INSTALL (FILES ${CARES_HEADERS} DESTINATION ${CARES_INSTALL_LOCATION_HEADERS}) ENDIF () @@ -590,7 +590,7 @@ SET (CARES_EXAMPLE_SOURCES ADD_EXECUTABLE (ahost ahost.c ${CARES_EXAMPLE_SOURCES}) SET_TARGET_PROPERTIES(ahost PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 ${CARES_DEFINITIONS}") TARGET_LINK_LIBRARIES (ahost ${CARES_LIBRARIES} ${CARES_DEPENDENT_LIBS}) -IF (${CARES_INSTALL}) +IF (CARES_INSTALL) INSTALL (TARGETS ahost RUNTIME DESTINATION ${CARES_INSTALL_LOCATION_BIN}) ENDIF () @@ -599,7 +599,7 @@ ENDIF () ADD_EXECUTABLE (adig adig.c ${CARES_EXAMPLE_SOURCES}) SET_TARGET_PROPERTIES(adig PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 ${CARES_DEFINITIONS}") TARGET_LINK_LIBRARIES (adig ${CARES_LIBRARIES} ${CARES_DEPENDENT_LIBS}) -IF (${CARES_INSTALL}) +IF (CARES_INSTALL) INSTALL (TARGETS adig RUNTIME DESTINATION ${CARES_INSTALL_LOCATION_BIN}) ENDIF () @@ -608,6 +608,6 @@ ENDIF () ADD_EXECUTABLE (acountry acountry.c ${CARES_EXAMPLE_SOURCES}) SET_TARGET_PROPERTIES(acountry PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 ${CARES_DEFINITIONS}") TARGET_LINK_LIBRARIES (acountry ${CARES_LIBRARIES} ${CARES_DEPENDENT_LIBS}) -IF (${CARES_INSTALL}) +IF (CARES_INSTALL) INSTALL (TARGETS acountry RUNTIME DESTINATION ${CARES_INSTALL_LOCATION_BIN}) ENDIF () From e46e59454c9e813822052d73e6c77efc731923e8 Mon Sep 17 00:00:00 2001 From: Brad House Date: Thu, 29 Sep 2016 22:22:28 -0400 Subject: [PATCH 05/11] merge fc7917e from @daviddrysdale ... travis build updates for cmake --- .travis.yml | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5836c407..0ff43c92 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,12 @@ matrix: - os: linux compiler: clang env: BUILD_TYPE=normal + - os: linux + compiler: gcc + env: BUILD_TYPE=cmake + - os: linux + compiler: clang + env: BUILD_TYPE=cmake - os: linux compiler: gcc env: BUILD_TYPE=coverage @@ -43,6 +49,9 @@ matrix: - os: osx compiler: clang env: BUILD_TYPE=normal + - os: osx + compiler: clang + env: BUILD_TYPE=cmake - os: osx compiler: clang language: objective-c @@ -103,9 +112,21 @@ before_script: export LDFLAGS=$IOSFLAGS fi script: - - ./buildconf && $SCAN_WRAP ./configure --disable-symbol-hiding --enable-expose-statics --enable-maintainer-mode --enable-debug $CONFIG_OPTS && $SCAN_WRAP make - | - if [ "$BUILD_TYPE" != "ios" -a "$BUILD_TYPE" != "analyse" ]; then + if [ "$BUILD_TYPE" != "cmake" ]; then + ./buildconf && $SCAN_WRAP ./configure --disable-symbol-hiding --enable-expose-statics --enable-maintainer-mode --enable-debug $CONFIG_OPTS && $SCAN_WRAP make + else + mkdir cmakebld + cd cmakebld + cmake -DCMAKE_BUILD_TYPE=DEBUG -DCARES_STATIC=ON -DCARES_STATIC_PIC=ON .. + make + ./bin/adig www.google.com + ./bin/acountry www.google.com + ./bin/ahost www.google.com + cd .. + fi + - | + if [ "$BUILD_TYPE" != "ios" -a "$BUILD_TYPE" != "analyse" -a "$BUILD_TYPE" != "cmake" ]; then $TEST_WRAP ./adig www.google.com $TEST_WRAP ./acountry www.google.com $TEST_WRAP ./ahost www.google.com From 096282df53ad187b9b2aa6ab088a5cc63ed0c660 Mon Sep 17 00:00:00 2001 From: Brad House Date: Sat, 1 Oct 2016 08:06:40 -0400 Subject: [PATCH 06/11] Import curl conversion of Makefile.inc to cmake form dynamically as per bdoetsch@ameritech.net to make maintaining multiple build systems easier --- CMakeLists.txt | 105 ++++++++++++++++++++----------------------------- 1 file changed, 42 insertions(+), 63 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f6a779d2..4514566e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -480,61 +480,47 @@ INCLUDE_DIRECTORIES ( ${CARES_INCLUDE_DIRS} ) -# Source files. -SET (CARES_SOURCES - ares__close_sockets.c - ares__get_hostent.c - ares__read_line.c - ares__timeval.c - ares_cancel.c - ares_data.c - ares_destroy.c - ares_expand_name.c - ares_expand_string.c - ares_fds.c - ares_free_hostent.c - ares_free_string.c - ares_getenv.c - ares_gethostbyaddr.c - ares_gethostbyname.c - ares_getnameinfo.c - ares_getsock.c - ares_init.c - ares_library_init.c - ares_llist.c - ares_mkquery.c - ares_create_query.c - ares_nowarn.c - ares_options.c - ares_parse_a_reply.c - ares_parse_aaaa_reply.c - ares_parse_mx_reply.c - ares_parse_naptr_reply.c - ares_parse_ns_reply.c - ares_parse_ptr_reply.c - ares_parse_soa_reply.c - ares_parse_srv_reply.c - ares_parse_txt_reply.c - ares_platform.c - ares_process.c - ares_query.c - ares_search.c - ares_send.c - ares_strcasecmp.c - ares_strdup.c - ares_strerror.c - ares_timeout.c - ares_version.c - ares_writev.c - bitncmp.c - inet_net_pton.c - inet_ntop.c - windows_port.c -) + +# TRANSFORM_MAKEFILE_INC +# +# This function consumes the "Makefile.inc" autotools file, and converts it into +# "Makefile.inc.cmake", a cmake include file; transforming this: +# +# CSOURCES = ares__close_sockets.c \ +# ares__get_hostent.c \ +# ares__read_line.c \ +# ... +# +# into this: +# +# SET (CSOURCES +# ares__close_sockets.c +# ares__get_hostent.c +# ares__read_line.c +# ... +function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE) + file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT) + string(REPLACE "$(top_srcdir)" "\${CMAKE_CURRENT_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + string(REPLACE "$(top_builddir)" "\${PROJECT_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + + string(REGEX REPLACE "\\\\\n" "ß!ß" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + string(REPLACE "ß!ß" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + + string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace $() with ${} + 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. + file(WRITE ${OUTPUT_FILE} ${MAKEFILE_INC_TEXT}) +endfunction() + +# run the function... +transform_makefile_inc("Makefile.inc" "${PROJECT_BINARY_DIR}/Makefile.inc.cmake") +include(${PROJECT_BINARY_DIR}/Makefile.inc.cmake) + + # Build the dynamic/shared library IF (CARES_SHARED) - ADD_LIBRARY (${PROJECT_NAME} SHARED ${CARES_SOURCES}) + ADD_LIBRARY (${PROJECT_NAME} SHARED ${CSOURCES}) SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_BUILDING_LIBRARY") # Convert CARES_LIB_VERSIONINFO libtool version format into VERSION and SOVERSION @@ -560,7 +546,7 @@ ENDIF () # Build the static library IF (CARES_STATIC) - ADD_LIBRARY (${PROJECT_NAME}${STATIC_SUFFIX} STATIC ${CARES_SOURCES}) + ADD_LIBRARY (${PROJECT_NAME}${STATIC_SUFFIX} STATIC ${CSOURCES}) SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_STATICLIB" OUTPUT_NAME ${PROJECT_NAME}) IF (CARES_STATIC_PIC) SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES POSITION_INDEPENDENT_CODE True) @@ -579,15 +565,8 @@ IF (CARES_INSTALL) ENDIF () -# Common sources for all examples -SET (CARES_EXAMPLE_SOURCES - ares_getopt.c - ares_nowarn.c - ares_strcasecmp.c -) - # Build ahost -ADD_EXECUTABLE (ahost ahost.c ${CARES_EXAMPLE_SOURCES}) +ADD_EXECUTABLE (ahost ahost.c ${SAMPLESOURCES}) SET_TARGET_PROPERTIES(ahost PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 ${CARES_DEFINITIONS}") TARGET_LINK_LIBRARIES (ahost ${CARES_LIBRARIES} ${CARES_DEPENDENT_LIBS}) IF (CARES_INSTALL) @@ -596,7 +575,7 @@ ENDIF () # Build adig -ADD_EXECUTABLE (adig adig.c ${CARES_EXAMPLE_SOURCES}) +ADD_EXECUTABLE (adig adig.c ${SAMPLESOURCES}) SET_TARGET_PROPERTIES(adig PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 ${CARES_DEFINITIONS}") TARGET_LINK_LIBRARIES (adig ${CARES_LIBRARIES} ${CARES_DEPENDENT_LIBS}) IF (CARES_INSTALL) @@ -605,7 +584,7 @@ ENDIF () # Build acountry -ADD_EXECUTABLE (acountry acountry.c ${CARES_EXAMPLE_SOURCES}) +ADD_EXECUTABLE (acountry acountry.c ${SAMPLESOURCES}) SET_TARGET_PROPERTIES(acountry PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 ${CARES_DEFINITIONS}") TARGET_LINK_LIBRARIES (acountry ${CARES_LIBRARIES} ${CARES_DEPENDENT_LIBS}) IF (CARES_INSTALL) From ec730cc1c932ca20f607734bf886db08fb4c6aec Mon Sep 17 00:00:00 2001 From: Brad House Date: Mon, 3 Oct 2016 07:25:25 -0400 Subject: [PATCH 07/11] use a project name of c-ares as per @gjasny --- CMakeLists.txt | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4514566e..a19ad33d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ INCLUDE (CheckCSourceCompiles) INCLUDE (CheckStructHasMember) INCLUDE (CheckLibraryExists) -PROJECT (cares C) +PROJECT (c-ares C) # This is for libtool compatibility, and specified in a form that is easily # translatable from libtool (even if the actual form doesn't make sense). @@ -53,7 +53,7 @@ ENDIF () # build paths rather than an already-installed version. SET (CARES_FOUND 1 CACHE INTERNAL "CARES LIBRARY FOUND") SET (CARES_INCLUDE_DIRS "${PROJECT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "CARES INCLUDE DIRECTORIES") -SET (CARES_LIBRARIES ${PROJECT_NAME} CACHE INTERNAL "CARES LIBRARIES") +SET (CARES_LIBRARIES cares CACHE INTERNAL "CARES LIBRARIES") IF (CARES_STATIC AND NOT CARES_SHARED) SET (CARES_DEFINITIONS "-DCARES_STATICLIB" CACHE INTERNAL "CARES DEFINITIONS") ENDIF () @@ -520,8 +520,8 @@ include(${PROJECT_BINARY_DIR}/Makefile.inc.cmake) # Build the dynamic/shared library IF (CARES_SHARED) - ADD_LIBRARY (${PROJECT_NAME} SHARED ${CSOURCES}) - SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_BUILDING_LIBRARY") + ADD_LIBRARY (cares SHARED ${CSOURCES}) + SET_TARGET_PROPERTIES (cares PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_BUILDING_LIBRARY") # Convert CARES_LIB_VERSIONINFO libtool version format into VERSION and SOVERSION # Convert from ":" separated into CMake list format using ";" @@ -532,28 +532,25 @@ IF (CARES_SHARED) MATH (EXPR CARES_LIB_VERSION_MAJOR "${CARES_LIB_VERSION_CURRENT} - ${CARES_LIB_VERSION_AGE}") SET (CARES_LIB_VERSION_MINOR "${CARES_LIB_VERSION_AGE}") SET (CARES_LIB_VERSION_RELEASE "${CARES_LIB_VERSION_REVISION}") - SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES VERSION "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}") - SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES SOVERSION "${CARES_LIB_VERSION_MAJOR}") + SET_TARGET_PROPERTIES (cares PROPERTIES VERSION "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}") + SET_TARGET_PROPERTIES (cares PROPERTIES SOVERSION "${CARES_LIB_VERSION_MAJOR}") - TARGET_LINK_LIBRARIES (${PROJECT_NAME} ${CARES_DEPENDENT_LIBS}) + TARGET_LINK_LIBRARIES (cares ${CARES_DEPENDENT_LIBS}) IF (CARES_INSTALL) - INSTALL (TARGETS ${PROJECT_NAME} DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) + INSTALL (TARGETS cares DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) ENDIF () - - # Set a static suffix if building both shared and static libs - SET (STATIC_SUFFIX "_static") ENDIF () # Build the static library IF (CARES_STATIC) - ADD_LIBRARY (${PROJECT_NAME}${STATIC_SUFFIX} STATIC ${CSOURCES}) - SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_STATICLIB" OUTPUT_NAME ${PROJECT_NAME}) + ADD_LIBRARY (cares-static STATIC ${CSOURCES}) + SET_TARGET_PROPERTIES (cares-static PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_STATICLIB" OUTPUT_NAME cares) IF (CARES_STATIC_PIC) - SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES POSITION_INDEPENDENT_CODE True) + SET_TARGET_PROPERTIES (cares-static PROPERTIES POSITION_INDEPENDENT_CODE True) ENDIF () - TARGET_LINK_LIBRARIES (${PROJECT_NAME}${STATIC_SUFFIX} ${CARES_DEPENDENT_LIBS}) + TARGET_LINK_LIBRARIES (cares-static ${CARES_DEPENDENT_LIBS}) IF (CARES_INSTALL) - INSTALL (TARGETS ${PROJECT_NAME}${STATIC_SUFFIX} DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) + INSTALL (TARGETS cares-static DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) ENDIF () ENDIF () From 6db065bc5423c318e14b4c51fcd4b8e9588cbc5d Mon Sep 17 00:00:00 2001 From: Brad House Date: Mon, 3 Oct 2016 07:26:47 -0400 Subject: [PATCH 08/11] PROJECT_SOURCE_DIR instead of CMAKE_CURRENT_SOURCE_DIR as per @gjasny --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a19ad33d..32a38398 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -500,7 +500,7 @@ INCLUDE_DIRECTORIES ( # ... function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE) file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT) - string(REPLACE "$(top_srcdir)" "\${CMAKE_CURRENT_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) + string(REPLACE "$(top_srcdir)" "\${PROJECT_SOURCE_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) string(REPLACE "$(top_builddir)" "\${PROJECT_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) string(REGEX REPLACE "\\\\\n" "ß!ß" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) From c41726b42a1fb5098f0a3d2433e864e3518b9a65 Mon Sep 17 00:00:00 2001 From: Brad House Date: Tue, 4 Oct 2016 17:34:52 -0400 Subject: [PATCH 09/11] Expand XCode clock_gettime fix to include MacOS 10.12, not just iOS10 --- CMakeLists.txt | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 32a38398..b4e8fb6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,6 +89,18 @@ return 0; } " IOS_V10) + + CHECK_C_SOURCE_COMPILES (" + #include + #include + int main() { +#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12 +#error Not MacOSX 10.12 or higher +#endif +return 0; + } + " + MACOS_V1012) ENDIF () IF (IOS AND HAVE_LIBRESOLV) @@ -262,10 +274,11 @@ CHECK_SYMBOL_EXISTS (MSG_NOSIGNAL "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_MSG_NOS CHECK_SYMBOL_EXISTS (PF_INET6 "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_PF_INET6) CHECK_SYMBOL_EXISTS (SO_NONBLOCK "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_SO_NONBLOCK) -# XCode v8 bug: iOS when targeting less than v10 will say clock_gettime exists, it is a weak -# symbol that only exists in iOS10 and will cause a crash at runtime when running on versions -# less than 10. Skip finding CLOCK_MONOTONIC on iOS target < 10. -IF ((NOT IOS) OR IOS_V10) +# XCode v8 bug: iOS when targeting less than v10, or MacOS when targeting less than v10.12 will +# say clock_gettime exists, it is a weak symbol that only exists in iOS10/MacOS10.12 and will +# cause a crash at runtime when running on older versions. Skip finding CLOCK_MONOTONIC on older +# OS's. +IF ((NOT APPLE) OR IOS_V10 OR MACOS_V1012) CHECK_SYMBOL_EXISTS (CLOCK_MONOTONIC "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOCK_GETTIME_MONOTONIC) ENDIF () From bc14ee76b9aa3b881799f72724af1fa1eee1dea5 Mon Sep 17 00:00:00 2001 From: Brad House Date: Tue, 4 Oct 2016 21:55:38 -0400 Subject: [PATCH 10/11] update MacOSX 10.12 detection --- CMakeLists.txt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b4e8fb6c..e8beef8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,11 +79,11 @@ return 0; IOS) CHECK_C_SOURCE_COMPILES (" - #include - #include +#include +#include int main() { #if TARGET_OS_IPHONE == 0 || __IPHONE_OS_VERSION_MIN_REQUIRED < 100000 -#error Not iOS v10 +# error Not iOS v10 #endif return 0; } @@ -91,11 +91,14 @@ return 0; IOS_V10) CHECK_C_SOURCE_COMPILES (" - #include - #include +#include +#include +#ifndef MAC_OS_X_VERSION_10_12 +# define MAC_OS_X_VERSION_10_12 101200 +#endif int main() { #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12 -#error Not MacOSX 10.12 or higher +# error Not MacOSX 10.12 or higher #endif return 0; } From 1d8077b285308498e0962eb5d9c4c1bd7bc1881a Mon Sep 17 00:00:00 2001 From: Brad House Date: Wed, 5 Oct 2016 09:22:10 -0400 Subject: [PATCH 11/11] suggested PROJECT_NAME change broke chain building as it needs the magic PROJECT_NAME set in the ADD_LIBRARY for matching. Fix to make both goals work --- CMakeLists.txt | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e8beef8b..b3aa87e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,7 +53,7 @@ ENDIF () # build paths rather than an already-installed version. SET (CARES_FOUND 1 CACHE INTERNAL "CARES LIBRARY FOUND") SET (CARES_INCLUDE_DIRS "${PROJECT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "CARES INCLUDE DIRECTORIES") -SET (CARES_LIBRARIES cares CACHE INTERNAL "CARES LIBRARIES") +SET (CARES_LIBRARIES ${PROJECT_NAME} CACHE INTERNAL "CARES LIBRARIES") IF (CARES_STATIC AND NOT CARES_SHARED) SET (CARES_DEFINITIONS "-DCARES_STATICLIB" CACHE INTERNAL "CARES DEFINITIONS") ENDIF () @@ -536,8 +536,8 @@ include(${PROJECT_BINARY_DIR}/Makefile.inc.cmake) # Build the dynamic/shared library IF (CARES_SHARED) - ADD_LIBRARY (cares SHARED ${CSOURCES}) - SET_TARGET_PROPERTIES (cares PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_BUILDING_LIBRARY") + ADD_LIBRARY (${PROJECT_NAME} SHARED ${CSOURCES}) + SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_BUILDING_LIBRARY" OUTPUT_NAME cares) # Convert CARES_LIB_VERSIONINFO libtool version format into VERSION and SOVERSION # Convert from ":" separated into CMake list format using ";" @@ -548,25 +548,26 @@ IF (CARES_SHARED) MATH (EXPR CARES_LIB_VERSION_MAJOR "${CARES_LIB_VERSION_CURRENT} - ${CARES_LIB_VERSION_AGE}") SET (CARES_LIB_VERSION_MINOR "${CARES_LIB_VERSION_AGE}") SET (CARES_LIB_VERSION_RELEASE "${CARES_LIB_VERSION_REVISION}") - SET_TARGET_PROPERTIES (cares PROPERTIES VERSION "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}") - SET_TARGET_PROPERTIES (cares PROPERTIES SOVERSION "${CARES_LIB_VERSION_MAJOR}") + SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES VERSION "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}") + SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES SOVERSION "${CARES_LIB_VERSION_MAJOR}") - TARGET_LINK_LIBRARIES (cares ${CARES_DEPENDENT_LIBS}) + TARGET_LINK_LIBRARIES (${PROJECT_NAME} ${CARES_DEPENDENT_LIBS}) IF (CARES_INSTALL) - INSTALL (TARGETS cares DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) + INSTALL (TARGETS ${PROJECT_NAME} DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) ENDIF () + SET (STATIC_SUFFIX "_static") ENDIF () # Build the static library IF (CARES_STATIC) - ADD_LIBRARY (cares-static STATIC ${CSOURCES}) - SET_TARGET_PROPERTIES (cares-static PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_STATICLIB" OUTPUT_NAME cares) + ADD_LIBRARY (${PROJECT_NAME}${STATIC_SUFFIX} STATIC ${CSOURCES}) + SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES COMPILE_FLAGS "-DHAVE_CONFIG_H=1 -DCARES_STATICLIB" OUTPUT_NAME cares) IF (CARES_STATIC_PIC) - SET_TARGET_PROPERTIES (cares-static PROPERTIES POSITION_INDEPENDENT_CODE True) + SET_TARGET_PROPERTIES (${PROJECT_NAME}${STATIC_SUFFIX} PROPERTIES POSITION_INDEPENDENT_CODE True) ENDIF () - TARGET_LINK_LIBRARIES (cares-static ${CARES_DEPENDENT_LIBS}) + TARGET_LINK_LIBRARIES (${PROJECT_NAME}${STATIC_SUFFIX} ${CARES_DEPENDENT_LIBS}) IF (CARES_INSTALL) - INSTALL (TARGETS cares-static DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) + INSTALL (TARGETS ${PROJECT_NAME}${STATIC_SUFFIX} DESTINATION ${CARES_INSTALL_LOCATION_LIBS}) ENDIF () ENDIF ()