2016-05-22 13:09:06 +00:00
project ( ClickHouse )
2016-12-01 22:44:59 +00:00
cmake_minimum_required ( VERSION 2.6 )
2016-02-07 21:58:58 +00:00
2017-02-06 15:15:19 +00:00
set ( CMAKE_MODULE_PATH ${ CMAKE_MODULE_PATH } "${ClickHouse_SOURCE_DIR}/cmake/Modules/" )
2017-01-13 11:25:44 +00:00
2016-12-24 01:03:10 +00:00
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
2016-12-01 22:44:59 +00:00
# Require at least gcc 5
2016-12-06 16:51:34 +00:00
if ( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5 AND NOT CMAKE_VERSION VERSION_LESS 2.8.9 )
2016-12-01 22:44:59 +00:00
message ( FATAL_ERROR "GCC version must be at least 5! For example, if GCC 5 is available under gcc-5, g++-5 names, do the following: export CC=gcc-5 CXX=g++-5; rm -rf CMakeCache.txt CMakeFiles; and re run cmake or ./release." )
endif ( )
2016-12-24 01:03:10 +00:00
elseif ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
2016-12-01 22:44:59 +00:00
# Require at least clang 3.8
if ( CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.8 )
message ( FATAL_ERROR "Clang version must be at least 3.8!" )
endif ( )
else ( )
message ( WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang 3.8+ and GCC 5+." )
endif ( )
2016-05-22 22:41:03 +00:00
2016-12-24 01:03:10 +00:00
if ( CMAKE_SYSTEM MATCHES "FreeBSD" )
set ( PLATFORM_EXTRA_CXX_FLAG "-DCLOCK_MONOTONIC_COARSE=CLOCK_MONOTONIC_FAST" )
2016-12-01 22:44:59 +00:00
endif ( )
2016-05-27 20:18:34 +00:00
2016-12-06 16:51:34 +00:00
cmake_policy ( SET CMP0014 OLD ) # Ignore warning about CMakeLists.txt in each directory
cmake_policy ( SET CMP0012 NEW ) # Don't dereference TRUE and FALSE
2016-02-07 21:58:58 +00:00
2016-12-01 22:44:59 +00:00
if ( NOT CMAKE_BUILD_TYPE )
message ( STATUS "CMAKE_BUILD_TYPE is not set, set to default = RELWITHDEBINFO" )
set ( CMAKE_BUILD_TYPE "RELWITHDEBINFO" )
endif ( )
message ( STATUS "CMAKE_BUILD_TYPE: " ${ CMAKE_BUILD_TYPE } )
2016-02-07 21:58:58 +00:00
2016-07-28 14:14:18 +00:00
# ASan - build type with address sanitizer
# UBSan - build type with undefined behaviour sanitizer
2016-08-23 14:08:47 +00:00
# TSan is not supported due to false positive errors in libstdc++ and necessity to rebuild libstdc++ with TSan
2016-12-01 22:44:59 +00:00
set ( CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel;ASan;UBSan" CACHE STRING "" FORCE )
2016-02-07 21:58:58 +00:00
2016-12-01 22:44:59 +00:00
if ( CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)" )
set ( AARCH64 1 )
endif ( )
2016-02-07 21:58:58 +00:00
2017-01-19 19:32:40 +00:00
set ( COMMON_WARNING_FLAGS "-Wall" ) # -Werror is also added inside directories with our own code.
2016-12-12 04:17:16 +00:00
set ( CXX_WARNING_FLAGS "-Wnon-virtual-dtor" )
2016-06-27 06:34:10 +00:00
2016-12-12 05:42:18 +00:00
set ( CXX11_ABI "ENABLE" CACHE STRING "Use C++11 ABI: DEFAULT, ENABLE, DISABLE" )
2016-12-09 15:39:50 +00:00
option ( TEST_COVERAGE "Enables flags for test coverage" OFF )
option ( ENABLE_TESTS "Enables tests" ON )
2016-06-27 06:34:10 +00:00
2016-12-09 15:39:50 +00:00
option ( USE_STATIC_LIBRARIES "Set to FALSE to use shared libraries" ON )
2017-01-27 20:00:02 +00:00
if ( USE_STATIC_LIBRARIES )
2017-01-30 17:11:43 +00:00
list ( REVERSE CMAKE_FIND_LIBRARY_SUFFIXES )
2016-12-01 22:44:59 +00:00
endif ( )
2016-06-27 06:34:10 +00:00
2017-01-18 12:41:47 +00:00
option ( GLIBC_COMPATIBILITY "Set to TRUE to enable compatibility with older glibc libraries. Note that it is not compatible with ASan." OFF )
2016-06-27 06:34:10 +00:00
if ( GLIBC_COMPATIBILITY )
2016-12-01 22:44:59 +00:00
set ( GLIBC_COMPATIBILITY_COMPILE_FLAGS "-include ${ClickHouse_SOURCE_DIR}/libs/libcommon/include/common/glibc_compatibility.h" )
set ( GLIBC_COMPATIBILITY_LINK_FLAGS "-Wl,--wrap=memcpy" )
endif ( )
2016-06-27 06:34:10 +00:00
2016-12-24 01:03:10 +00:00
if ( CXX11_ABI STREQUAL ENABLE )
2016-12-08 06:34:16 +00:00
set ( CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=1" )
2016-12-24 01:03:10 +00:00
elseif ( CXX11_ABI STREQUAL DISABLE )
2016-12-08 06:34:16 +00:00
set ( CXX11_ABI_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=0" )
else ( )
set ( CXX11_ABI_FLAGS "" )
2016-12-01 22:44:59 +00:00
endif ( )
2016-06-27 06:34:10 +00:00
2017-01-17 14:03:37 +00:00
set ( COMPILER_FLAGS "${COMPILER_FLAGS} ${CXX11_ABI_FLAGS}" )
option ( PIPE "-pipe compiler option [less /tmp usage, more ram usage]" ON )
if ( PIPE )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -pipe" )
endif ( )
2017-01-27 19:55:33 +00:00
include ( cmake/test_cpu.cmake )
option ( ARCHNATIVE "Enable -march=native compiler flag" OFF )
if ( ARCHNATIVE )
set ( COMPILER_FLAGS "${COMPILER_FLAGS} -march=native" )
endif ( )
2016-12-01 22:44:59 +00:00
set ( CMAKE_BUILD_COLOR_MAKEFILE ON )
2017-01-27 19:55:33 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS} -std=gnu++1y ${PLATFORM_EXTRA_CXX_FLAG} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${CXX_WARNING_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}" )
2017-01-25 22:24:36 +00:00
#set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3" )
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g3 -ggdb3 -fno-inline" )
2016-07-28 14:14:18 +00:00
2017-01-27 19:55:33 +00:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}" )
2017-01-25 22:24:36 +00:00
#set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3" )
set ( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g3 -ggdb3 -fno-inline" )
2016-08-25 14:58:01 +00:00
2016-12-24 01:03:10 +00:00
if ( NOT APPLE AND NOT ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_SYSTEM MATCHES "FreeBSD" ) )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++" )
endif ( )
2016-10-26 22:27:38 +00:00
if ( NOT APPLE )
2016-12-24 01:03:10 +00:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GLIBC_COMPATIBILITY_LINK_FLAGS} ${CXX11_ABI_FLAGS}" )
2016-12-06 16:51:34 +00:00
endif ( )
2016-02-07 21:58:58 +00:00
2017-01-30 13:40:04 +00:00
include ( cmake/test_compiler.cmake )
if ( USE_STATIC_LIBRARIES AND HAVE_NO_PIE )
2017-01-30 21:09:11 +00:00
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG_NO_PIE}" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAG_NO_PIE}" )
2017-01-13 20:11:21 +00:00
endif ( )
2017-02-08 18:53:00 +00:00
if ( NOT USE_STATIC_LIBRARIES )
2017-02-13 13:59:34 +00:00
set ( CMAKE_POSITION_INDEPENDENT_CODE ON )
2017-02-08 18:53:00 +00:00
endif ( )
2017-01-18 12:41:47 +00:00
set ( SAN_FLAGS "-O3 -g -fno-omit-frame-pointer" )
set ( CMAKE_CXX_FLAGS_ASAN "${CMAKE_CXX_FLAGS_ASAN} ${SAN_FLAGS} -fsanitize=address" )
set ( CMAKE_C_FLAGS_ASAN "${CMAKE_C_FLAGS_ASAN} ${SAN_FLAGS} -fsanitize=address" )
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
# -fuse-ld=gold - fix linkage for gcc-5.4, gcc-6.1
# See more in http://stackoverflow.com/questions/37603238/fsanitize-not-using-gold-linker-in-gcc-6-1
set ( CMAKE_CXX_FLAGS_ASAN "${CMAKE_CXX_FLAGS_ASAN} -fuse-ld=gold" )
set ( CMAKE_C_FLAGS_ASAN "${CMAKE_C_FLAGS_ASAN} -fuse-ld=gold" )
endif ( )
set ( CMAKE_CXX_FLAGS_UBSAN "${CMAKE_CXX_FLAGS_UBSAN} ${SAN_FLAGS} -fsanitize=undefined" )
set ( CMAKE_C_FLAGS_UBSAN "${CMAKE_C_FLAGS_UBSAN} ${SAN_FLAGS} -fsanitize=undefined" )
set ( CMAKE_CXX_FLAGS_MSAN "${CMAKE_CXX_FLAGS_MSAN} ${SAN_FLAGS} -fsanitize=memory" )
set ( CMAKE_C_FLAGS_MSAN "${CMAKE_C_FLAGS_MSAN} ${SAN_FLAGS} -fsanitize=memory" )
set ( CMAKE_CXX_FLAGS_TSAN "${CMAKE_CXX_FLAGS_TSAN} ${SAN_FLAGS} -fsanitize=thread" )
set ( CMAKE_C_FLAGS_TSAN "${CMAKE_C_FLAGS_TSAN} ${SAN_FLAGS} -fsanitize=thread" )
2016-12-01 22:44:59 +00:00
# Flags for test coverage
if ( TEST_COVERAGE )
2017-01-17 14:03:37 +00:00
set ( CMAKE_CXX_FLAGS_DEBUG "${COMPILER_FLAGS} -O0 -g -fprofile-arcs -ftest-coverage -fPIC -DIS_DEBUG" )
2016-12-01 22:44:59 +00:00
endif ( TEST_COVERAGE )
# Run tests with "make check"
if ( ENABLE_TESTS )
message ( STATUS "Tests are enabled" )
2017-02-09 15:35:58 +00:00
if ( TARGET check )
message ( STATUS "Target check already exists" )
else ( )
include ( cmake/add_check.cmake )
endif ( )
2016-12-01 22:44:59 +00:00
endif ( ENABLE_TESTS )
# Installation prefix
2016-12-24 01:03:10 +00:00
if ( NOT CMAKE_SYSTEM MATCHES "FreeBSD" )
set ( CMAKE_INSTALL_PREFIX /usr )
2017-01-12 13:51:30 +00:00
set ( CLICKHOUSE_ETC_DIR /etc )
else ( )
set ( CLICKHOUSE_ETC_DIR ${ CMAKE_INSTALL_PREFIX } /etc )
2016-12-24 01:03:10 +00:00
endif ( )
2017-02-28 23:49:04 +00:00
option ( UNBUNDLED "Try find all libraries in system (if fail - use bundled from contrib/)" OFF )
if ( UNBUNDLED )
set ( NOT_UNBUNDLED 0 )
else ( )
set ( NOT_UNBUNDLED 1 )
endif ( )
message ( STATUS "Building for: ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_LIBRARY_ARCHITECTURE} ; USE_STATIC_LIBRARIES=${USE_STATIC_LIBRARIES} UNBUNDLED=${UNBUNDLED}" )
2016-12-06 13:42:53 +00:00
include ( cmake/find_openssl.cmake )
2017-01-25 18:19:15 +00:00
include ( cmake/find_icu4c.cmake )
2016-12-06 13:35:28 +00:00
include ( cmake/find_boost.cmake )
2017-03-17 13:04:17 +00:00
# zlib before poco
2017-02-07 21:28:13 +00:00
include ( cmake/find_zlib.cmake )
2017-02-28 23:49:04 +00:00
include ( cmake/find_zstd.cmake )
2017-01-13 11:25:44 +00:00
include ( cmake/find_poco.cmake )
2017-02-28 23:49:04 +00:00
include ( cmake/find_lz4.cmake )
include ( cmake/find_sparsehash.cmake )
2016-12-06 13:42:53 +00:00
include ( cmake/find_libtool.cmake )
2016-12-06 18:04:10 +00:00
include ( cmake/find_rt.cmake )
2017-01-25 18:19:15 +00:00
include ( cmake/find_readline_edit.cmake )
2017-02-28 23:49:04 +00:00
include ( cmake/find_zookeeper.cmake )
include ( cmake/find_double-conversion.cmake )
include ( cmake/find_re2.cmake )
2017-03-16 15:04:05 +00:00
include ( libs/libcommon/cmake/find_gperftools.cmake )
include ( libs/libcommon/cmake/find_jemalloc.cmake )
2016-11-29 22:36:32 +00:00
2017-02-13 13:59:34 +00:00
set ( FULL_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}" )
set ( FULL_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}" )
2017-01-25 22:24:36 +00:00
message ( STATUS "C_FLAGS = ${FULL_C_FLAGS}" )
message ( STATUS "CXX_FLAGS = ${FULL_CXX_FLAGS}" )
message ( STATUS "LINK_FLAGS = ${CMAKE_EXE_LINKER_FLAGS}" )
2017-01-16 19:47:11 +00:00
# Directory for Yandex specific files
set ( CLICKHOUSE_PRIVATE_DIR ${ ClickHouse_SOURCE_DIR } /private/ )
2016-12-01 22:44:59 +00:00
if ( EXISTS ${ CLICKHOUSE_PRIVATE_DIR } )
2017-01-16 19:47:11 +00:00
add_subdirectory ( ${ CLICKHOUSE_PRIVATE_DIR } )
2016-12-01 22:44:59 +00:00
endif ( )
2016-06-27 08:13:54 +00:00
2017-01-18 14:03:30 +00:00
add_subdirectory ( contrib )
add_subdirectory ( libs )
add_subdirectory ( utils )
add_subdirectory ( dbms )
2016-12-06 18:04:10 +00:00
include ( cmake/print_include_directories.cmake )