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