blob: d662718720d3cdb73e516c7122541ff7ae1da13c [file] [log] [blame]
include(CheckSymbolExists)
include(CheckCXXSourceCompiles)
file(GLOB SOURCES *.cpp *.hpp)
if(APPLE)
list(REMOVE_ITEM SOURCES ${CASS_SRC_DIR}/get_time-unix.cpp ${CASS_SRC_DIR}/get_time-win.cpp)
elseif(UNIX)
list(REMOVE_ITEM SOURCES ${CASS_SRC_DIR}/get_time-mac.cpp ${CASS_SRC_DIR}/get_time-win.cpp)
elseif(WIN32)
list(REMOVE_ITEM SOURCES ${CASS_SRC_DIR}/get_time-mac.cpp ${CASS_SRC_DIR}/get_time-unix.cpp)
endif()
if(CASS_USE_OPENSSL)
list(APPEND SOURCES ssl/ssl_openssl_impl.cpp ssl/ring_buffer_bio.cpp)
else()
list(APPEND SOURCES ssl/ssl_no_impl.cpp)
endif()
if(CASS_USE_KERBEROS)
list(APPEND INCLUDE_DIRS gssapi)
list(APPEND SOURCES gssapi/dse_auth_gssapi.cpp gssapi/dse_auth_gssapi.hpp)
endif()
# Determine atomic library to include
if(CASS_USE_BOOST_ATOMIC)
list(APPEND SOURCES atomic/atomic_boost.hpp)
elseif(CASS_USE_STD_ATOMIC)
list(APPEND SOURCES atomic/atomic_std.hpp)
else()
list(APPEND SOURCES atomic/atomic_intrinsics.hpp)
if(WIN32)
list(APPEND SOURCES atomic/atomic_intrinsics_msvc.hpp)
else()
list(APPEND SOURCES atomic/atomic_intrinsics_gcc.hpp)
endif()
endif()
add_subdirectory(third_party/curl)
add_subdirectory(third_party/hdr_histogram)
add_subdirectory(third_party/http-parser)
add_subdirectory(third_party/minizip)
add_subdirectory(third_party/sparsehash)
list(APPEND INCLUDE_DIRS
third_party/curl
third_party/hdr_histogram
third_party/http-parser
third_party/minizip
third_party/mt19937_64
third_party/rapidjson/rapidjson
third_party/sparsehash/src)
list(APPEND INCLUDE_DIRS ${CASS_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
#------------------------------
# Compiler flags
#------------------------------
# Ensure Windows platform is supported
if(WIN32)
if(CMAKE_SYSTEM_VERSION GREATER 5.2 OR
CMAKE_SYSTEM_VERSION EQUAL 5.2)
add_definitions(-D_WIN32_WINNT=0x502)
else()
string(REPLACE "." "" WINDOWS_VERSION ${CMAKE_SYSTEM_VERSION})
string(REGEX REPLACE "([0-9])" "0\\1" WINDOWS_VERSION ${WINDOWS_VERSION})
message(FATAL_ERROR "Unable to build driver: Unsupported Windows platform 0x${WINDOWS_VERSION}")
endif()
endif()
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wconversion -Wno-sign-conversion -Wno-shorten-64-to-32 -Wno-undefined-var-template -Werror")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-implicit-int-float-conversion")
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") # To many superfluous warnings generated with GCC when using -Wconversion (see: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=40752)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
endif()
#------------------------------
# Build configured header
#------------------------------
# Determine random availability
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
check_symbol_exists(GRND_NONBLOCK "linux/random.h" HAVE_GETRANDOM)
if(CASS_USE_TIMERFD)
check_symbol_exists(timerfd_create "sys/timerfd.h" HAVE_TIMERFD)
endif()
else()
check_symbol_exists(arc4random_buf "stdlib.h" HAVE_ARC4RANDOM)
endif()
# Determine if sigpipe is available
check_symbol_exists(SO_NOSIGPIPE "sys/socket.h;sys/types.h" HAVE_NOSIGPIPE)
check_symbol_exists(sigtimedwait "signal.h" HAVE_SIGTIMEDWAIT)
if (NOT WIN32 AND NOT HAVE_NOSIGPIPE AND NOT HAVE_SIGTIMEDWAIT)
message(WARNING "Unable to handle SIGPIPE on your platform")
endif()
# Determine if hash is in the tr1 namespace
string(REPLACE "::" ";" HASH_NAMESPACE_LIST ${HASH_NAMESPACE})
foreach(NAMESPACE ${HASH_NAMESPACE_LIST})
if(NAMESPACE STREQUAL "tr1")
set(HASH_IN_TR1 1)
endif()
endforeach()
# Check for GCC compiler builtins
if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
check_cxx_source_compiles("int main() { return __builtin_bswap32(42); }" HAVE_BUILTIN_BSWAP32)
check_cxx_source_compiles("int main() { return __builtin_bswap64(42); }" HAVE_BUILTIN_BSWAP64)
endif()
set(HAVE_BOOST_ATOMIC ${CASS_USE_BOOST_ATOMIC})
set(HAVE_STD_ATOMIC ${CASS_USE_STD_ATOMIC})
set(HAVE_KERBEROS ${CASS_USE_KERBEROS})
set(HAVE_OPENSSL ${CASS_USE_OPENSSL})
set(HAVE_ZLIB ${CASS_USE_ZLIB})
# Generate the driver_config.hpp file
configure_file(
${CASS_ROOT_DIR}/driver_config.hpp.in
${CMAKE_CURRENT_SOURCE_DIR}/driver_config.hpp)
#------------------------------
# Targets
#------------------------------
if(CASS_BUILD_SHARED)
add_library(cassandra SHARED
${SOURCES}
$<TARGET_OBJECTS:curl_hostcheck>
$<TARGET_OBJECTS:hdr_histogram>
$<TARGET_OBJECTS:http-parser>
$<TARGET_OBJECTS:minizip>)
target_link_libraries(cassandra ${CASS_LIBS})
target_include_directories(cassandra PRIVATE ${INCLUDE_DIRS} ${CASS_INCLUDES})
set_target_properties(cassandra PROPERTIES OUTPUT_NAME cassandra)
set_target_properties(cassandra PROPERTIES VERSION ${PROJECT_VERSION_STRING} SOVERSION ${PROJECT_VERSION_MAJOR})
set_target_properties(cassandra PROPERTIES
COMPILE_PDB_NAME "cassandra"
COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
set_target_properties(cassandra PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set_target_properties(cassandra PROPERTIES FOLDER "Driver")
target_compile_definitions(cassandra PRIVATE CASS_BUILDING)
if(CASS_USE_BOOST_ATOMIC AND BOOST_LIBRARY_NAME)
add_dependencies(cassandra ${BOOST_LIBRARY_NAME})
endif()
if(LIBUV_LIBRARY_NAME)
add_dependencies(cassandra ${LIBUV_LIBRARY_NAME})
endif()
if(OPENSSL_LIBRARY_NAME)
add_dependencies(cassandra ${OPENSSL_LIBRARY_NAME})
endif()
if(ZLIB_LIBRARY_NAME)
add_dependencies(cassandra ${ZLIB_LIBRARY_NAME})
endif()
endif()
if(CASS_BUILD_STATIC)
add_library(cassandra_static STATIC
${SOURCES}
$<TARGET_OBJECTS:curl_hostcheck_static>
$<TARGET_OBJECTS:hdr_histogram_static>
$<TARGET_OBJECTS:http-parser_static>
$<TARGET_OBJECTS:minizip_static>)
target_link_libraries(cassandra_static ${CASS_LIBS})
target_include_directories(cassandra_static PRIVATE ${INCLUDE_DIRS} ${CASS_INCLUDES})
set_target_properties(cassandra_static PROPERTIES OUTPUT_NAME cassandra_static)
set_target_properties(cassandra_static PROPERTIES VERSION ${PROJECT_VERSION_STRING} SOVERSION ${PROJECT_VERSION_MAJOR})
set_target_properties(cassandra_static PROPERTIES
COMPILE_PDB_NAME "cassandra_static"
COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
set_target_properties(cassandra_static PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set_target_properties(cassandra_static PROPERTIES FOLDER "Driver")
target_compile_definitions(cassandra_static PRIVATE CASS_STATIC)
if(CASS_USE_BOOST_ATOMIC AND BOOST_LIBRARY_NAME)
add_dependencies(cassandra_static ${BOOST_LIBRARY_NAME})
endif()
if(LIBUV_LIBRARY_NAME)
add_dependencies(cassandra_static ${LIBUV_LIBRARY_NAME})
endif()
if(OPENSSL_LIBRARY_NAME)
add_dependencies(cassandra_static ${OPENSSL_LIBRARY_NAME})
endif()
if(ZLIB_LIBRARY_NAME)
add_dependencies(cassandra_static ${ZLIB_LIBRARY_NAME})
endif()
endif()
#-------------------------------------
# Installation
#-------------------------------------
# Determine if the library directory needs to be determined
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
if ("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" AND ("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr" OR
"${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr/local"))
if(EXISTS "/etc/debian_version")
set (CMAKE_INSTALL_LIBDIR "lib/${CMAKE_LIBRARY_ARCHITECTURE}")
elseif(EXISTS "/etc/redhat-release" OR EXISTS "/etc/fedora-release" OR
EXISTS "/etc/slackware-version" OR EXISTS "/etc/gentoo-release")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set (CMAKE_INSTALL_LIBDIR "lib64")
else()
set (CMAKE_INSTALL_LIBDIR "lib")
endif()
else()
set (CMAKE_INSTALL_LIBDIR "lib")
endif()
else()
set (CMAKE_INSTALL_LIBDIR "lib")
endif()
endif()
# Create a binary directory executable and DLLs (windows only)
set(INSTALL_DLL_EXE_DIR "bin") # Determine the header install dir
if (CASS_INSTALL_HEADER_IN_SUBDIR)
if (CASS_INSTALL_HEADER_SUBDIR_NAME)
# User-specified include sub-dir
set(INSTALL_HEADER_DIR "include/${CASS_INSTALL_HEADER_SUBDIR_NAME}")
else()
# Default subdir location is 'include/cassandra'
set(INSTALL_HEADER_DIR "include/cassandra")
endif()
else()
# Default header install location is 'include'
set(INSTALL_HEADER_DIR "include")
endif()
if(CASS_INSTALL_PKG_CONFIG)
if(NOT WIN32)
find_package(PkgConfig)
if(PKG_CONFIG_FOUND)
set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(includedir ${CMAKE_INSTALL_PREFIX}/${INSTALL_HEADER_DIR})
set(version ${PROJECT_VERSION_STRING})
endif()
endif()
endif()
# Determine if the header should be installed
if(CASS_INSTALL_HEADER)
file(GLOB CASS_API_HEADER_FILES ${CASS_INCLUDE_DIR}/*.h)
install(FILES ${CASS_API_HEADER_FILES} DESTINATION ${INSTALL_HEADER_DIR})
endif()
# Install the dynamic/shared library
if(CASS_BUILD_SHARED)
install(TARGETS cassandra
RUNTIME DESTINATION ${INSTALL_DLL_EXE_DIR} # for dll/executable/pdb files
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # for shared library
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) # for static library
if(CASS_INSTALL_PKG_CONFIG)
if(NOT WIN32)
if(PKG_CONFIG_FOUND)
configure_file("${PROJECT_SOURCE_DIR}/packaging/cassandra.pc.in" "cassandra.pc" @ONLY)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cassandra.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
endif()
endif()
endif()
if(WIN32)
install(FILES $<TARGET_PDB_FILE:cassandra>
DESTINATION "${INSTALL_DLL_EXE_DIR}"
OPTIONAL)
endif()
endif()
if(CASS_BUILD_STATIC)
install(TARGETS cassandra_static
RUNTIME DESTINATION ${INSTALL_DLL_EXE_DIR} # for dll/executable/pdb files
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # for shared library
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) # for static library
if(CASS_INSTALL_PKG_CONFIG)
if(NOT WIN32)
if(PKG_CONFIG_FOUND)
configure_file("${PROJECT_SOURCE_DIR}/packaging/cassandra_static.pc.in" "cassandra_static.pc" @ONLY)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cassandra_static.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
endif()
endif()
endif()
endif()
#-------------------
# Uninstall target
#-------------------
configure_file(
"${CASS_ROOT_DIR}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
# FIXME
# Determine if all GNU extensions should be enabled
#if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE")
#endif()