cmake_minimum_required(VERSION 2.8.12) project(cassandra C CXX) set(CASS_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(CASS_SRC_DIR "${CASS_ROOT_DIR}/src") set(CASS_INCLUDE_DIR "${CASS_ROOT_DIR}/include") # Ensure functions/modules are available list(APPEND CMAKE_MODULE_PATH ${CASS_ROOT_DIR}/cmake) set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) set_property(GLOBAL PROPERTY USE_FOLDERS ON) #--------------- # Policies #--------------- if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() if (POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() #--------------- # Options #--------------- option(CASS_BUILD_EXAMPLES "Build examples" OFF) option(CASS_BUILD_INTEGRATION_TESTS "Build integration tests" OFF) option(CASS_BUILD_SHARED "Build shared library" ON) option(CASS_BUILD_STATIC "Build static library" OFF) option(CASS_BUILD_TESTS "Build tests" OFF) option(CASS_BUILD_UNIT_TESTS "Build unit tests" OFF) option(CASS_DEBUG_CUSTOM_ALLOC "Debug custom allocator" OFF) option(CASS_INSTALL_HEADER "Install header file" ON) option(CASS_INSTALL_HEADER_IN_SUBDIR "Install header file under 'include/cassandra'" OFF) option(CASS_INSTALL_PKG_CONFIG "Install pkg-config file(s)" ON) option(CASS_MULTICORE_COMPILATION "Enable multicore compilation" ON) option(CASS_USE_BOOST_ATOMIC "Use Boost atomics library" OFF) option(CASS_USE_KERBEROS "Use Kerberos" OFF) option(CASS_USE_LIBSSH2 "Use libssh2 for integration tests" OFF) option(CASS_USE_OPENSSL "Use OpenSSL" ON) option(CASS_USE_STATIC_LIBS "Link static libraries when building executables" OFF) option(CASS_USE_STD_ATOMIC "Use C++11 atomics library" OFF) option(CASS_USE_ZLIB "Use zlib" ON) option(CASS_USE_TIMERFD "Use timerfd (Linux only)" ON) # Handle testing dependencies if(CASS_BUILD_TESTS) # Enable integration and unit tests set(CASS_BUILD_INTEGRATION_TESTS ON) set(CASS_BUILD_UNIT_TESTS ON) endif() if(CASS_BUILD_INTEGRATION_TESTS OR CASS_BUILD_UNIT_TESTS) set(CASS_USE_OPENSSL ON) # Required for tests set(CASS_USE_KERBEROS ON) # Required for tests endif() # Determine which driver target should be used as a dependency set(PROJECT_LIB_NAME_TARGET cassandra) if(CASS_USE_STATIC_LIBS OR (WIN32 AND (CASS_BUILD_INTEGRATION_TESTS OR CASS_BUILD_UNIT_TESTS))) set(CASS_USE_STATIC_LIBS ON) # Not all driver internals are exported for test executable (e.g. CASS_EXPORT) set(CASS_BUILD_STATIC ON) set(PROJECT_LIB_NAME_TARGET cassandra_static) endif() # Ensure the driver is configured to build if(NOT CASS_BUILD_SHARED AND NOT CASS_BUILD_STATIC) message(FATAL_ERROR "Driver is not Configured to Build: Ensure shared and/or static library is enabled") endif() if(CASS_DEBUG_CUSTOM_ALLOC AND CASS_USE_STATIC_LIBS) message(WARNING "Debugging the custom allocator while static linking the library can cause your application to fail") endif() #------------------------ # Dependencies #------------------------ include(Dependencies) include(ClangFormat) #------------------------ # Project Version #------------------------ file(STRINGS "${CASS_INCLUDE_DIR}/cassandra.h" _VERSION_PARTS REGEX "^#define[ \t]+CASS_VERSION_(MAJOR|MINOR|PATCH|SUFFIX)[ \t]+([0-9]+|\"([^\"]+)\")$") foreach(part MAJOR MINOR PATCH SUFFIX) string(REGEX MATCH "CASS_VERSION_${part}[ \t]+([0-9]+|\"([^\"]+)\")" PROJECT_VERSION_${part} ${_VERSION_PARTS}) # Extract version numbers if (PROJECT_VERSION_${part}) string(REGEX REPLACE "CASS_VERSION_${part}[ \t]+([0-9]+|\"([^\"]+)\")" "\\1" PROJECT_VERSION_${part} ${PROJECT_VERSION_${part}}) endif() endforeach() # Verify version parts if(NOT PROJECT_VERSION_MAJOR AND NOT PROJECT_VERSION_MINOR) message(FATAL_ERROR "Unable to retrieve driver version from ${version_header_file}") endif() set(PROJECT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}) if(NOT PROJECT_VERSION_PATCH STREQUAL "") set(PROJECT_VERSION_STRING "${PROJECT_VERSION_STRING}.${PROJECT_VERSION_PATCH}") endif() if(NOT PROJECT_VERSION_SUFFIX STREQUAL "") string(REPLACE "\"" "" PROJECT_VERSION_SUFFIX ${PROJECT_VERSION_SUFFIX}) set(PROJECT_VERSION_STRING "${PROJECT_VERSION_STRING}-${PROJECT_VERSION_SUFFIX}") endif() message(STATUS "Driver version: ${PROJECT_VERSION_STRING}") #------------------------ # Determine atomic implementation #------------------------ # Determine if std::atomic can be used for GCC, Clang, or MSVC if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) # Version determined from: https://gcc.gnu.org/wiki/Atomic/GCCMM if(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "4.7" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.7") set(CASS_USE_STD_ATOMIC ON) endif() endif() elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") # Version determined from: http://clang.llvm.org/cxx_status.html # 3.2 includes the full C++11 memory model, but 3.1 had atomic # support. if(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "3.1" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "3.1") set(CASS_USE_STD_ATOMIC ON) endif() elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # Version determined from https://msdn.microsoft.com/en-us/library/hh874894 # VS2012+/VS 11.0+/WindowsSDK v8.0+ if(MSVC_VERSION GREATER 1700 OR MSVC_VERSION EQUAL 1700) set(CASS_USE_STD_ATOMIC ON) endif() endif() if(CASS_USE_BOOST_ATOMIC) message(STATUS "Using boost::atomic implementation for atomic operations") elseif(CASS_USE_STD_ATOMIC) message(STATUS "Using std::atomic implementation for atomic operations") endif() #------------------------ # Top-level compiler flags #------------------------ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") # Enable C++11 support to use std::atomic if(CASS_USE_STD_ATOMIC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif() # OpenSSL is deprecated on later versions of Mac OS X. The long-term solution # is to provide a CommonCryto implementation. if (APPLE) set(CMAKE_MACOSX_RPATH 1) if(CASS_USE_OPENSSL) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") endif() endif() if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") # Clang/Intel specific compiler options # I disabled long-long warning because boost generates about 50 such warnings set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Wextra -Wno-long-long -Wno-unused-parameter") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-variadic-macros -Wno-zero-length-array") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-local-typedef -Wno-unknown-warning-option") else() # GCC specific compiler options # I disabled long-long warning because boost generates about 50 such warnings set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Wextra -Wno-long-long -Wno-unused-parameter -Wno-variadic-macros") if(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "4.8" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.8") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-local-typedefs") endif() endif() elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") add_definitions(/we4800) # Determine if multicore compilation should be enabled if(CASS_MULTICORE_COMPILATION) # Default multicore compilation with effective processors (see https://msdn.microsoft.com/en-us/library/bb385193.aspx) add_definitions("/MP") endif() # On Visual C++ -pedantic flag is not used, # -fPIC is not used on Windows platform (all DLLs are # relocable), -Wall generates about 30k stupid warnings # that can hide useful ones. # Create specific warning disable compiler flags # TODO(mpenick): Fix these "possible loss of data" warnings add_definitions(/wd4244) add_definitions(/wd4267) # Add preprocessor definitions for proper compilation add_definitions(-D_CRT_SECURE_NO_WARNINGS) # Remove warnings for not using safe functions (TODO: Fix codebase to be more secure for Visual Studio) add_definitions(-DNOMINMAX) # Does not define min/max macros add_definitions(-D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING) # Remove warnings for TR1 deprecation (Visual Studio 15 2017); caused by sparsehash else() message(FATAL_ERROR "Unsupported compiler: ${CMAKE_CXX_COMPILER_ID}") endif() #------------------------ # Subdirectories #------------------------ add_subdirectory(src) if(CASS_BUILD_EXAMPLES) add_subdirectory(examples) endif() if(CASS_BUILD_INTEGRATION_TESTS OR CASS_BUILD_UNIT_TESTS) add_subdirectory(tests) endif()