CMakeLists.txt 30 KB

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