123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- cmake_minimum_required(VERSION 3.1)
- set(REDIS_PLUS_PLUS_VERSION "1.3.3")
- message(STATUS "redis-plus-plus version: ${REDIS_PLUS_PLUS_VERSION}")
- project(redis++ LANGUAGES CXX VERSION ${REDIS_PLUS_PLUS_VERSION})
- set(REDIS_PLUS_PLUS_DEFAULT_BUILD_TYPE "Release")
- if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
- set(CMAKE_BUILD_TYPE ${REDIS_PLUS_PLUS_DEFAULT_BUILD_TYPE} CACHE STRING "Set build type" FORCE)
- set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel")
- endif()
- message(STATUS "redis-plus-plus build type: ${CMAKE_BUILD_TYPE}")
- set(REDIS_PLUS_PLUS_DEFAULT_CXX_STANDARD 17)
- if(NOT REDIS_PLUS_PLUS_CXX_STANDARD)
- set(REDIS_PLUS_PLUS_CXX_STANDARD ${REDIS_PLUS_PLUS_DEFAULT_CXX_STANDARD} CACHE STRING "Set CXX standard" FORCE)
- set_property(CACHE REDIS_PLUS_PLUS_CXX_STANDARD PROPERTY STRINGS "11" "14" "17" "20")
- endif()
- message(STATUS "redis-plus-plus build with CXX standard: c++${REDIS_PLUS_PLUS_CXX_STANDARD}")
- if(NOT WIN32)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++${REDIS_PLUS_PLUS_CXX_STANDARD}")
- else()
- if(MSVC)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++${REDIS_PLUS_PLUS_CXX_STANDARD}")
- else()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++${REDIS_PLUS_PLUS_CXX_STANDARD}")
- endif()
- endif()
- if(REDIS_PLUS_PLUS_BUILD_ASYNC)
- if(REDIS_PLUS_PLUS_BUILD_ASYNC STREQUAL "libuv")
- message(STATUS "redis-plus-plus build async interface with libuv")
- # libuv dependency
- find_path(REDIS_PLUS_PLUS_ASYNC_LIB_HEADER NAMES uv.h)
- find_library(REDIS_PLUS_PLUS_ASYNC_LIB uv)
- else()
- message(FATAL_ERROR "invalid REDIS_PLUS_PLUS_BUILD_ASYNC")
- endif()
- endif()
- set(REDIS_PLUS_PLUS_SOURCE_DIR src/sw/redis++)
- set(REDIS_PLUS_PLUS_SOURCES
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/command.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/command_options.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/connection.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/connection_pool.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/crc16.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/errors.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/pipeline.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/redis.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/redis_cluster.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/reply.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/sentinel.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/shards.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/shards_pool.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/subscriber.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/transaction.cpp"
- )
- if(REDIS_PLUS_PLUS_BUILD_ASYNC)
- list(APPEND REDIS_PLUS_PLUS_SOURCES
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_connection.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_connection_pool.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_redis.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/event_loop.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_sentinel.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_redis_cluster.cpp"
- "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_shards_pool.cpp"
- )
- if(NOT REDIS_PLUS_PLUS_ASYNC_FUTURE)
- set(REDIS_PLUS_PLUS_ASYNC_FUTURE "std")
- endif()
- if(REDIS_PLUS_PLUS_ASYNC_FUTURE STREQUAL "std")
- set(REDIS_PLUS_PLUS_ASYNC_FUTURE_HEADER "${REDIS_PLUS_PLUS_SOURCE_DIR}/future/std")
- elseif(REDIS_PLUS_PLUS_ASYNC_FUTURE STREQUAL "boost")
- set(REDIS_PLUS_PLUS_ASYNC_FUTURE_HEADER "${REDIS_PLUS_PLUS_SOURCE_DIR}/future/boost")
- find_package(Boost REQUIRED COMPONENTS system thread)
- else()
- message(FATAL_ERROR "invalid REDIS_PLUS_PLUS_ASYNC_FUTURE")
- endif()
- endif()
- # cxx utils
- if(REDIS_PLUS_PLUS_CXX_STANDARD LESS 17)
- set(CXX_UTILS_DIR "${REDIS_PLUS_PLUS_SOURCE_DIR}/cxx11")
- else()
- set(CXX_UTILS_DIR "${REDIS_PLUS_PLUS_SOURCE_DIR}/cxx17")
- endif()
- # TLS support
- option(REDIS_PLUS_PLUS_USE_TLS "Build with TLS support" OFF)
- message(STATUS "redis-plus-plus TLS support: ${REDIS_PLUS_PLUS_USE_TLS}")
- if(REDIS_PLUS_PLUS_USE_TLS)
- set(TLS_SUB_DIR "${REDIS_PLUS_PLUS_SOURCE_DIR}/tls")
- list(APPEND REDIS_PLUS_PLUS_SOURCES "${TLS_SUB_DIR}/tls.cpp")
- set(REDIS_PLUS_PLUS_DEPENDS "hiredis,hiredis_ssl")
- else()
- set(TLS_SUB_DIR "${REDIS_PLUS_PLUS_SOURCE_DIR}/no_tls")
- set(REDIS_PLUS_PLUS_DEPENDS "hiredis")
- endif()
- # hiredis dependency
- find_package(hiredis QUIET)
- if(hiredis_FOUND)
- list(APPEND REDIS_PLUS_PLUS_HIREDIS_LIBS hiredis::hiredis)
- if(REDIS_PLUS_PLUS_USE_TLS)
- find_package(hiredis_ssl REQUIRED)
- list(APPEND REDIS_PLUS_PLUS_HIREDIS_LIBS hiredis::hiredis_ssl)
- endif()
- else()
- find_path(HIREDIS_HEADER hiredis)
- find_library(HIREDIS_LIB hiredis)
- list(APPEND REDIS_PLUS_PLUS_HIREDIS_LIBS ${HIREDIS_LIB})
- if(REDIS_PLUS_PLUS_USE_TLS)
- find_library(HIREDIS_TLS_LIB hiredis_ssl)
- list(APPEND REDIS_PLUS_PLUS_HIREDIS_LIBS ${HIREDIS_TLS_LIB})
- endif()
- endif()
- # Build static library
- option(REDIS_PLUS_PLUS_BUILD_STATIC "Build static library" ON)
- message(STATUS "redis-plus-plus build static library: ${REDIS_PLUS_PLUS_BUILD_STATIC}")
- if(REDIS_PLUS_PLUS_BUILD_STATIC)
- set(STATIC_LIB redis++_static)
- add_library(${STATIC_LIB} STATIC ${REDIS_PLUS_PLUS_SOURCES})
- add_library(redis++::${STATIC_LIB} ALIAS ${STATIC_LIB})
- list(APPEND REDIS_PLUS_PLUS_TARGETS ${STATIC_LIB})
- target_include_directories(${STATIC_LIB} PUBLIC
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${REDIS_PLUS_PLUS_SOURCE_DIR}>
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${TLS_SUB_DIR}>
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${CXX_UTILS_DIR}>
- $<INSTALL_INTERFACE:include>)
- if(hiredis_FOUND)
- target_link_libraries(${STATIC_LIB} PUBLIC ${REDIS_PLUS_PLUS_HIREDIS_LIBS})
- else()
- target_include_directories(${STATIC_LIB} PUBLIC $<BUILD_INTERFACE:${HIREDIS_HEADER}>)
- endif()
- if(REDIS_PLUS_PLUS_BUILD_ASYNC)
- target_include_directories(${STATIC_LIB} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${REDIS_PLUS_PLUS_ASYNC_FUTURE_HEADER}>)
- target_include_directories(${STATIC_LIB} PUBLIC $<BUILD_INTERFACE:${REDIS_PLUS_PLUS_ASYNC_LIB_HEADER}>)
- if(REDIS_PLUS_PLUS_ASYNC_FUTURE STREQUAL "boost")
- target_include_directories(${STATIC_LIB} SYSTEM PUBLIC $<BUILD_INTERFACE:${Boost_INCLUDE_DIR}>)
- endif()
- endif()
- if (WIN32)
- target_compile_definitions(${STATIC_LIB} PRIVATE NOMINMAX)
- set_target_properties(${STATIC_LIB} PROPERTIES CXX_STANDARD ${REDIS_PLUS_PLUS_CXX_STANDARD})
- set_target_properties(${STATIC_LIB} PROPERTIES OUTPUT_NAME redis++_static)
- else()
- target_compile_options(${STATIC_LIB} PRIVATE "-Wall" "-W" "-Werror")
- set_target_properties(${STATIC_LIB} PROPERTIES OUTPUT_NAME redis++)
- endif()
- set_target_properties(${STATIC_LIB} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
- set_target_properties(${STATIC_LIB} PROPERTIES CXX_EXTENSIONS OFF)
- option(REDIS_PLUS_PLUS_BUILD_STATIC_WITH_PIC "Build static library with position independent code" ON)
- message(STATUS "redis-plus-plus build static library with position independent code: ${REDIS_PLUS_PLUS_BUILD_STATIC_WITH_PIC}")
- if(REDIS_PLUS_PLUS_BUILD_STATIC_WITH_PIC)
- set_target_properties(${STATIC_LIB} PROPERTIES POSITION_INDEPENDENT_CODE ON)
- endif()
- endif()
- # Build shared library
- option(REDIS_PLUS_PLUS_BUILD_SHARED "Build shared library" ON)
- message(STATUS "redis-plus-plus build shared library: ${REDIS_PLUS_PLUS_BUILD_SHARED}")
- if(REDIS_PLUS_PLUS_BUILD_SHARED)
- set(SHARED_LIB redis++)
- add_library(${SHARED_LIB} SHARED ${REDIS_PLUS_PLUS_SOURCES})
- add_library(redis++::${SHARED_LIB} ALIAS ${SHARED_LIB})
-
- list(APPEND REDIS_PLUS_PLUS_TARGETS ${SHARED_LIB})
- target_include_directories(${SHARED_LIB} PUBLIC
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${REDIS_PLUS_PLUS_SOURCE_DIR}>
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${TLS_SUB_DIR}>
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${CXX_UTILS_DIR}>
- $<INSTALL_INTERFACE:include>)
- if(hiredis_FOUND)
- target_link_libraries(${SHARED_LIB} PUBLIC ${REDIS_PLUS_PLUS_HIREDIS_LIBS})
- else()
- target_include_directories(${SHARED_LIB} PUBLIC $<BUILD_INTERFACE:${HIREDIS_HEADER}>)
- target_link_libraries(${SHARED_LIB} PUBLIC ${REDIS_PLUS_PLUS_HIREDIS_LIBS})
- endif()
- if(REDIS_PLUS_PLUS_BUILD_ASYNC)
- target_include_directories(${SHARED_LIB} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${REDIS_PLUS_PLUS_ASYNC_FUTURE_HEADER}>)
- target_include_directories(${SHARED_LIB} PUBLIC $<BUILD_INTERFACE:${REDIS_PLUS_PLUS_ASYNC_LIB_HEADER}>)
- target_link_libraries(${SHARED_LIB} PUBLIC ${REDIS_PLUS_PLUS_ASYNC_LIB})
- if(REDIS_PLUS_PLUS_ASYNC_FUTURE STREQUAL "boost")
- target_include_directories(${SHARED_LIB} SYSTEM PUBLIC $<BUILD_INTERFACE:${Boost_INCLUDE_DIR}>)
- endif()
- endif()
- if(WIN32)
- target_compile_definitions(${SHARED_LIB} PRIVATE NOMINMAX)
- set_target_properties(${SHARED_LIB} PROPERTIES CXX_STANDARD ${REDIS_PLUS_PLUS_CXX_STANDARD})
- set_target_properties(${SHARED_LIB} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
- else()
- target_compile_options(${SHARED_LIB} PRIVATE "-Wall" "-W" "-Werror")
- endif()
- set_target_properties(${SHARED_LIB} PROPERTIES OUTPUT_NAME redis++)
- set_target_properties(${SHARED_LIB} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
- set_target_properties(${SHARED_LIB} PROPERTIES CXX_EXTENSIONS OFF)
- set_target_properties(${SHARED_LIB} PROPERTIES POSITION_INDEPENDENT_CODE ON)
- set_target_properties(${SHARED_LIB} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR})
- endif()
- option(REDIS_PLUS_PLUS_BUILD_TEST "Build tests for redis++" ON)
- message(STATUS "redis-plus-plus build test: ${REDIS_PLUS_PLUS_BUILD_TEST}")
- if(REDIS_PLUS_PLUS_BUILD_TEST)
- add_subdirectory(test)
- endif()
- install(TARGETS ${REDIS_PLUS_PLUS_TARGETS}
- EXPORT redis++-targets
- LIBRARY DESTINATION lib
- ARCHIVE DESTINATION lib
- RUNTIME DESTINATION bin
- INCLUDES DESTINATION include)
- set(REDIS_PLUS_PLUS_CMAKE_DESTINATION share/cmake/redis++)
- install(EXPORT redis++-targets
- FILE redis++-targets.cmake
- NAMESPACE redis++::
- DESTINATION ${REDIS_PLUS_PLUS_CMAKE_DESTINATION})
- # Install headers.
- set(HEADER_PATH "sw/redis++")
- file(GLOB HEADERS "${REDIS_PLUS_PLUS_SOURCE_DIR}/*.h*" "${TLS_SUB_DIR}/*.h" "${CXX_UTILS_DIR}/*.h" "${REDIS_PLUS_PLUS_ASYNC_FUTURE_HEADER}/*.h")
- if(NOT REDIS_PLUS_PLUS_BUILD_ASYNC)
- file(GLOB ASYNC_HEADERS "${REDIS_PLUS_PLUS_SOURCE_DIR}/async_*.h" "${REDIS_PLUS_PLUS_SOURCE_DIR}/event_*.h")
- list(REMOVE_ITEM HEADERS ${ASYNC_HEADERS})
- endif()
- install(FILES ${HEADERS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${HEADER_PATH})
- include(CMakePackageConfigHelpers)
- write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++-config-version.cmake"
- VERSION ${PROJECT_VERSION}
- COMPATIBILITY AnyNewerVersion)
- configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/redis++-config.cmake.in"
- "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++-config.cmake"
- INSTALL_DESTINATION ${REDIS_PLUS_PLUS_CMAKE_DESTINATION})
- install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++-config.cmake"
- "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++-config-version.cmake"
- DESTINATION ${REDIS_PLUS_PLUS_CMAKE_DESTINATION})
- export(EXPORT redis++-targets
- FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++-targets.cmake"
- NAMESPACE redis++::)
- configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/redis++.pc.in"
- "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++.pc" @ONLY)
- install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/redis++.pc"
- DESTINATION "lib/pkgconfig")
- # All the Debian-specific cpack defines.
- if(${CMAKE_VERSION} VERSION_GREATER 3.6)
- SET(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS "ON")
- endif()
- if(NOT DEFINED CPACK_DEBIAN_PACKAGE_DEPENDS)
- SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libstdc++6, libhiredis-dev")
- endif()
- SET(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
- SET(CPACK_DEBIAN_PACKAGE_VERSION "${REDIS_PLUS_PLUS_VERSION}")
- SET(CPACK_DEBIAN_PACKAGE_SOURCE "https://github.com/sewenew/redis-plus-plus")
- message(STATUS "Debian package name: ${CPACK_PACKAGE_FILE_NAME}.deb")
- # All the common cpack defines.
- if(NOT DEFINED CPACK_PACKAGE_NAME)
- SET(CPACK_PACKAGE_NAME "libredis++-dev")
- endif()
- SET(CPACK_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
- SET(CPACK_PACKAGE_DESCRIPTION "A pure C++ client for Redis, based on hiredis.")
- SET(CPACK_PACKAGE_CONTACT "anonymous")
- SET(CPACK_GENERATOR "DEB")
- INCLUDE(CPack)
|