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