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-01-13 11:25:44 +00:00
set ( CMAKE_MODULE_PATH ${ CMAKE_MODULE_PATH } "${CMAKE_SOURCE_DIR}/cmake/Modules/" )
2017-01-12 12:17:54 +00:00
message ( STATUS "Building for: ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_LIBRARY_ARCHITECTURE}" )
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-10-26 22:27:38 +00:00
if ( APPLE )
2016-12-24 01:03:10 +00:00
set ( PLATFORM_EXTRA_CXX_FLAG "-Dexp10=__exp10" ) # Also needed for libc++
endif ( )
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-07-28 14:14:18 +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
2016-12-01 22:44:59 +00:00
if ( NOT AARCH64 )
set ( MACHINE_FLAGS "-msse4 -mpopcnt" )
endif ( )
2016-02-07 21:58:58 +00:00
2016-12-01 22:44:59 +00:00
set ( COMMON_WARNING_FLAGS "-Wall -Werror" )
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 )
2016-12-01 22:44:59 +00:00
if ( NOT $ENV{ USE_STATIC_LIBRARIES } )
set ( USE_STATIC_LIBRARIES FALSE )
endif ( )
2016-06-27 06:34:10 +00:00
2016-12-12 04:17:16 +00:00
set ( USE_INTERNAL_BOOST_LIBRARY TRUE CACHE BOOL "Set to FALSE to use system boost library instead of bundled" )
if ( NOT $ENV{ USE_INTERNAL_BOOST_LIBRARY } )
set ( USE_INTERNAL_BOOST_LIBRARY FALSE )
endif ( )
2016-12-17 21:54:30 +00:00
if ( USE_INTERNAL_BOOST_LIBRARY )
add_definitions ( -DBOOST_SYSTEM_NO_DEPRECATED )
endif ( )
2017-01-13 11:25:44 +00:00
option ( USE_INTERNAL_POCO_LIBRARY "Set to FALSE to use system poco library instead of bundled" ON )
option ( USE_INTERNAL_GPERFTOOLS_LIBRARY "Set to FALSE to use system gperftools (tcmalloc) library instead of bundled" ON )
2016-12-09 15:39:50 +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 ( $ENV{ GLIBC_COMPATIBILITY } )
set ( GLIBC_COMPATIBILITY TRUE )
2016-12-01 22:44:59 +00:00
endif ( )
2016-12-09 15:39:50 +00:00
option ( ENABLE_LIBTCMALLOC "Set to TRUE to enable libtcmalloc." ON )
2016-12-01 22:44:59 +00:00
if ( NOT $ENV{ ENABLE_LIBTCMALLOC } )
set ( ENABLE_LIBTCMALLOC FALSE )
endif ( )
2016-12-09 15:39:50 +00:00
option ( DEBUG_LIBTCMALLOC "Set to TRUE to use debug version of libtcmalloc." OFF )
2016-12-01 22:44:59 +00:00
if ( $ENV{ DEBUG_LIBTCMALLOC } )
2016-12-12 15:23:21 +00:00
set ( DEBUG_LIBTCMALLOC TRUE )
2016-12-01 22:44:59 +00:00
endif ( )
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 ( )
2016-12-01 22:44:59 +00:00
set ( CMAKE_BUILD_COLOR_MAKEFILE ON )
2017-01-17 14:03:37 +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} ${MACHINE_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}" )
set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${COMPILER_FLAGS}" )
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${COMPILER_FLAGS} -O3" )
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${COMPILER_FLAGS} -O0 -g3 -ggdb3 -fno-inline" )
2016-07-28 14:14:18 +00:00
2017-01-17 14:03:37 +00:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS} -fno-omit-frame-pointer ${COMMON_WARNING_FLAGS} ${MACHINE_FLAGS} ${GLIBC_COMPATIBILITY_COMPILE_FLAGS}" )
set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${COMPILER_FLAGS}" )
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} ${COMPILER_FLAGS} -O3" )
set ( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${COMPILER_FLAGS} -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-16 16:29:11 +00:00
if ( USE_STATIC_LIBRARIES AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -no-pie" )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -no-pie" )
2017-01-13 20:11:21 +00:00
endif ( )
2017-01-17 14:03:37 +00:00
2016-12-08 06:34:16 +00:00
# -fuse-ld=gold - fix linkage for gcc-5.4, gcc-6.1
2016-12-01 22:44:59 +00:00
# See more in http://stackoverflow.com/questions/37603238/fsanitize-not-using-gold-linker-in-gcc-6-1
2017-01-17 14:03:37 +00:00
set ( CMAKE_CXX_FLAGS_ASAN "${CMAKE_CXX_FLAGS_ASAN} ${COMPILER_FLAGS} -O3 -g -fsanitize=address -fno-omit-frame-pointer -fuse-ld=gold" )
set ( CMAKE_CXX_FLAGS_UBSAN "${CMAKE_CXX_FLAGS_UBSAN} ${COMPILER_FLAGS} -O3 -g -fsanitize=undefined -fno-omit-frame-pointer" )
set ( CMAKE_C_FLAGS_ASAN "${CMAKE_C_FLAGS_ASAN} ${COMPILER_FLAGS} -O3 -g -fsanitize=address -fno-omit-frame-pointer -fuse-ld=gold" )
set ( CMAKE_C_FLAGS_UBSAN "${CMAKE_C_FLAGS_UBSAN} ${COMPILER_FLAGS} -O3 -g -fsanitize=undefined -fno-omit-frame-pointer" )
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" )
2016-12-06 13:46:21 +00:00
include ( cmake/add_check.cmake )
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 ( )
2016-12-06 13:42:53 +00:00
include ( cmake/find_openssl.cmake )
include ( cmake/find_icu4c.cmake )
2016-12-06 13:35:28 +00:00
include ( cmake/find_boost.cmake )
2017-01-13 11:25:44 +00:00
include ( cmake/find_poco.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-13 11:25:44 +00:00
if ( ENABLE_LIBTCMALLOC )
include ( cmake/find_gperftools.cmake )
endif ( )
2016-11-29 22:36:32 +00:00
2016-02-07 21:58:58 +00:00
add_subdirectory ( contrib )
add_subdirectory ( libs )
add_subdirectory ( utils )
add_subdirectory ( dbms )
2016-06-26 04:17:49 +00:00
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-16 16:29:11 +00:00
message ( STATUS "C_FLAGS = ${CMAKE_C_FLAGS}" )
message ( STATUS "CXX_FLAGS = ${CMAKE_CXX_FLAGS}" )
message ( STATUS "LINK_FLAGS = ${CMAKE_EXE_LINKER_FLAGS}" )
2016-12-06 18:04:10 +00:00
include ( cmake/print_include_directories.cmake )