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_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_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 $ 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()