11# Copyright (C) The c-ares project and its contributors
22# SPDX-License-Identifier: MIT
3- CMAKE_MINIMUM_REQUIRED (VERSION 3.1.0 )
3+ CMAKE_MINIMUM_REQUIRED (VERSION 3.5.0 )
4+
5+ list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR} /cmake/" )
46
57INCLUDE (CheckIncludeFiles )
68INCLUDE (CheckTypeSize )
@@ -10,10 +12,10 @@ INCLUDE (CheckCSourceCompiles)
1012INCLUDE (CheckStructHasMember )
1113INCLUDE (CheckLibraryExists )
1214
13- PROJECT (c-ares LANGUAGES C VERSION "1.20.1 " )
15+ PROJECT (c-ares LANGUAGES C VERSION "1.24.0 " )
1416
1517# Set this version before release
16- SET (CARES_VERSION "1.20.1 " )
18+ SET (CARES_VERSION "1.24.0 " )
1719
1820INCLUDE (GNUInstallDirs ) # include this *AFTER* PROJECT(), otherwise paths are wrong.
1921
@@ -28,26 +30,38 @@ INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are w
2830# For example, a version of 4:0:2 would generate output such as:
2931# libname.so -> libname.so.2
3032# libname.so.2 -> libname.so.2.2.0
31- SET (CARES_LIB_VERSIONINFO "9:1:7 " )
33+ SET (CARES_LIB_VERSIONINFO "12:0:10 " )
3234
3335
34- OPTION (CARES_STATIC "Build as a static library" OFF )
35- OPTION (CARES_SHARED "Build as a shared library" ON )
36- OPTION (CARES_INSTALL "Create installation targets (chain builders may want to disable this)" ON )
37- OPTION (CARES_STATIC_PIC "Build the static library as PIC (position independent)" OFF )
38- OPTION (CARES_BUILD_TESTS "Build and run tests" OFF )
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 )
3941OPTION (CARES_BUILD_CONTAINER_TESTS "Build and run container tests (implies CARES_BUILD_TESTS, Linux only)" OFF )
40- OPTION (CARES_BUILD_TOOLS "Build tools" ON )
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 )
4145SET (CARES_RANDOM_FILE "/dev/urandom" CACHE STRING "Suitable File / Device Path for entropy, such as /dev/urandom" )
4246
4347
48+ # Tests require a C++14 compiler
49+ IF (CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS)
50+ set (CMAKE_CXX_STANDARD 14)
51+ set (CMAKE_CXX_STANDARD_REQUIRED TRUE )
52+ set (CMAKE_CXX_EXTENSIONS FALSE )
53+ enable_language (CXX )
54+ ENDIF ()
55+
4456# Tests require static to be enabled on Windows to be able to access otherwise hidden symbols
45- IF (CARES_BUILD_TESTS AND (NOT CARES_STATIC) AND WIN32 )
57+ IF (( CARES_BUILD_TESTS OR CARES_BUILD_CONTAINER_TESTS) AND (NOT CARES_STATIC) AND WIN32 )
4658 SET (CARES_STATIC ON )
4759 SET (CARES_STATIC_PIC ON )
48- MESSAGE (WARNING "Static building was requested be disabled, but reenabled to support tests" )
60+ MESSAGE (WARNING "Static building was requested be disabled, but re-enabled to support tests" )
4961ENDIF ()
5062
63+ INCLUDE (EnableWarnings )
64+
5165# allow linking against the static runtime library in msvc
5266IF (MSVC )
5367 OPTION (CARES_MSVC_STATIC_RUNTIME "Link against the static runtime library" OFF )
@@ -70,6 +84,21 @@ IF (MSVC)
7084 ENDIF ()
7185ENDIF ()
7286
87+ IF (CARES_SYMBOL_HIDING)
88+ IF (CMAKE_VERSION VERSION_LESS 3.12)
89+ MESSAGE (FATAL_ERROR "Hiding symbols requires CMake 3.12" )
90+ ENDIF ()
91+ CMAKE_POLICY (SET CMP0063 NEW )
92+ SET (CARES_SYMBOL_SCOPE_EXTERN [=[ __attribute__ ((visibility("default")))]=] )
93+ CHECK_C_SOURCE_COMPILES ("
94+ ${CARES_SYMBOL_SCOPE_EXTERN} int somefunc() { return 0; }
95+ int main() { return somefunc(); }
96+ " HAVE_VISIBILITY_ATTRIBUTE )
97+ IF (NOT HAVE_VISIBILITY_ATTRIBUTE)
98+ MESSAGE (FATAL_ERROR "C compiler does not accept visibility attribute" )
99+ ENDIF ()
100+ ENDIF ()
101+
73102# Keep build organized.
74103SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR} /${CMAKE_INSTALL_BINDIR} " )
75104SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR} /${CMAKE_INSTALL_LIBDIR} " )
@@ -196,10 +225,10 @@ CHECK_INCLUDE_FILES (sys/select.h HAVE_SYS_SELECT_H)
196225CHECK_INCLUDE_FILES (sys/stat.h HAVE_SYS_STAT_H )
197226CHECK_INCLUDE_FILES (sys/time.h HAVE_SYS_TIME_H )
198227CHECK_INCLUDE_FILES (sys/uio.h HAVE_SYS_UIO_H )
228+ CHECK_INCLUDE_FILES (ifaddrs.h HAVE_IFADDRS_H )
199229CHECK_INCLUDE_FILES (time.h HAVE_TIME_H )
200230CHECK_INCLUDE_FILES (dlfcn.h HAVE_DLFCN_H )
201231CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H )
202-
203232# On OpenBSD, you must include sys/types.h before netinet/tcp.h
204233IF (HAVE_SYS_TYPES_H)
205234 CHECK_INCLUDE_FILES ("sys/types.h;netinet/tcp.h" HAVE_NETINET_TCP_H )
@@ -213,6 +242,8 @@ ENDIF ()
213242IF (WIN32 )
214243CHECK_INCLUDE_FILES ("winsock2.h;windows.h" HAVE_WINSOCK2_H )
215244CHECK_INCLUDE_FILES ("winsock2.h;ws2tcpip.h;windows.h" HAVE_WS2TCPIP_H )
245+ CHECK_INCLUDE_FILES ("winsock2.h;iphlpapi.h;windows.h" HAVE_IPHLPAPI_H )
246+ CHECK_INCLUDE_FILES ("winsock2.h;netioapi.h;windows.h" HAVE_NETIOAPI_H )
216247CHECK_INCLUDE_FILES ("winsock.h;windows.h" HAVE_WINSOCK_H )
217248CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H )
218249ENDIF ()
@@ -221,15 +252,15 @@ ENDIF ()
221252IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin" )
222253 LIST (APPEND SYSFLAGS -D_DARWIN_C_SOURCE)
223254ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "Linux" )
224- LIST (APPEND SYSFLAGS -D_GNU_SOURCE -D_POSIX_C_SOURCE=199309L -D_XOPEN_SOURCE=600 )
255+ LIST (APPEND SYSFLAGS -D_GNU_SOURCE -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 )
225256ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "SunOS" )
226- LIST (APPEND SYSFLAGS -D__EXTENSIONS__ -D_REENTRANT -D_XOPEN_SOURCE=600 )
257+ LIST (APPEND SYSFLAGS -D__EXTENSIONS__ -D_REENTRANT -D_XOPEN_SOURCE=700 )
227258ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX" )
228- LIST (APPEND SYSFLAGS -D_ALL_SOURCE -D_XOPEN_SOURCE=600 -D_USE_IRS)
259+ LIST (APPEND SYSFLAGS -D_ALL_SOURCE -D_XOPEN_SOURCE=700 -D_USE_IRS)
229260ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" )
230261 # Don't define _XOPEN_SOURCE on FreeBSD, it actually reduces visibility instead of increasing it
231262ELSEIF (WIN32 )
232- LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_WIN32_WINNT=0x0600 )
263+ LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_WIN32_WINNT=0x0602 )
233264ENDIF ()
234265ADD_DEFINITIONS (${SYSFLAGS} )
235266
@@ -277,6 +308,7 @@ CARES_EXTRAINCLUDE_IFSET (HAVE_ARPA_INET_H arpa/inet.h)
277308CARES_EXTRAINCLUDE_IFSET (HAVE_ARPA_NAMESER_H arpa/nameser.h )
278309CARES_EXTRAINCLUDE_IFSET (HAVE_NETDB_H netdb.h )
279310CARES_EXTRAINCLUDE_IFSET (HAVE_NET_IF_H net/if.h )
311+ CARES_EXTRAINCLUDE_IFSET (HAVE_IFADDRS_H ifaddrs.h )
280312CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_IN_H netinet/in.h )
281313CARES_EXTRAINCLUDE_IFSET (HAVE_NETINET_TCP_H netinet/tcp.h )
282314CARES_EXTRAINCLUDE_IFSET (HAVE_SIGNAL_H signal.h )
@@ -289,12 +321,14 @@ CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SELECT_H sys/select.h)
289321CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKET_H sys/socket.h )
290322CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_SOCKIO_H sys/sockio.h )
291323CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_TIME_H sys/time.h )
324+ CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_STAT_H sys/stat.h )
292325CARES_EXTRAINCLUDE_IFSET (HAVE_SYS_UIO_H sys/uio.h )
293326CARES_EXTRAINCLUDE_IFSET (HAVE_TIME_H time.h )
294327CARES_EXTRAINCLUDE_IFSET (HAVE_FCNTL_H fcntl.h )
295328CARES_EXTRAINCLUDE_IFSET (HAVE_UNISTD_H unistd.h )
296329CARES_EXTRAINCLUDE_IFSET (HAVE_WINSOCK2_H winsock2.h )
297330CARES_EXTRAINCLUDE_IFSET (HAVE_WS2TCPIP_H ws2tcpip.h )
331+ CARES_EXTRAINCLUDE_IFSET (HAVE_IPHLPAPI_H iphlpapi.h )
298332CARES_EXTRAINCLUDE_IFSET (HAVE_WINDOWS_H windows.h )
299333
300334# Check Types
@@ -374,6 +408,9 @@ CHECK_SYMBOL_EXISTS (getservbyport_r "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_GETSERV
374408CHECK_SYMBOL_EXISTS (getservbyname_r "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_GETSERVBYNAME_R )
375409CHECK_SYMBOL_EXISTS (gettimeofday "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_GETTIMEOFDAY )
376410CHECK_SYMBOL_EXISTS (if_indextoname "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_IF_INDEXTONAME )
411+ CHECK_SYMBOL_EXISTS (if_nametoindex "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_IF_NAMETOINDEX )
412+ CHECK_SYMBOL_EXISTS (ConvertInterfaceIndexToLuid "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_CONVERTINTERFACEINDEXTOLUID )
413+ CHECK_SYMBOL_EXISTS (ConvertInterfaceLuidToNameA "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_CONVERTINTERFACELUIDTONAMEA )
377414CHECK_SYMBOL_EXISTS (inet_net_pton "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_INET_NET_PTON )
378415IF (NOT WIN32 )
379416 # Disabled on Windows, because these functions are only really supported on Windows
@@ -399,7 +436,8 @@ CHECK_SYMBOL_EXISTS (strncmpi "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNCMP
399436CHECK_SYMBOL_EXISTS (strnicmp "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_STRNICMP )
400437CHECK_SYMBOL_EXISTS (writev "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_WRITEV )
401438CHECK_SYMBOL_EXISTS (arc4random_buf "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_ARC4RANDOM_BUF )
402-
439+ CHECK_SYMBOL_EXISTS (stat "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_STAT )
440+ CHECK_SYMBOL_EXISTS (getifaddrs "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_GETIFADDRS )
403441
404442# On Android, the system headers may define __system_property_get(), but excluded
405443# from libc. We need to perform a link test instead of a header/symbol test.
@@ -411,6 +449,43 @@ SET (CMAKE_REQUIRED_DEFINITIONS)
411449SET (CMAKE_REQUIRED_LIBRARIES)
412450
413451
452+ ################################################################################
453+ # Threading Support
454+ #
455+ IF (CARES_THREADS)
456+ IF (WIN32 )
457+ # Do nothing, always has threads
458+ ELSE ()
459+ # Need to prefer pthreads on platforms that may have more threading choices
460+ # (e.g. Solaris)
461+ SET (CMAKE_THREAD_PREFER_PTHREAD TRUE )
462+ FIND_PACKAGE (Threads )
463+
464+ IF (Threads_FOUND)
465+ # Fix solaris9 bug due to libc having pthread_create() stubs that always fail. CMake
466+ # doesn't realize that the real pthread functions aren't in libc, so sets the pthread
467+ # library CAKE_THREAD_LIBS_INIT variable to blank instead of to the correct "-lpthread".
468+ IF (CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND NOT CMAKE_THREAD_LIBS_INIT)
469+ SET (CMAKE_THREAD_LIBS_INIT "-lpthread" )
470+ ENDIF ()
471+
472+ # PThread functions.
473+ CHECK_INCLUDE_FILES (pthread.h HAVE_PTHREAD_H )
474+ CHECK_INCLUDE_FILES (pthread_np.h HAVE_PTHREAD_NP_H )
475+ CARES_EXTRAINCLUDE_IFSET (HAVE_PTHREAD_H pthread.h )
476+ CARES_EXTRAINCLUDE_IFSET (HAVE_PTHREAD_NP_H pthread_np.h )
477+ CHECK_SYMBOL_EXISTS (pthread_init "${CMAKE_EXTRA_INCLUDE_FILES} " HAVE_PTHREAD_INIT )
478+ # Make sure libcares.pc.cmake knows about thread libraries on static builds
479+ LIST (APPEND CARES_DEPENDENT_LIBS ${CMAKE_THREAD_LIBS_INIT} )
480+ ELSE ()
481+ MESSAGE (WARNING "Threading support not found, disabling..." )
482+ SET (CARES_THREADS OFF )
483+ ENDIF ()
484+ ENDIF ()
485+ ENDIF ()
486+
487+
488+
414489################################################################################
415490# recv, recvfrom, send, getnameinfo, gethostname
416491# ARGUMENTS AND RETURN VALUES
@@ -421,7 +496,7 @@ SET (CMAKE_REQUIRED_LIBRARIES)
421496# defaults. This should be much quicker and nearly as accurate ... and even
422497# if not, it probably won't matter in the least.
423498
424- IF (HAVE_SSIZE_T AND HAVE_SOCKLEN_T)
499+ IF (HAVE_SSIZE_T AND HAVE_SOCKLEN_T AND NOT WIN32 )
425500 # If we have ssize_t and socklen_t, the API is usually sane and uses ssize_t and size_t for lengths
426501 SET (RECVFROM_TYPE_RETV ssize_t)
427502 SET (RECVFROM_TYPE_ARG3 size_t)
0 commit comments