CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. cmake_minimum_required(VERSION 3.1)
  2. set(REDIS_PLUS_PLUS_VERSION "1.3.3")
  3. message(STATUS "redis-plus-plus version: ${REDIS_PLUS_PLUS_VERSION}")
  4. project(redis++ LANGUAGES CXX VERSION ${REDIS_PLUS_PLUS_VERSION})
  5. set(REDIS_PLUS_PLUS_DEFAULT_BUILD_TYPE "Release")
  6. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  7. set(CMAKE_BUILD_TYPE ${REDIS_PLUS_PLUS_DEFAULT_BUILD_TYPE} CACHE STRING "Set build type" FORCE)
  8. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel")
  9. endif()
  10. message(STATUS "redis-plus-plus build type: ${CMAKE_BUILD_TYPE}")
  11. set(REDIS_PLUS_PLUS_DEFAULT_CXX_STANDARD 17)
  12. if(NOT REDIS_PLUS_PLUS_CXX_STANDARD)
  13. set(REDIS_PLUS_PLUS_CXX_STANDARD ${REDIS_PLUS_PLUS_DEFAULT_CXX_STANDARD} CACHE STRING "Set CXX standard" FORCE)
  14. set_property(CACHE REDIS_PLUS_PLUS_CXX_STANDARD PROPERTY STRINGS "11" "14" "17" "20")
  15. endif()
  16. message(STATUS "redis-plus-plus build with CXX standard: c++${REDIS_PLUS_PLUS_CXX_STANDARD}")
  17. if(NOT WIN32)
  18. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++${REDIS_PLUS_PLUS_CXX_STANDARD}")
  19. else()
  20. if(MSVC)
  21. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++${REDIS_PLUS_PLUS_CXX_STANDARD}")
  22. else()
  23. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++${REDIS_PLUS_PLUS_CXX_STANDARD}")
  24. endif()
  25. endif()
  26. if(REDIS_PLUS_PLUS_BUILD_ASYNC)
  27. if(REDIS_PLUS_PLUS_BUILD_ASYNC STREQUAL "libuv")
  28. message(STATUS "redis-plus-plus build async interface with libuv")
  29. # libuv dependency
  30. find_path(REDIS_PLUS_PLUS_ASYNC_LIB_HEADER NAMES uv.h)
  31. find_library(REDIS_PLUS_PLUS_ASYNC_LIB uv)
  32. else()
  33. message(FATAL_ERROR "invalid REDIS_PLUS_PLUS_BUILD_ASYNC")
  34. endif()
  35. endif()
  36. set(REDIS_PLUS_PLUS_SOURCE_DIR src/sw/redis++)
  37. set(REDIS_PLUS_PLUS_SOURCES
  38. "${REDIS_PLUS_PLUS_SOURCE_DIR}/command.cpp"
  39. "${REDIS_PLUS_PLUS_SOURCE_DIR}/command_options.cpp"
  40. "${REDIS_PLUS_PLUS_SOURCE_DIR}/connection.cpp"
  41. "${REDIS_PLUS_PLUS_SOURCE_DIR}/connection_pool.cpp"
  42. "${REDIS_PLUS_PLUS_SOURCE_DIR}/crc16.cpp"
  43. "${REDIS_PLUS_PLUS_SOURCE_DIR}/errors.cpp"
  44. "${REDIS_PLUS_PLUS_SOURCE_DIR}/pipeline.cpp"
  45. "${REDIS_PLUS_PLUS_SOURCE_DIR}/redis.cpp"
  46. "${REDIS_PLUS_PLUS_SOURCE_DIR}/redis_cluster.cpp"
  47. "${REDIS_PLUS_PLUS_SOURCE_DIR}/reply.cpp"
  48. "${REDIS_PLUS_PLUS_SOURCE_DIR}/sentinel.cpp"
  49. "${REDIS_PLUS_PLUS_SOURCE_DIR}/shards.cpp"
  50. "${REDIS_PLUS_PLUS_SOURCE_DIR}/shards_pool.cpp"
  51. "${REDIS_PLUS_PLUS_SOURCE_DIR}/subscriber.cpp"
  52. "${REDIS_PLUS_PLUS_SOURCE_DIR}/transaction.cpp"
  53. )
  54. if(REDIS_PLUS_PLUS_BUILD_ASYNC)
  55. list(APPEND REDIS_PLUS_PLUS_SOURCES
  56. "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_connection.cpp"
  57. "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_connection_pool.cpp"
  58. "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_redis.cpp"
  59. "${REDIS_PLUS_PLUS_SOURCE_DIR}/event_loop.cpp"
  60. "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_sentinel.cpp"
  61. "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_redis_cluster.cpp"
  62. "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_shards_pool.cpp"
  63. )
  64. if(NOT REDIS_PLUS_PLUS_ASYNC_FUTURE)
  65. set(REDIS_PLUS_PLUS_ASYNC_FUTURE "std")
  66. endif()
  67. if(REDIS_PLUS_PLUS_ASYNC_FUTURE STREQUAL "std")
  68. set(REDIS_PLUS_PLUS_ASYNC_FUTURE_HEADER "${REDIS_PLUS_PLUS_SOURCE_DIR}/future/std")
  69. elseif(REDIS_PLUS_PLUS_ASYNC_FUTURE STREQUAL "boost")
  70. set(REDIS_PLUS_PLUS_ASYNC_FUTURE_HEADER "${REDIS_PLUS_PLUS_SOURCE_DIR}/future/boost")
  71. find_package(Boost REQUIRED COMPONENTS system thread)
  72. else()
  73. message(FATAL_ERROR "invalid REDIS_PLUS_PLUS_ASYNC_FUTURE")
  74. endif()
  75. endif()
  76. # cxx utils
  77. if(REDIS_PLUS_PLUS_CXX_STANDARD LESS 17)
  78. set(CXX_UTILS_DIR "${REDIS_PLUS_PLUS_SOURCE_DIR}/cxx11")
  79. else()
  80. set(CXX_UTILS_DIR "${REDIS_PLUS_PLUS_SOURCE_DIR}/cxx17")
  81. endif()
  82. # TLS support
  83. option(REDIS_PLUS_PLUS_USE_TLS "Build with TLS support" OFF)
  84. message(STATUS "redis-plus-plus TLS support: ${REDIS_PLUS_PLUS_USE_TLS}")
  85. if(REDIS_PLUS_PLUS_USE_TLS)
  86. set(TLS_SUB_DIR "${REDIS_PLUS_PLUS_SOURCE_DIR}/tls")
  87. list(APPEND REDIS_PLUS_PLUS_SOURCES "${TLS_SUB_DIR}/tls.cpp")
  88. set(REDIS_PLUS_PLUS_DEPENDS "hiredis,hiredis_ssl")
  89. else()
  90. set(TLS_SUB_DIR "${REDIS_PLUS_PLUS_SOURCE_DIR}/no_tls")
  91. set(REDIS_PLUS_PLUS_DEPENDS "hiredis")
  92. endif()
  93. # hiredis dependency
  94. find_package(hiredis QUIET)
  95. if(hiredis_FOUND)
  96. list(APPEND REDIS_PLUS_PLUS_HIREDIS_LIBS hiredis::hiredis)
  97. if(REDIS_PLUS_PLUS_USE_TLS)
  98. find_package(hiredis_ssl REQUIRED)
  99. list(APPEND REDIS_PLUS_PLUS_HIREDIS_LIBS hiredis::hiredis_ssl)
  100. endif()
  101. else()
  102. find_path(HIREDIS_HEADER hiredis)
  103. find_library(HIREDIS_LIB hiredis)
  104. list(APPEND REDIS_PLUS_PLUS_HIREDIS_LIBS ${HIREDIS_LIB})
  105. if(REDIS_PLUS_PLUS_USE_TLS)
  106. find_library(HIREDIS_TLS_LIB hiredis_ssl)
  107. list(APPEND REDIS_PLUS_PLUS_HIREDIS_LIBS ${HIREDIS_TLS_LIB})
  108. endif()
  109. endif()
  110. # Build static library
  111. option(REDIS_PLUS_PLUS_BUILD_STATIC "Build static library" ON)
  112. message(STATUS "redis-plus-plus build static library: ${REDIS_PLUS_PLUS_BUILD_STATIC}")
  113. if(REDIS_PLUS_PLUS_BUILD_STATIC)
  114. set(STATIC_LIB redis++_static)
  115. add_library(${STATIC_LIB} STATIC ${REDIS_PLUS_PLUS_SOURCES})
  116. add_library(redis++::${STATIC_LIB} ALIAS ${STATIC_LIB})
  117. list(APPEND REDIS_PLUS_PLUS_TARGETS ${STATIC_LIB})
  118. target_include_directories(${STATIC_LIB} PUBLIC
  119. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${REDIS_PLUS_PLUS_SOURCE_DIR}>
  120. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${TLS_SUB_DIR}>
  121. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${CXX_UTILS_DIR}>
  122. $<INSTALL_INTERFACE:include>)
  123. if(hiredis_FOUND)
  124. target_link_libraries(${STATIC_LIB} PUBLIC ${REDIS_PLUS_PLUS_HIREDIS_LIBS})
  125. else()
  126. target_include_directories(${STATIC_LIB} PUBLIC $<BUILD_INTERFACE:${HIREDIS_HEADER}>)
  127. endif()
  128. if(REDIS_PLUS_PLUS_BUILD_ASYNC)
  129. target_include_directories(${STATIC_LIB} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${REDIS_PLUS_PLUS_ASYNC_FUTURE_HEADER}>)
  130. target_include_directories(${STATIC_LIB} PUBLIC $<BUILD_INTERFACE:${REDIS_PLUS_PLUS_ASYNC_LIB_HEADER}>)
  131. if(REDIS_PLUS_PLUS_ASYNC_FUTURE STREQUAL "boost")
  132. target_include_directories(${STATIC_LIB} SYSTEM PUBLIC $<BUILD_INTERFACE:${Boost_INCLUDE_DIR}>)
  133. endif()
  134. endif()
  135. if (WIN32)
  136. target_compile_definitions(${STATIC_LIB} PRIVATE NOMINMAX)
  137. set_target_properties(${STATIC_LIB} PROPERTIES CXX_STANDARD ${REDIS_PLUS_PLUS_CXX_STANDARD})
  138. set_target_properties(${STATIC_LIB} PROPERTIES OUTPUT_NAME redis++_static)
  139. else()
  140. target_compile_options(${STATIC_LIB} PRIVATE "-Wall" "-W" "-Werror")
  141. set_target_properties(${STATIC_LIB} PROPERTIES OUTPUT_NAME redis++)
  142. endif()
  143. set_target_properties(${STATIC_LIB} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
  144. set_target_properties(${STATIC_LIB} PROPERTIES CXX_EXTENSIONS OFF)
  145. option(REDIS_PLUS_PLUS_BUILD_STATIC_WITH_PIC "Build static library with position independent code" ON)
  146. message(STATUS "redis-plus-plus build static library with position independent code: ${REDIS_PLUS_PLUS_BUILD_STATIC_WITH_PIC}")
  147. if(REDIS_PLUS_PLUS_BUILD_STATIC_WITH_PIC)
  148. set_target_properties(${STATIC_LIB} PROPERTIES POSITION_INDEPENDENT_CODE ON)
  149. endif()
  150. endif()
  151. # Build shared library
  152. option(REDIS_PLUS_PLUS_BUILD_SHARED "Build shared library" ON)
  153. message(STATUS "redis-plus-plus build shared library: ${REDIS_PLUS_PLUS_BUILD_SHARED}")
  154. if(REDIS_PLUS_PLUS_BUILD_SHARED)
  155. set(SHARED_LIB redis++)
  156. add_library(${SHARED_LIB} SHARED ${REDIS_PLUS_PLUS_SOURCES})
  157. add_library(redis++::${SHARED_LIB} ALIAS ${SHARED_LIB})
  158. list(APPEND REDIS_PLUS_PLUS_TARGETS ${SHARED_LIB})
  159. target_include_directories(${SHARED_LIB} PUBLIC
  160. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${REDIS_PLUS_PLUS_SOURCE_DIR}>
  161. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${TLS_SUB_DIR}>
  162. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${CXX_UTILS_DIR}>
  163. $<INSTALL_INTERFACE:include>)
  164. if(hiredis_FOUND)
  165. target_link_libraries(${SHARED_LIB} PUBLIC ${REDIS_PLUS_PLUS_HIREDIS_LIBS})
  166. else()
  167. target_include_directories(${SHARED_LIB} PUBLIC $<BUILD_INTERFACE:${HIREDIS_HEADER}>)
  168. target_link_libraries(${SHARED_LIB} PUBLIC ${REDIS_PLUS_PLUS_HIREDIS_LIBS})
  169. endif()
  170. if(REDIS_PLUS_PLUS_BUILD_ASYNC)
  171. target_include_directories(${SHARED_LIB} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${REDIS_PLUS_PLUS_ASYNC_FUTURE_HEADER}>)
  172. target_include_directories(${SHARED_LIB} PUBLIC $<BUILD_INTERFACE:${REDIS_PLUS_PLUS_ASYNC_LIB_HEADER}>)
  173. target_link_libraries(${SHARED_LIB} PUBLIC ${REDIS_PLUS_PLUS_ASYNC_LIB})
  174. if(REDIS_PLUS_PLUS_ASYNC_FUTURE STREQUAL "boost")
  175. target_include_directories(${SHARED_LIB} SYSTEM PUBLIC $<BUILD_INTERFACE:${Boost_INCLUDE_DIR}>)
  176. endif()
  177. endif()
  178. if(WIN32)
  179. target_compile_definitions(${SHARED_LIB} PRIVATE NOMINMAX)
  180. set_target_properties(${SHARED_LIB} PROPERTIES CXX_STANDARD ${REDIS_PLUS_PLUS_CXX_STANDARD})
  181. set_target_properties(${SHARED_LIB} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
  182. else()
  183. target_compile_options(${SHARED_LIB} PRIVATE "-Wall" "-W" "-Werror")
  184. endif()
  185. set_target_properties(${SHARED_LIB} PROPERTIES OUTPUT_NAME redis++)
  186. set_target_properties(${SHARED_LIB} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
  187. set_target_properties(${SHARED_LIB} PROPERTIES CXX_EXTENSIONS OFF)
  188. set_target_properties(${SHARED_LIB} PROPERTIES POSITION_INDEPENDENT_CODE ON)
  189. set_target_properties(${SHARED_LIB} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR})
  190. endif()
  191. option(REDIS_PLUS_PLUS_BUILD_TEST "Build tests for redis++" ON)
  192. message(STATUS "redis-plus-plus build test: ${REDIS_PLUS_PLUS_BUILD_TEST}")
  193. if(REDIS_PLUS_PLUS_BUILD_TEST)
  194. add_subdirectory(test)
  195. endif()
  196. install(TARGETS ${REDIS_PLUS_PLUS_TARGETS}
  197. EXPORT redis++-targets
  198. LIBRARY DESTINATION lib
  199. ARCHIVE DESTINATION lib
  200. RUNTIME DESTINATION bin
  201. INCLUDES DESTINATION include)
  202. set(REDIS_PLUS_PLUS_CMAKE_DESTINATION share/cmake/redis++)
  203. install(EXPORT redis++-targets
  204. FILE redis++-targets.cmake
  205. NAMESPACE redis++::
  206. DESTINATION ${REDIS_PLUS_PLUS_CMAKE_DESTINATION})
  207. # Install headers.
  208. set(HEADER_PATH "sw/redis++")
  209. file(GLOB HEADERS "${REDIS_PLUS_PLUS_SOURCE_DIR}/*.h*" "${TLS_SUB_DIR}/*.h" "${CXX_UTILS_DIR}/*.h" "${REDIS_PLUS_PLUS_ASYNC_FUTURE_HEADER}/*.h")
  210. if(NOT REDIS_PLUS_PLUS_BUILD_ASYNC)
  211. file(GLOB ASYNC_HEADERS "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_*.h" "${REDIS_PLUS_PLUS_SOURCE_DIR}/event_*.h")
  212. list(REMOVE_ITEM HEADERS ${ASYNC_HEADERS})
  213. endif()
  214. install(FILES ${HEADERS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${HEADER_PATH})
  215. include(CMakePackageConfigHelpers)
  216. write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++-config-version.cmake"
  217. VERSION ${PROJECT_VERSION}
  218. COMPATIBILITY AnyNewerVersion)
  219. configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/redis++-config.cmake.in"
  220. "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++-config.cmake"
  221. INSTALL_DESTINATION ${REDIS_PLUS_PLUS_CMAKE_DESTINATION})
  222. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++-config.cmake"
  223. "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++-config-version.cmake"
  224. DESTINATION ${REDIS_PLUS_PLUS_CMAKE_DESTINATION})
  225. export(EXPORT redis++-targets
  226. FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++-targets.cmake"
  227. NAMESPACE redis++::)
  228. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/redis++.pc.in"
  229. "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++.pc" @ONLY)
  230. install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++.pc"
  231. DESTINATION "lib/pkgconfig")
  232. # All the Debian-specific cpack defines.
  233. if(${CMAKE_VERSION} VERSION_GREATER 3.6)
  234. SET(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS "ON")
  235. endif()
  236. if(NOT DEFINED CPACK_DEBIAN_PACKAGE_DEPENDS)
  237. SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libstdc++6, libhiredis-dev")
  238. endif()
  239. SET(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
  240. SET(CPACK_DEBIAN_PACKAGE_VERSION "${REDIS_PLUS_PLUS_VERSION}")
  241. SET(CPACK_DEBIAN_PACKAGE_SOURCE "https://github.com/sewenew/redis-plus-plus")
  242. message(STATUS "Debian package name: ${CPACK_PACKAGE_FILE_NAME}.deb")
  243. # All the common cpack defines.
  244. if(NOT DEFINED CPACK_PACKAGE_NAME)
  245. SET(CPACK_PACKAGE_NAME "libredis++-dev")
  246. endif()
  247. SET(CPACK_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
  248. SET(CPACK_PACKAGE_DESCRIPTION "A pure C++ client for Redis, based on hiredis.")
  249. SET(CPACK_PACKAGE_CONTACT "anonymous")
  250. SET(CPACK_GENERATOR "DEB")
  251. INCLUDE(CPack)