blob: 3281751bd51ab9fc3ec14746c2cb55f7876ed283 [file] [log] [blame]
cmake_minimum_required(VERSION 3.10)
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()